結算

  •   474 
  • 最後發表   winton  2025 八月 27
winton 發文於   2024/02/21

台指期自動交易"依策略執行" 遇結算是否就終止了? 譬如結算前有部位.結算後部位歸零.策略也隨即終止?

如果是這樣.(交易近月標的)"依策略"回測超過一個月的期間.因為有跨月(部位歸零). 結果是否就不準了?系統回測的機制有考慮

結算部位歸零的變數嗎?

排序方式: 標準 | 最新
XS小編 發文於   2024/02/22

 Hello winton,

 

您可以參考 自動交易回測功能 裡的說明,回測報告在計算時會去除換月時的價差影響。

也可以理解為策略會平倉到期月份的商品並在新的月份商品中建立部位。

 

但在即時執行的狀況下策略並不會自動轉倉,所以您必須自行在策略腳本中加上換月轉倉的邏輯,或是手動轉倉完畢後調整策略中 庫存 及 價格 (如果有再度進場的話)。

winton 發文於   2024/02/22

因為交易標的多.做不到手動調整.可否教我上述"策略腳本中加上換月轉倉的邏輯"? 非常感謝!

XS小編 發文於   2024/02/26

Hello winton,

 

舉例來說,您可以使用 DayOfWeek 搭配 WeekOfMonth 來判斷台指期商品是否為當月的第三個星期三。

類似功能的函數有 DaysToExpiration ,不過需注意這種作法無法對應到當因為放假導致到期日變動的狀況。

所以若該月的到期日並不是第三個星期三的話就需要另外處理。

winton 發文於   2024/02/26

 是的.我的意思是當使用上述函數告訴系統因為商品到期.如何讓系統"自動"轉倉?

XS小編 發文於   2024/02/27

 Hello winton,

 

系統不會自動轉倉,要您自行撰寫邏輯判斷今日是否為到期日並交易。

舉例來說:

var: intrabarpersist _switch(0);

if  NthDayofMonth(EncodeDate(year(date),month(date), 1),3,3) = date and currenttime >= 130000 and currenttime < 134500 and filled <> 0 then begin

    _switch = filled;

    setposition(0, market);

    end

else if currenttime >= 150000 and _switch <> 0 then begin

    setposition(_switch, market);

    _switch = 0;

    end;

 

這樣就會在每個月的第三個禮拜三的 130000 以後出場,並在同天下午的150000以後再度進場。

NthDayofMonth(EncodeDate(year(date),month(date), 1),3,3) 會計算出當月的第三個星期三,但須注意並不包含該日為假日的情況。

 

若是運作在即時的狀態下,可以使用 GetSymbolInfo("到期日") 或是 GetQuote("到期日") 來判斷當跟Bar的日期是否為到期日 (不會有假日的情況)。

  • 按讚來自於
  • YYFrankLi0813
winton 發文於   2024/03/01

非常感謝.很有幫助^^

可以小聲問一下.上面_switch=0 的作用/意思是甚麼呀? 又setposition(_switch, market);是把結算平倉的filled總數再建立以便持續原來的策略嗎?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

XS小編 發文於   2024/03/05

 Hello winton,

 

是的,_switch 是在若有庫存要轉倉時,用來保存當下庫存的變數。

所以上面的範例中若在13點以後有庫存的話,會用 _switch 保存庫存數量並出場,在下午15點以後再依 _switch 保存的數值進場並將 _switch 歸0。

Chun Yi 發文於   2025/08/17

想請問XS小編,以目前最近來說,8/20(三)台指結算,在1300時讀取庫存成為「_switch」的數值,有前輩指教說每一個變數都專屬於一個商品,這次得到的是8月期貨合約的變數。1500時為9月期貨的合約,那在此時讀取得到「_switch」嗎?或者說可以把台指近月(TXFF)直接視為一個商品,變數專屬於台指近月,不用擔心這問題。

Chun Yi 發文於   2025/08/17

我另外有想到台指結算前1329記錄一下庫存,假設沒前述問題了話,結算前是多單策略,結算後繼續進場多單;結算前是空單策略,結算後繼續進場空單。因為我怕我會忽略掉不是第三個裡拜三結算的時候,不如每天132900與150100都測試一次,不知道這樣可不可以⋯

If CurrentTime=132900 and Filled=1 Then

Begin

  Value1=Filled

  Value2=FilledRecordCount

  Valie3=FilledRecordBS(Value2)

End;

 

If CurrentTime=150100 and Filled=0 and Value1=1 Then

  Switch(value3)

  Begin

     Case=1:buy(1,market)

     Case=-1:sell(1,market)

  End;

End;

XS小編 發文於   2025/08/19

Hello Chun Yi,

 

是的,台指近月是單一商品,只是底層在換月後會對不同的期貨月份送出委託單。

上面範例中 _switch 要能夠保存庫存數值並在下午使用的必要條件是策略要持續執行。

 

 

不要用 currenttime = 某個時間 這種條件,因為這條件就真的要腳本在該時間點運算才會符合,用區間 (ex. currenttime > 132500 and currenttime < 133000) 會比較適合。

Filled本身就會帶正負(多空),因此並不需要另外用 FilledRecordCount 和 FilledRecordBS。

如果有開啟逐筆洗價的話,視情況變數會需要使用intrabarpersist宣告。

使用 date = GetSymbolInfo("到期日") 來判斷是否為期貨到期日,就可以避免到期日不是禮拜三的狀況。

顯示更多回應 發表回覆
Close