自動交易, 回測日K逐洗, 量夠但市價賣單卻沒出場

  •   507 
  • 最後發表   FrankLi  2024 八月 28
FrankLi 發文於   2024/08/18

如題, 再請小幫手協助追查Bug, 謝謝.

 

測試場景:自動交易回測, 使用指定選股法、日K、逐筆洗價

由於完整程式不方便提供, 我先使用文字和圖片描述,

真有需要我再寫簡易程式驗證, 應該不難重現, 因為發生很多次.

進出場過程(文字描述, 下方有Log圖解):

2022/3/14:盤後選股選中 2480 敦陽科

2022/3/15 09:00:00:SetPosition 市價買進2張

2022/3/15 09:01:00:買進成交2張, 均價94.6

2022/3/22 09:00:00:觸發出場訊號 (進場後5個交易日未達停利損), SetPosition為0, 市價全賣.

2022/3/22 09:01:00:Position順利變為0, 這1分K棒有16張成交, 但我成交0張. 【規則上這根要全部成交】

2022/3/22 13:29:00:一直到收盤最後1分K棒, 成交依然是0張.

2022/3/23 09:00:00:跨日, Position居然自動變回2, 我百分之百確定我沒再次呼叫SetPosition.

因此這筆多單就一直持有沒出場

Log截圖如下:

排序方式: 標準 | 最新
FrankLi 發文於   2024/08/18

自己爬文後, 發現收盤後的確會自動調整部位, 

那就只剩下, 【為何市價賣單沒有成交的問題?】

XS小編 發文於   2024/08/22

Hello FrankLi,

 

小編這邊簡單測試是可以在2022/03/22 090100時正常出場的 (參考附圖)。

麻煩提供您的 簡易腳本 以及 回測設定(截圖或回測報告皆可) 讓相關人員確認。

感謝。

附加文件

FrankLi 發文於   2024/08/24

Hi 小編, 

可能要請你依照我的進出場日期, 再試一下,  

以下附上簡易的 選股腳本、交易腳本、回測報告, 

我試用過這簡易版的能重現.

 

選股腳本:

if date = 20220314 and Symbol = "2480.tw" then ret = 1;

選股中心加入選股腳本:

自動交易中心, 用指定選股法, 並指向這個選股策略.

然後自動交易腳本如下:

{ 日K逐筆洗價 }
input: _I_HoldPeriodLimit(5, "最大持有期間");
input: _I_Position(2, "部位");

{ Debug }
print("--------------------");
var: KDTStr(""), NowDTStr("");
KDTStr = Text(datetostring(date)," ",timetoString(time)); //K棒日期時間
NowDTStr = Text(datetostring(currentDate)," ",timetoString(currentTime)); //電腦日期時間
print(text(KDTStr," (",NowDTStr,")"));
print(text(" Vol=",NumToStr(volume,0)));
print(text(" Position=",numtostr(Position,0),", Filled=",numtostr(Filled,0)));

var: intrabarpersist _EntryDate(0), //預期進場日期
    intrabarpersist _LeaveDate(0);  //預期出場日期 

if GetInfo("TradeMode") = 0 then return;

if Position = 0 and _EntryDate = 0 then begin
    Setposition(_I_Position);

end else if Position > 0 and _LeaveDate = 0 then begin
    if _EntryDate = 0 then begin
        _EntryDate = Date;
        print("●進場");
    end;

    //超過最大持有期間,市價賣出
    if _I_HoldPeriodLimit > 0 and Date[_I_HoldPeriodLimit] >= _EntryDate then begin
        print("●出場, Date[_I_HoldPeriodLimit]=",numtoStr(Date[_I_HoldPeriodLimit],0));
        Setposition(0);
        _LeaveDate = Date;
    end;
end;

自動交易參數, 設定如下圖:

回測日K逐筆洗價的結果,沒出場,Log也是跟前面貼的狀況一樣:

回測報告如附件:

 

FrankLi 發文於   2024/08/24

另外想補充詢問一下, 當使用 "指定選股法" 時,

在我的交易腳本內, 有沒有什麼辦法能得知:

這隻股票在選股中心 "前期盤後" 是否被選中?

 

虎科大許教授 發文於   2024/08/24

你出場時,並非以市價委託,而是按照系統設定的委託價(觸發價減1),以限價委託。2022/3/22,開盤價就是當天的最高價94.30,且一路走低,收在最低價。你的限價委託單因此沒有成交。setposition(0,label:="已達閒置期間")是限價單,而非市價單。要下市價單,應該改成setposition(0,market,label:="已達閒置期間")。

  • 按讚來自於
  • YYFrankLi0813
FrankLi 發文於   2024/08/25

昏倒, 原來是我自己漏了指定價格market, 

(因從另一吃系統設定價的腳本copy過來改, 結果忘了補上價格)

感謝許教授 幫忙找到問題 

XS小編 發文於   2024/08/28

Hello FrankLi,

 

小編不太確定您指的 前期盤後 是什麼意思。

選股皆是用結束的K棒來運算,所以當執行商品設定為選股策略時,當天運算的商品一定會是選股策略用前一日以前的資料篩選出來的商品。

回測時會有些不同,回測期間內有被篩選出來的商品都會用交易腳本運算整個區間,但只有對應篩選出來的日期同時符合進出場條件時才會交易。

 

故在即時的狀況下所有執行中的商品皆為 前期盤後 符合條件的商品,但回測時則要注意可能不是 (但就算不是也不會交易)。

 

若您想問的是有沒有函數可以在交易腳本回測中確認運算的該根K棒是否為前一日選股篩選出來,那麼目前是沒有的。

 

感謝 虎科大許教授 的熱心回覆。

  • 按讚來自於
  • YYFrankLi0813
FrankLi 發文於   2024/08/28

不好意思, 沒表達清楚,

想問的正是你最後猜測的功能,

希望未來也能提供這函式或參數, 

謝謝

 

 

發表回覆
Close