期貨當沖平倉問題

  •   627 
  • 最後發表   iker  2022 八月 10
iker 發文於   2022/07/18

我寫了個小台全日盤的交易策略,並在第一段判斷就設了時間到平倉的判斷:

var: hasPosition(false);

hasPosition = position <> 0 and filled <> 0 and filledAvgPrice > 0;

if hasPosition and (time = 134400 or currentTime = 134400) then begin
    setPosition(0, market);
end;

實際上 13:44:00 卻沒有平倉,導致倉位留到夜盤。

但 13:44:00 的 print 紀錄裡卻有平倉紀錄,不明白為什麼沒有執行:


 

2022/07/18 10:21:00 | 建倉 | 交易方向: 作空 | 操作口數: 1
2022/07/18 13:44:00 | 平倉 | 交易方向: 作空 | 操作口數: 1 | 成本均價: 14637 | 出場均價: 14649 


 

請問台指期全日盤在日盤收盤前平倉的寫法跟一般股票部位平倉寫法不同嗎?如何寫才能確保部位順利平倉呢?

排序方式: 標準 | 最新
蕎伊斯 發文於   2022/07/18

你是使用1分鐘非逐筆對嗎? 若是,這個K棒運作完實際時間是13:45了,已收盤就不會觸發平倉囉

建議非逐筆模式,改成13:43分平倉
或是開逐筆模式,系統就會在13:44 K棒一開K就觸發,但記得訊號進出場判斷要改寫位移上一根的架構[1]

試試看

iker 發文於   2022/07/19

原來如此,我是使用一分鐘非逐筆沒錯,看 print 有出現以為是會生效的,沒想到 print 是不考慮回測時有無開逐筆的情況都會 print 出來,感謝您!

另外想請問 位移上一根的架構 意思是開逐筆的話,假設我希望 close cross over average(close, 20) 時進場,實際應該寫成 close[1] cross over average(close[1], 20) 嗎?

XQ小幫手 發文於   2022/07/19

Hello iker,

 

沒有勾選逐筆洗價 => Bar結束後運算。

勾選逐筆洗價 => 每次洗價時運算。

另外,time的數值是Bar開始的時間,像1分鐘頻率下 134400 代表的是 13:44~13:45 這段時間,所以當Bar運算時已經收盤。

 

您寫的條件沒有錯,不過也可以用更簡單的方式:

condition1 = close cross over average(close, 20);

只要用 condition1[1] 就可以取到上一根Bar的條件判斷結果。

iker 發文於   2022/07/19

感謝小幫手教學

學了一招,只知道 value1 這種可以加 [1] ,沒想到 condtiion 也可以。

iker 發文於   2022/07/19

另外想了解一下 print 的原理為什麼不會因為回測有沒有開逐筆而有不同結果呢?

我的概念裡是 print 是拿來做為驗證回測結果的工具,而我實際上是把 print 寫在條件判斷式裡,這樣如果條件判斷式沒有觸發,理論上 print 也不該印出來才是?

XQ小幫手 發文於   2022/07/27

Hello iker,

 

由於小幫手不太清除您遇到的狀況,所以無法斷言,不過若您將print寫在條件式裡的話,條件沒有觸發就不會印出沒錯。

回測的運作如下:

1分鐘逐筆洗價 => 1分鐘洗價4次,以OHLC當作4次洗價。

其他頻率逐筆洗價 => 以1分鐘Bar模擬逐筆洗價,例如5分鐘就會計算5次。

 

若您的print是寫在上面的hasPosition裡,且使用1分鐘頻率的話,不論是否有用逐筆洗價 time = 134400 這種寫法一定會在134400這根Bar上符合。

您可以測試回測 print(date, time, time = 134400); 在1分鐘逐筆/非逐筆上,會比較容易理解。

iker 發文於   2022/07/27

Hi 小幫手

是這樣的,原本遇到的情況是我跑1分K沒開逐筆,又把出場條件定在 time = 134400,所以等到K棒運作完才判斷,當時商品已經收盤了,所以無法執行平倉,導致預期當沖的部位被留到夜盤。(後來我改成 time = 134300 平倉,就能很確實的在 13:44:00 時觸發平倉。)

但無論上述哪一種情況,我的 log 文件裡都會 print 出平倉的記錄,所以才困惑為什麼「寫在條件判斷式的 print 指令,明明沒有觸發,卻 print 出了平倉記錄

剛想了一下,會不會實際上這裡是有送出平倉指令,只是因為原本寫法造成 13:45:00 整才送出 SetPosition,導致期交所不收單,但 XS 這裡因為實際上有跑到判斷式,所以還是 print 了出來。

請問像是收盤或未開盤時間送單的話,自動交易中心的執行記錄裡,會顯示下單被期交所拒絕嗎?

另外,回測針對商品沒有開盤的情況,請問 XS 這裡有沒有辦法 catch Exception 之類的讓我們在回測時可以 print 出被拒絕收單的原因呢?

XQ小幫手 發文於   2022/08/04

Hello iker,

 

小幫手認為您搞混前後關係了。

發生的順序應該是:

腳本執行 => hasposition 為 true => time 為 134400 => 進入 if 判斷是裡面 => 執行SetPosition (但由於已收盤所以系統不會送出委託) => 執行 print => if 結束 => 腳本執行結束。

不管您是否有送出委託單,if 的條件都是 true,這樣就會執行 if 裡面的指令。

是先 if 條件為 True 所以才執行 if 裡面的 setposition 和 print。

setposition 是否有實際送出委託和print沒有關係。

 

舉個簡單的例子,您可以試試看:

if position = 0 and filled = 0 then begin

    setposition(1, market);

    print(date, time);

    end;

然後用在回測上,您會發現在資料讀取筆數時腳本運算會持續print資料出來,因為該時的 position 與 filled 為0,且 SetPosition 執行後會因為是運算在資料讀取筆數而不是回測區間,所以SetPosition不會送出委託或成交,因此position會一直維持在0。

iker 發文於   2022/08/04

了解,感謝小幫手

那如果我想確定是否有實際送出委託,是只能透過下一個K棒去 print 當時的 Position 判斷嗎?

有什麼方式能分辨不同委託失敗的情況嗎?(例如查詢指定委託的 error code 或 error msg 之類的)

XQ小幫手 發文於   2022/08/10

Hello iker,

 

是的,您可以用position的變化來確認是否有委託。

就小幫手所知,交易函數內沒有相關功能可以查詢委託失敗的情況。

不過上面描述的情況和下出委託後失敗有點差別,因為執行的時候實際上已經收盤,所以自然無法下單。

如果有發生委託錯誤失敗的情況,會顯示在執行紀錄中。

 

發表回覆
Close