期貨結算換倉問題

  •   121 
  • 最後發表   Chun Yi  2025 八月 22
Chun Yi 發文於   2025/08/15

教授與各位前輩們大家好!!!!

 

小弟之前都在做股票,直到最近開始接觸期權商品,像是股票期貨,或者台指期貨。但是我發現無論是股票期貨或台指期貨都會遇到結算日,在結算日後單子就會自動平倉,如果有策略已經下單正在進行,結算日後就要手動補單下去,生活中要注意每個月的結算日期是幾號,哪個裡拜三,我擔心這樣如果上班很忙了話,忙到忘記今天是結算日,晚個一天後再補單,有時距離就被拉開了,因此我想寫一支在結算日能夠自動換倉的程式。

 

我查了XQ函數,GetLastTradeDate,可以取得台指的結算日日期,但是說明裡有個但書寫道,不支援若有假期變更後而更改的結算日(無法對應到當因為放假導致到期日變動的狀況)。我怕我上班太忙而忽略掉市場結算日期變更。

 

後來我想到一個方法,以台指期貨為例,可不可以用13:44時Filled=1,但15:01時Filled=0,因為13:45後就結算掉了,15:01夜盤開盤時就會沒有部位,此時可以補個一單。

 

但是我又遇到另一個問題,就是我的策略可以下多單,也可以下空單,我在找有沒有函數可以在13:44時回傳目前是持有多單還是空單,當知道13:44為多單時,15:01若Fill=0則補一個多單,反之則補一個空單。

 

目前是找到FilledRecordBS這個函數,但是說明裡說是要輸入第幾筆,我若13:44持有部位,想必一定是最近一筆交易,也找到有FilledRecordCount,不知道可不可以Value1= FilledRecordBS(FilledRecordCount)如果可以了話應該就可以解決大部分問題了

 

最後我是用非逐筆洗價,以五分鍾K棒,前面取得時間是1344與1501,非以五分鍾為單位,這樣是可行嗎?因為我想說我只是想當下回傳我握有什麼部位,與5分K棒應該沒有關係吧?原本也想說用1340與1505,但我發現我原本的策略裡面有1505時下單,我怕我的策略會與現在的結算換倉程式起衝突,所以改用1344與1501。

 

不知道教授與各位前輩有沒有更好的方法,以下是想出來的程式草稿

 

If CurrentTime=134400 and Filled=1 Then

Begin

  Value1=FilledRecordBS(FilledRecordCount)

  If CurrentTime=150100 and Filled=0 Then

  Switch(value1)

  Begin

     Case=1:buy(1,market)

     Case=-1:sell(1,market)

  End;

End;

排序方式: 標準 | 最新
虎科大許教授 發文於   2025/08/16

你目前的想法,會有很多狀況,建議用GetSymbolInfo("到期日")判斷當天是否為到期日,若是到期日,則在特定時間下達轉倉指令。下面這篇貼文可參考看看:

https://forum.xq.com.tw/thread/結算-21/

 

Chun Yi 發文於   2025/08/16

這篇我有看過,他是1300出場,會有一筆手續費,我是想放到1345直接給他結算這樣就能省一筆😂

想請教教授,我目前的辦法會發生什麼狀況,謝謝🙏

虎科大許教授 發文於   2025/08/16

若希望自動結算,則重點應該放在結算後當天下午三點如何建立部位。你在134400做判斷,當時已經收盤(133000收盤),除非用自動洗價,否則程式無法執行,亦即無法判斷。另外,就算用自動洗價,能否抓到庫存,可能也是問題(這個我沒試過)。以下週三(8/20)八月份合約最後交易日為例,你在當天133000收盤時,就算可以抓到庫存,且將它賦予變數,但該變數專屬於8月份合約,下午三點的合約是9月份合約,由於各商品的變數是獨立的,所以應該是讀不到該變數數值。雖然你的策略部位可用延續前次執行,在最後交易日當天下午三點判斷近月份合約的庫存,但我估計應該是查不到。理由:雖然都是近月份合約,但新監控的合約(9月份)其實與結算的合約(8月份)不同。自動轉倉這部份,目前看起來行不通。我建議:(1)用上述連結貼文的做法,以_switch記錄庫存(不要結清部位,而留著結算),試試看能否在下午3點建立部位(我猜測這應該行不通)。(2)比較簡單的做法:用GetSymbolInfo("到期日")判斷當天是否為到期日,若是到期日且收盤前有部位,則在收盤前提出警示(以免你太忙錯過了轉倉)。然後在下午1點30分之前或下午3點之後手動進場建立9月份的部位。

Chun Yi 發文於   2025/08/16

1台指期貨在13:45收盤

 

2商品選擇的地方有台指近月(代碼TXFF),若電腦監控TXFF數據,在1345收盤前,TXFF數據的來源是8月合約,在1500開盤後電腦也是監控TXFF的數據,而這個數據是來自於9月的合約,但不管在1345收盤前與1500開盤後,電腦監控回傳的數據都是TXFF,我想這點應該沒問題,否則回測TXFF就沒辦法跨月了。

 

3若擔心1500開盤後仍然會讀取到8月的合約,我想到一個方法,我將我原本的IF判斷條件式分別獨立出來,1344時Filled一次,成為Value1(收盤前回傳的TXFF數據都是8月的)以Value1為橋梁,1501開盤後再Fill一次(夜盤開盤後回傳的TXFF為9月的數據)這次Fill的數值與Value1一起成為條件拚斷,這樣應該沒問題了吧

 

請不吝指教,謝謝🙏

 

If CurrentTime=134400 Tnen

Begin

Value1=Filled

Value2=FillRecordCount

Value3=FilledRecordBS(Value2)

End;

 

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

Begin

Buy(1,market)

Value1=0

Value2=0

Value3=0

End;

 

If CurrentTime=150100 And Filled=0 And Value1=1 and Value3=-1 Then

Begin

Sell(1,market)

Value1=0

Value2=0

Value3=0

End;

虎科大許教授 發文於   2025/08/16

(1)在這篇貼文,我已經講了兩次,最後結算日當天,台指期只交易到13點30分。交易任何商品之前,要先了解商品的交易規則。

(2)雖然近月份的商品代號都是FITXN*1,但結算日當天日盤收盤前,系統交易的FITXN*1是8月份合約,但下午三點交易的FITXN*1是9月份合約。

(3)日盤的value1能否保留給下午三點時判斷,我高度懷疑。商品不同,變數也不相同。也許你可以在8/20用虛擬帳號測試看看。

Chun Yi 發文於   2025/08/17

可是前面文章「_switch」可行了,為什麼這邊的Value1卻不可行?

虎科大許教授 發文於   2025/08/17

以前的貼文,我覺得也是有問題。_switch應該不可行。

Chun Yi 發文於   2025/08/17

現在在出差,筆電放家裡,現在用公司筆電,可能要等9月結算才能測試了。不然我去那篇貼文問問看教授您的看法好了~

虎科大許教授 發文於   2025/08/20

我今天寫個交易腳本測試之後,確認在策略不中斷的情況下,日盤的變數包含position、filled以及_switch都會被保留。你可以執行以下程式,讓程式在最後交易日當天幫你自動轉倉。不過,這裡要注意,由於部位變數被保留下來,例如日盤一口多單去結算,position及filled都是1,下午三點要買1口,需要setposition(2),亦即setposition(position+_switch)。

//監控商品:台指期近月份合約(全日盤)(FITXN*1.TF)
if getinfo("IsRealTime")=0 then return;
var: intraBarPersist _switch(0);
if Date=getsymbolInfo("到期日") then
    if currentTime>=132900 then
        if position<>0 then   _switch = position;
if currenttime >= 150000 and _switch <> 0 then 
    begin
        setposition(position + _switch, market);
        _switch = 0;
    end;

Chun Yi 發文於   2025/08/22

請問getsymbolInfo到期日,如果當月的到期日不是每個月第三個裡拜三了話,也抓得到嘛,謝謝🙏

顯示更多回應 發表回覆
Close