自動交易腳本(XS語法)裡遇到一個問題,想請教兩個具體的技術問題

  •   16 
  • 最後發表   SHOHEI  18 小時前
SHOHEI 發文於   2026/07/30

您好,我在自動交易腳本(XS語法)裡遇到一個問題,想請教兩個技術問題。

問題一,關於 filledAvgPrice 在回測模式下的計算方式。

我在腳本裡用 filledAvgPrice(目前未平倉成本)來設定停損比較基準,大致邏輯是:當 Filled 小於0(持有空單)時,如果 High 大於等於 filledAvgPrice 加上停損點數,或是 Close 大於等於 filledAvgPrice 加上停損點數,就出場。

在即時模擬單測試時,filledAvgPrice 顯示得很正確穩定,每次進場都會對應到當時的真實成交價,例如某次空單進場40115,後續每次都穩定顯示40115。

但同一段程式碼拿去回測,交易次數會從正常的300筆左右暴增到1500筆以上,勝率跟獲利因子都大幅惡化,持倉時間也異常縮短。移除這段改回別的判斷方式後,回測數字就恢復正常。

想請教,filledAvgPrice 這個欄位在回測模式底下,代表的是目前這一筆持倉的平均成本,還是有可能是從回測開始至今、所有累積交易的某種平均值?這兩種模式下,這個欄位的計算邏輯是否不同?

問題二,有沒有語法可以判斷目前是回測模式還是即時連線模式。

我想讓同一份腳本,在回測跟即時模式下,對停損判斷使用不同的邏輯路徑,請問 XS 語法裡有沒有類似判斷目前程式是在跑歷史回測、還是在跑即時盤中資料的函數?

謝謝

排序方式: 標準 | 最新
虎科大許教授 發文於   2026/07/30

(1)回測時,會按照進場價格計算FilledAvgPrice。若有加碼,會計算平均庫存成本。它不會將已經平倉的部位成本列入計算。它只計算目前庫存的平均成本。你可以使用下列交易腳本,在5分鐘頻率下,用隨便一檔股票回測半年。就可看到FilledAvgPrice的變化。

var: intraBarPersist mytime(0);
if mytime<>time then
    begin
        if (position=0 or position=1) and c cross over highest(h[1],3) then 
            begin
                setposition(position+1);
                mytime=time;
            end;
        if position>0 and c cross under lowest(L[1],3) then 
            begin
                setposition(0);
                mytime=time;
            end;        
    end;
print(date, time, position, filledAvgPrice);

(2)可使用GetInfo(“Instance”)判斷。若傳回5,則為自動交易。若傳回6,則為自動交易回測。

SHOHEI 發文於   2026/07/30

謝謝 我跑看看 有問題再請教 感恩

發表回覆
Close