交易腳本持有期出場

  •   591 
  • 最後發表   red  2022 一月 25
red 發文於   2022/01/17

小幫手您好,想問一下我這樣寫哪裡出了問題? 交易腳本回測出場都不會出在三天後的收盤價!

交易腳本,日K策略,條件成立進場空,持有三期後出在收盤價!

variable: K(0);

if position=0 and condition1 then SetPosition(-1);

if position < 0 then begin 

   K=K+1;

   if K>=3 then begin // 思考會不會一進場就出場

          setposition(0, close);

  K=0;

   end;   

end;

排序方式: 標準 | 最新
XQ小幫手 發文於   2022/01/19

Hello red,

 

這是因為在交易腳本中日頻率會強制逐筆洗價。

而變數在同一天內的逐筆洗價中,會一直維持之前的值。

舉例來說,在第一次進場的3天候出場,此時雖然您將K設為0,但下一次逐筆洗價還是在同一根Bar上,所以K還是之前的值3。

您可以使用 IntraBarPersist 來讓腳本記錄每次洗價的變數計算,並修改K+1的條件為換日:

variable: intraBarPersist K(0);

if position=0  then SetPosition(-1);

if getfield("Date", "1") <> getfield("Date", "1")[1] then K += 1;

if position < 0 and K >= 3 then begin 

    setposition(0, getfield("Close", "D")[1]);

    K = 0;

    end;

 

red 發文於   2022/01/20

感謝小幫手,我大致理解,將程式修改如下,大部分比數都正常,但有一點問題:

1. 最後兩筆多持有一天,但我看print log,執行的文字檔是對的(11/23應該就要出場),但是在回測系統中呈現出來是錯的(11/24才出場),導致這筆交易的回測報酬率是錯的,想詢問原因?

2. 在print log中,訊號1是進場觸發成功,但為什麼部位數沒有改變,而是在下一分鐘才改變?

3.另外,想詢問一下在交易腳本中要做以當天收盤價進,隔天一開盤就出,有範例嗎?

settotalbar(5); 

input: 

In_time(132000,"進場時間"),

variable: intraBarPersist K(0);

condition5 = GetField("開盤價","D")<>GetField("漲停價","D"); 

condition6 = GetField("收盤價","D") >= GetField("漲停價","D")*(1-0); 

 

if position=0 and CurrentTime>=In_time and condition5 and condition6 then begin

   SetPosition(1,close);

   K=0;

   Print(file("C:\XXX\XXX\XXX\XXX\test1.log"),"測(訊號1)", "日期",FormatDate("yyyy/MM/dd",Date), "時間",FormatTime("HH:mm:ss",Time), "代碼",symbol, "目前部位: ", position, "成交部位: ", filled, "收: ", C, "進場時間: ", CurrentTime, "漲停價: ", GetField("漲停價","D"), "K: ", K, "日期: ", getfield("Date", "1"), "日期[1]: ", getfield("Date", "1")[1]); 

   

end; 

 

if getfield("Date", "1") <> getfield("Date", "1")[1] then K=K+1;

   Print(file("C:\XXX\XXX\XXX\XXX\test1.log"),"測(訊號2)", "日期",FormatDate("yyyy/MM/dd",Date), "時間",FormatTime("HH:mm:ss",Time), "代碼",symbol, "目前部位: ", position, "成交部位: ", filled, "收: ", C, "進場時間: ", CurrentTime, "漲停價: ", GetField("漲停價","D"), "K: ", K, "日期: ", getfield("Date", "1"), "日期[1]: ", getfield("Date", "1")[1]); 

if position > 0 and K >= 1 then begin 

    setposition(0, getfield("Open", "D"));

       Print(file("C:\XXX\XXX\XXX\XXX\test1.log"),"測(訊號3)", "日期",FormatDate("yyyy/MM/dd",Date), "時間",FormatTime("HH:mm:ss",Time), "代碼",symbol, "目前部位: ", position, "成交部位: ", filled, "收: ", C, "進場時間: ", CurrentTime, "漲停價: ", GetField("漲停價","D"), "K: ", K, "日期: ", getfield("Date", "1"), "日期[1]: ", getfield("Date", "1")[1]); 

    K=0;

end;

附加文件

XQ小幫手 發文於   2022/01/25

 Hello red,

 

1.這是因為最後兩日有延後開盤,導致實際開始時間為09:02。

此時往前取1分鐘Bar會取到 09:01,所以沒有換日,而K也不會增加。

小幫手稍作修改,改用變數紀錄日期,然後換日時K增加。

另外您下單時使用的是限價單,出場時若當日的價格沒有達到可成交的範圍亦不會成交。

您可以改為市價單嘗試。

附上交易腳本供您參考。

 

2.您可以參考setposition的說明裡 Position異動的時機點。

同次腳本執行中,position是不會變化的。

 

3.就小幫手所知,在交易腳本無法做到。

因為目前在13:25以後的集合競價時間內系統不會交易。

且回測時是當根Bar (日頻率逐筆洗價的話會是1分鐘Bar) 運算觸發的話下一個價格進場,所以會是在下根Bar的開盤價進場。

附加文件

發表回覆
Close