小幫手您好,想問一下我這樣寫哪裡出了問題? 交易腳本回測出場都不會出在三天後的收盤價!
交易腳本,日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;
小幫手您好,想問一下我這樣寫哪裡出了問題? 交易腳本回測出場都不會出在三天後的收盤價!
交易腳本,日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;
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;
感謝小幫手,我大致理解,將程式修改如下,大部分比數都正常,但有一點問題:
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;
Hello red,
1.這是因為最後兩日有延後開盤,導致實際開始時間為09:02。
此時往前取1分鐘Bar會取到 09:01,所以沒有換日,而K也不會增加。
小幫手稍作修改,改用變數紀錄日期,然後換日時K增加。
另外您下單時使用的是限價單,出場時若當日的價格沒有達到可成交的範圍亦不會成交。
您可以改為市價單嘗試。
附上交易腳本供您參考。
2.您可以參考setposition的說明裡 Position異動的時機點。
同次腳本執行中,position是不會變化的。
3.就小幫手所知,在交易腳本無法做到。
因為目前在13:25以後的集合競價時間內系統不會交易。
且回測時是當根Bar (日頻率逐筆洗價的話會是1分鐘Bar) 運算觸發的話下一個價格進場,所以會是在下根Bar的開盤價進場。
3 評論