2012年7月20日 星期五

Open tomorrow 下的資訊更新時間

這個標題大概是會讓多數讀者直接跳過吧,也許多數人根本都用不到這個東西。不過,我還是會把我在程式交易這條路上碰到的各種狀況在不損害我自己的前提下分享出來。

什麼是 Open tomorrow?簡單講就是把還沒發生的下一根K棒的開盤價,拿來做條件判斷或是價位計算,過去有發表過一篇相關的「Open tomorrow 及Stop 的合併應用」。

結算後的第一天,按照我在策略程式中的設計,應該要在開盤的時候,把昨天參與結算的部位給建回來,理由可參考「系統訊號跨月換倉」。不過,我發現了一點點的問題...


我們來做個實驗,寫一段程式碼如下。從 Print 出來的資訊來看,很明顯在結算日最後一根,marketposition 的資訊是沒有因為 setexitonclose 而"即時"更新的,它還停留在 多單 的狀態,而這是正常或說是我們習慣的,因為 MultiCharts 是必須要等到"換棒"時才會更新資訊的。



接著我要把 Open tomorrow 引進來,程式碼如下。從 Print 的訊息看到,在結算日最後這一根的 marketposition 竟然變成了...零!從這個反應,我假設程式碼裡如果引進了 Open tomorrow 會讓資訊往前提早到K棒的收盤就更新而不是等到換棒的時候。只不過這對我要處理跨月換倉帶來了麻煩~


Open tomorrow 引進會讓資訊的更新從換棒提前到K棒的收盤(我推測的),因此我將不能沿用一般處理系統部位跨月換倉的方式,因為結算日的最後一根都會因為 setexitonclose 而且在收盤就更新資訊而使 marketposition=0,造成無法判斷隔天開盤應該要建立的是多單還是空單,或是...本來就空手。因此,我嘗試著把記錄 marketposition 與部位數量的時間往前移一根,結算日的倒數第二根。程式碼如下。



我取用這個實驗的程式碼是有用意的,因為如果在結算日的最後一根K棒沒有發生交易動作的話,引進 Open tomorrow 其實不會產生困擾只要把要取用來給隔天開盤建倉的資訊從最後一根往前移一根就好了。但是如果就剛好在這一根翻單呢?就像這裡所實驗的例子,本來是多單而剛好在最後一根翻單了呢?

一旦引進 Open tomorrow 的話,取最後一根的資訊會得到真正的即時資訊,讓我無法在結算日隔天延續部位(方向與數量都因 setexitonclose 都是零)。而取用前一根的資訊則會如果就剛巧最後一根K棒有動作的話,造成資訊落後而錯誤!到目前,我還沒想到解決之道。

結論:如果交易策略的程式碼需要引入 Open tomorrow 的話,首先必須知道資訊更新的時間不同。再來,為了兼顧我不要回測報表有灌水的因素,我選擇結算日一樣收盤出場,之後則等待新訊號再進場了。

ps. 你的策略回測有沒有灌水?當期貨近月(連續)圖來到除息旺季