
所以我做一個如何在尾盤完平倉的實證給大家看看,我寫下的程式碼如下,你可以從其中去體會怎麼玩。
===============================
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的部分所觸發的。
接下來在過了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的訊號。
相同的邏輯,請注意一下這張圖,在時間達到091700後,SQ的訊號就跳出來了,如果這畫面沒有做RELOAD的動作的話,會因為SQ的訊號存在,導致ST的訊號不出現,而在RELOAD後則因為SQ訊號的條件不成立而ST的條件成立了,畫面上會出現ST而不是SQ了。
由以上的變化可以得知,BQ、SQ其實都是為了在盤中即時性的出現動作的訊號而使用THIS BAR AT MARKET這樣的DIRTY指令,但是程式的歷時回測,則根本不會出現BQ、SQ,所以在尾盤或是特定時間的買進賣出或是平倉動作的績效不會受到影響,且歷時回測績效則依然可以保持正確。
弄得這樣複雜是為了什麼?很簡單~為了操盤與生活品質要兼顧^^