過去盤中的策略執行我採用 HTS 作為平台,近幾個月,我已經把盤中執行策略的平台轉移到 MultiCharts 上了,把一些策略的程式碼轉移過去其實倒沒有花太多的時間,畢竟 TradeStation / HTS / MultiCharts 的程式語法都可以統稱 TS like,差異性是有的,但不算大。
在 HTS 上如果要在剛進場的當根K棒準確而不亂搞的產生停損或是停利的訊號,只能在一些策略本身真的是很簡單且某些限定的情況才能做得到,要不然就是得使用 This bar 去做,而使用 this bar 的風險,我大膽的判斷對剛任門的新手來說是沒有足夠的能力去駕馭那個風險的,還不如就放棄不要用。 2007年寫下的「期貨交易不靠內線」內所舉的程式碼,漸漸的我在接受提問的過程中,我想我對 HTS 的 USER 真的存在了小小的影響力 XD,只是我發現好多好多人很聰明自己去刪改那個 this bar 運作的模組了,而那是...不可以的,會死人的!
講了一大串卻還沒進入本文的正題,也許是人老了變得"雜唸",也也許是今天的大暴跌讓我在情緒上有一點重拾過去的...興奮>"<。 在 MultiCharts 上要做停損或是停利,程式碼非常的簡單,如下:
setstopcontracts;setstoploss(停損的金額);
這是用固定金額的停損,那我如果要用固定"啪數"(%)來停損呢?本來我以為應該就是很簡單如下這麼做:
Value1= EntryPrice(0)*0.01*pointvalue; //以停損設在進場價的1%為例 setstopcontracts; setstoploss(Value1);
然後我就把這樣的程式碼套進去,結果...進場的當根竟然:不會停損!!哇咧,這是什麼鬼啊?進場就出場,這是要怎麼玩得下去?
無法如所預期的運作的原因其實就在 EntryPrice(0) 的取得時間是在進場K棒的結束,而沒取得的時候...它拿了 0 來當做 EntryPrice。如果你打算使用日線的策略又想做好停損的控制,就會知道這個東西的重要性了。
既然問題出在 EntryPrice 取得的時間無法及時的話,只有走向打開 IntrabarOrderGeneration 一途了,也就是啟動 This bar 模式,但是如果在原始的策略理就直接打開 IOG 的話,恐怕程式的運作又會出現不是我這笨笨小腦袋所想的意外狀況,請參考:我在凱衛討論區提出的 IOG 疑問
為了要在已經發生進場但K棒尚未結束時及時取得 EntryPrice,開啟 IOG 成了必須。但是我不要讓原本的策略開啟 IOG,因此我就只好把進場價百分比停損的這個部分,另外做一個訊號,在這個部分開啟 IOG,而原始的策略則不開,同時避免 MC 在還沒取得 EntryPrice 的時候就拿個零來塞,如下:
[IntrabarOrderGeneration = True];
Input:StopPercent(0.01);
if EntryPrice(0)<>0 then begin
Value1= EntryPrice(0)*StopPercent*PointValue;
setstopcontract;
setstoploss(Value1);
end;
終於,我們得到這樣的效果了!進場的當根可以得到停損的控制,又不會亂搞。
只是,只要圖表上所放的訊號,其中一個有開啟 IOG 的話,回測的時候務必開啟"細部回測",而要細部回測到 Tick 的話,你所擁有的電腦,恐怕就要夠力才不會讓人想哭了 XD