自動交易進出場腳本

  •   80 
  • 最後發表   師哥  3 週前
師哥 發文於   2025/04/19

各位先進大大們,

如果想要在下列的警示語法更改成交易腳本的語法,我有先把警示的語法更改為前一天的語法,因為我想要加進隔天出場的條件,

input:_min_(5,"自訂分鐘頻率");

input:x(3,"連續幾根k棒都是紅k");

input:_number_bar_(51,"開盤後第幾根k");

input:_v_bar(5,"成交量比過去幾根還多2倍");

input:_v_multuplier_(2,"估量量比門檻");

input:exceed_limit(70,"買進特大單金額佔全部的比例");

input:y(5,"比昨天收盤價上漲多少");

 

if barfreq <> "Min" or Barinterval <>_min_ then

 RaiseRuntimeError("請設定頻率為_min_分鐘");

variable:BarNumberOfToday(0); 

if Date <> Date[1] then BarNumberOfToday=1 

else BarNumberOfToday+=1;{記錄今天的Bar數} 

 

value1=q_InSize;//當日內盤量

value2=q_OutSize;//當日外盤量

value3=GetField("買進特大單金額");

value4=GetField("賣出特大單金額");

value5=GetField("RefPrice", "D");

 

if barnumberoftoday=_number_bar_

//今天第幾根的分鐘K,也就是開盤後第幾根

then begin

if trueall(close>close[1],x)

and close>=value5*(y/100)

//連x根K棒都是紅棒

and trueall(close>open,x)

and trueall(volume>(average(volume[1],_v_bar)*2),x)

//成交量是過去_v_bar根量平均量的兩倍以上

and close=highd(0)

//收最高

and GetQuote("估計量") > volume[1]*_v_multuplier_

and value2>value1

and value3*(exceed_limit/100) >= (value3+value4)

then ret=1;

end;

 

如果條件都符合,則:

1. 前一天的收盤價買進一張
2.隔天如果09:15之前,價格<=持有成本*0.98,則賣出一張
3.隔天如果09:15之前,價格>=持有成本*1.05,則賣出一張
4.隔天如果09:15之前,價格<持有成本*1.05,以及價格>=持有成本*1.02,當價格回落至持有成本,則賣出一張(也就是保本)

謝謝

排序方式: 標準 | 最新
虎科大許教授 發文於   2025/04/19

策略執行時,沒有隔天的概念。進場買進一張,可在尾盤用自動洗價方式,送出以漲停價買進的委託。進場則加時間判斷090000至091500之間,若有部位且符合條件停損或停利條件就賣出。

師哥 發文於   2025/04/20

謝謝許教授回復! 許教授我試著根據您的建議,用AI來寫出來,雖然有編譯成功,可是回測卻跑不出東西。

SetTotalBar(500);

 

input: _min_(5, "自訂分鐘頻率");

input: x(3, "連續幾根k棒都是紅k");

input: _number_bar_(51, "開盤後第幾根k");

input: _v_bar(5, "成交量比過去幾根還多2倍");

input: _v_multuplier_(2, "估量量比門檻");

input: exceed_limit(70, "買進特大單金額佔全部的比例");

input: y(5, "比昨天收盤價上漲多少");

 

// 檢查頻率

if barfreq <> "Min" or Barinterval <> _min_ then

 RaiseRuntimeError("請設定頻率為_min_分鐘");

 

// 宣告變數

var: BarNumberOfToday(0);

var: hasPosition(false); // 持有部位標誌

var: i(0);

 

// 計算BarNumberOfToday

if Date <> Date[1] then

 BarNumberOfToday = 1

else

 BarNumberOfToday += 1;

 

// 當日內盤量與外盤量

value1 = q_InSize;

value2 = q_OutSize;

 

// 特大單買賣金額

value3 = GetField("買進特大單金額");

value4 = GetField("賣出特大單金額");

 

// 昨日參考價(日頻率)

value5 = GetField("RefPrice", "D");

 

// 預估量

value6 = GetQuote("估計量");

 

// 買進訊號判斷:當天第_number_bar_根k棒且符合條件

if BarNumberOfToday = _number_bar_ then

begin

 if trueall(close > close[1], x) and

 close >= value5 * (1 + y / 100) and

 trueall(close > open, x) and

 trueall(volume > average(volume[1], _v_bar) * 2, x) and

 close = highd(0) and

 value6 > volume[1] * _v_multuplier_ and

 value2 > value1 and

 value3 * (exceed_limit / 100) >= (value3 + value4) and

 Position = 0 // 未持有部位才能買入

 then

 begin

 // 以昨天收盤價下市價買進一張

 SetPosition(1, market);

 end;

end;

 

// 出場判斷時間(09:00到09:15前)

if Position = 1 and Time >= 90000 and Time < 91500 then

begin

 

 // 停損:價格小於等於成本*0.98

 if close <= FilledAvgPrice * 0.98 then

 begin

 SetPosition(0, market); // 全部賣出停損

 end

 // 停利:價格大於等於成本*1.05

 else if close >= FilledAvgPrice * 1.05 then

 begin

 SetPosition(0, market); // 全部賣出停利

 end

 // 保本出場條件:

 // 價格位於成本*1.02~1.05之間且價格下跌至成本時賣出

 else if close < FilledAvgPrice * 1.05 and close >= FilledAvgPrice * 1.02 then

 begin

 if close < close[1] and close <= FilledAvgPrice then

 begin

 SetPosition(0, market); // 保本賣出

 end;

 end;

 

end;

 

 

師哥 發文於   2025/04/20

另外,我洗價設定是這樣設:

頻率:日
洗價方式: 逐筆洗價+自動洗價
自動洗價時段:自訂時段 13:25~13:30   
洗價間格秒數: 1秒

虎科大許教授 發文於   2025/04/20

你使用好幾個q_的函數,例如q_InSize、q_OutSize、GetQuote("估計量")..,這些報價函數是不能用來回測的。

TM 發文於   2025/04/25

不好意思請問許教授,q_報價函數不能回測,請問要用什麼才可以呢? 剛剛開始學還搞不清楚,比如q_dailyhigh, q_dailyvolume, q_PriceChangeRatio, GetQuote("成交") 該如何改用其他可以回測的呢?

虎科大許教授 發文於   2025/04/25

q_dailyhigh > GetField("最高價","D")

q_dailyvolume -> GetField("Volume", "D") 

q_PriceChangeRatio -> 100*(c/GetField("參考價","D")-1)

GetQuote("成交") -> GetField("收盤價","D")

 

發表回覆
Close