2007年5月7日 星期一

特定時間(收盤)即時訊號與回測兼顧


程式交易小學堂─期貨投機事業的王道
之前要在尾盤做平倉的動作,我們會運用time這個函數,讓他在TIME=134500的時候去發出平倉的訊號。因為time是抓取K棒的時間,而不是真實的時間,所以如果在當天的最後一根K線出現的時候,HTS就會動作,這樣通常就不是在尾盤,比如以5分線來說,134001的時候,134500的K棒就會出現,但是這時候的K線其實距離收盤還有5分鐘,雖然這時候如果要決定平倉是差不多在此時丟單子出去了,這在低時間層次的問題不大,因為134001去丟單子,成交價應該與當天收盤價相去不遠,因為這5分鐘是撮合交易的;但是較高的時間層級就麻煩了,比如30分鐘、60分鐘,最後一根K線出現的時間到收盤的時間起時還有一段,所謂134500的K棒時間一出現就丟單子的話,其實與收盤價常常相差很大。

所以我做一個如何在尾盤完平倉的實證給大家看看,我寫下的程式碼如下,你可以從其中去體會怎麼玩。
===============================
if time = 091500 then
buy ("BT") this bar at close
end if

if q_time >= 091200 and q_time < 091400 then
buy ("BQ") this bar at market
end if

if time = 092000 then
sell ("ST") this bar at close
end if

if q_time >= 091700 and q_time < 091900 then
sell ("SQ") this bar at market
end if
====================================

我故意把運用TIME所觸發的訊號取名為BT與ST,而運用Q_TIME所觸發的訊號取名為BQ及SQ,這樣可以方便在畫面中區別,請你好好對照程式碼與以下的畫面。

首先在畫面上注意真實的時間(藍色方框),這時出現了BQ的訊號,表示這是由Q_TIME的部分所觸發的。
Image Hosted by ImageShack.us

接下來在過了091500後我讓這畫面RELOAD一次,可以見到畫面的訊號變成BT了,為什麼會這樣?因為Q_TIME這個函數只會在畫面上的最後一根K線有時間的提供,其他的K線是沒有的,所以在原本有BQ的K線因為那根的Q_TIME已經不是介於091200與091400之間,所以IF語句就不成立,但是那根原本有BQ訊號的K線因為K線時間=091500,所以產生了BT的訊號出來。並請你注意一下,這張圖中因為真實時間沒有達到091700,所以雖然下一根K線已經出現,但是因為使用Q_TIME這邊的賣出條件尚未成立,所以並不會出現SQ的訊號,然而,K線時間卻是已經符合TIME=092000囉!那為什麼沒有見到ST的訊號呢?因為這部分的賣出指令用的是THIS BAR AT CLOSE,所以他會壓抑到CLOSE的時間到了才會出現ST的訊號。
Image Hosted by ImageShack.us

相同的邏輯,請注意一下這張圖,在時間達到091700後,SQ的訊號就跳出來了,如果這畫面沒有做RELOAD的動作的話,會因為SQ的訊號存在,導致ST的訊號不出現,而在RELOAD後則因為SQ訊號的條件不成立而ST的條件成立了,畫面上會出現ST而不是SQ了。
Image Hosted by ImageShack.us



由以上的變化可以得知,BQ、SQ其實都是為了在盤中即時性的出現動作的訊號而使用THIS BAR AT MARKET這樣的DIRTY指令,但是程式的歷時回測,則根本不會出現BQ、SQ,所以在尾盤或是特定時間的買進賣出或是平倉動作的績效不會受到影響,且歷時回測績效則依然可以保持正確。

弄得這樣複雜是為了什麼?很簡單~為了操盤與生活品質要兼顧^^

熱門文章