關於交易腳本回測時用到 barslast 函式

  •   237 
  • 最後發表   iker  2023 一月 16
iker 發文於   2023/01/12

我有個交易腳本會希望印出出場後一日的情況,所以在換日檢查時用以下寫法:

if date <> date[1] then begin
    ...
    if Position = 0 and Filled = 0 and barlast(Position <> 0) = 1 then Print(xxxxxx)
    ...
end;

但這條加進去之後,使用日頻率回測跑 40 個商品,範圍設置 2018/01/01-2023/01/01,都無法無論正常跑完回測。

試過強制設定 setBarBack 跟 setTotalbar 設長一點(200/500/1000/2000...),最多只能跑不到 3 個商品就掛了,中斷回測看結果,這 3 個商品也都是無觸發。

如果  setBarBack 跟 setTotalbar 設太短,回測又會立即結束,所有商品都執行失敗。

我把 barlast 那行檢查註解掉之後,跑 40 個商品只要 8-15 秒不等,而且原本無觸發的商品也都會正常觸發訊號。由於這支進場訊號的條件所需的計算長度也需要參考 120 天期,setBarback(200) 應該夠用;而實際只需要參考當天的值,所以之前一直使用 setTotalBar(1) 。

想知道為什麼這樣寫會無法正常跑回測呢?

另外問,如果應用 barlast 這種無法預期需要計算多長時間的邏輯 (例如每支標的平倉後,到下次進場再平倉的時間長度不一),該怎麼做才能確保策略能正常運算完畢呢?直接用 setBarBack 設一個超過回測範圍的K棒運算長度嗎?

XQ小幫手 發文於   2023/01/16

Hello iker,

 

小幫手這邊簡單測試沒有發生您的狀況。(參考附圖)

要麻煩您提供 交易腳本、回測設定 (截圖亦可) 以及 XQ Log 來檢驗。

Log資料夾(預設路徑:C:\SysJust\XQLite\LOG)直接壓縮後提供即可。

您可以直接將檔案上傳,如果檔案過大的話也可以保存到雲端後將連結Mail至客服信箱 XQservice@XQ.com.tw 且務必附上 討論文章連結網址(小幫手才能盡早處理)。

 

另外有幾點要注意:

1. barlast(Position <> 0) = 1 其實就跟 position[1] <> 0 雷同,但 barlast(Position <> 0) 會需要大量的運算。

2. position[1] 會是該根Bar最後的狀況,舉例來說若上根Bar進場後又出場的話,position會是0,若是要確認前一天是否有交易,最簡單的方法是用 FilledRecordDate 判斷。

3. 您跑的區間其實算偏長,且自動交易的日頻率會強制洗價(所以每分鐘會計算一次),date <> date[1] 在日頻率下又會一直符合,會導致有大量的運算進而可能造成逾時 (203) 的狀況。

 

附加文件

發表回覆
Close