上一篇文章大概說明了如何在逐筆中運用condition[1]做到收K進場,即時出場,不過,這樣的運用還有些需要注意的細節,將會在本篇文章說明,不過寫的有點複雜,請耐心閱讀,對你的回測一定會有幫助的。
1. 前言
上一篇文章的回測,雖然逐筆回測可以做到收K後進場,但是會發生與非逐筆的進場時間點不一致的問題,甚至發生某些交易只有在逐筆出現或是只有在非逐筆回測出現的狀況。這篇文章就是要來說明這樣的問題是如何發生的,又要如何解決,寫的有點複雜,請耐心閱讀,對你的回測一定會有幫助的。
請記得,本文講的都是收K後進場,就是下一根開盤價進場,非逐筆跟逐筆的程式碼會有差異,不清楚的請看第一篇文章
本文收K進場的寫法,非逐筆用condition,逐筆用condition[1]
2. 成交量影響了進場的時間
延續文章一的策略,進場為9:03的K棒結束之後,所以會是9:04的開盤價進場。
下表比較了逐筆跟非逐筆進場時間的差異,另外我還加上了每分鐘的成交量,並且用橘色色塊標示出進場時間,從下表可以看出,非逐筆都是在9:04進場,但是逐筆確是從9:04到9:06都有出場的,這是何原因造成的呢?

當9:04分,雖然逐筆與非逐筆都判斷可以進場,但是能否進場還需要考量成交量,而且兩者對成交量的要求不同,非逐筆只要有量就可以進場,逐筆則需要有足夠的量才能進場,這句話是什麼意思呢?
就算條件成立了,能否進場由成交量決定
在逐筆回測的時候,最大的成交量為當根bar的1/4,也就是說你想要買或賣出一張,成交量至少要達到四張,才會買進或賣出,如果不足,就會把這些量累積,直到成交量達到4張以上,以上表鼎天為例,成交量從9:04累積,一直到9:06才超過4張,所以進場在9:06分,而普萊德則是在9:05分成交量剛好累積了4張,所以才在9:05進場,有關逐筆成交量說明,可以看XQ的說明
另外,非逐筆如果遇到進場那根bar沒量,就會延後進場,一直等到有量才進場。
2.1 逐筆回測成交量不足延後進場解決方式
逐筆回測時,要進場一張,需要等到成交量超過4倍,才能進場,這樣的方式是否合理,沒有一定的答案,但如果只是一張或張數不多,我會覺得只要有出現成交量,就應該要能進場會合理些,如果想要做到不管成交量多少,都可以進場,在回測上,就需要打開觸發即判斷成交

從回測結果可以看到,有觸發的標的進場時間都是9:04分,這樣就可以確保標的是在第一時間進場,不過這樣的設定不夠嚴謹,需要將一些情況排除。

2.2 觸發即但判斷成交需排除漲跌停股
設定觸發成交,會有個問題就是遇到漲跌停的時候也會進場,如上面交易明細第一筆聯亞,把K線圖找出來後,可以看到9:03已經漲停,9:04想要買到的機會幾乎是沒有的,而這種情況,就需要能夠排除,增加漲停不進場的條件

程式碼如下,在原本的程式碼加入了漲停價的判斷,這樣就可以排除漲停股了
condition1 = time = 090300 ;
if position= 0 and filled = 0 then begin
if condition1[1] and close[1] <> getfield("漲停價", "D") then setposition(1);
end;
if position <> 0 and time >=132000 then setposition(0);
至於程式碼為何不是用condition,而是寫成close[1] <> getfield(“漲停價”, “D”),這又是另一個細節要注意的了,簡單講,用到日資料,如果還是用condition[1],就會變成隔天的漲停價了,這個部分下一篇文章再來仔細說明。
3. 成交量影響了交易次數與標的
成交量除了影響進場的時間外,對於是否能觸發判斷,更是關鍵,直接影響到了交易的次數與標的
3.1 成交量影響是否觸發判斷進場
首先,我們先了解下逐筆與非逐筆觸發判斷時機的差異,非逐筆是在當根K收盤時觸發判斷,而逐筆是在每根bar的第一個tick出現時,觸發判斷上一根K是否符合條件開盤,而這個時候,要觸發判斷的那根K棒是否有量,就很重要了。
觸發判斷的那根K棒是否有量很重要
先看一下下圖,條件為time=090300收K後進場,在非逐筆的設定下,觸發判斷的時間點是當根K棒,就是在9:03分那根K棒結束做判斷,而在逐筆的情況下,則是要等9:04分第一個tick出現,才會觸發做判斷,所以如果要觸發判斷那個沒有量,就不會有進場訊號傳出,即使後面有量也不會成交

我們來看下表的範例,在比對逐筆跟非逐筆回測數據時,發現有的交易只出現在逐筆,有的只出現在非逐筆,列出來後,才找出了交易次數差異的祕密
先看只在逐筆的進場標的,是不是可以發現9:03的成交量都為0,而非逐筆進場標的,則是9:04分的成交量都為0,這個狀況證明了,非要觸發判斷的那根K棒如果成交量為0,就不會進場。
由於逐筆跟非逐筆觸發判斷的K棒是不同的,造成了交易次數跟標的的不同,這在回測上,會發生非常大的落差。如果你是用非逐筆回測,但實單是又用逐筆進出場,可以想見,你的績效會產生多大的差異

3.2 為何會有成交量為0的情況發生
看到這個標題,你的第一個反應應該就是,這還需要討論嗎?不就是成交量少的股票,所以在分K時很容易出現0的狀況,我想要講的當然不是這種,還一種情況就是遇到漲跌停的時候,也很有可能出現分K成交量為0
不過,我想要討論的都不是上面的兩種狀況,我要講的是第三種狀況,緩搓,只要在開盤前一分鐘跟盤中發生可能的成交價漲幅或跌幅會超過3.5%,就會觸發緩搓機制,暫停交易2分鐘,而這個時候就會出現成交量為0的狀況。
而這個情況在開盤以及開盤後幾分鐘內室很容易發生的,如上面表格的華星光,前後都是幾百張成交量,但是9:03確成交量為0,就很有可能是遇到緩搓了。這又該如何解決呢?
3.3 成交量為0,那個不觸發進場較合理
由於成交量影響了逐筆與非逐筆是否觸發,再加上兩者觸發判斷的k棒不同,到底哪一種情況才會較為符合實際呢? 以下的方式為我自己的主觀判定,讀者可以調整成自己覺得合理的方式
我覺得逐筆遇到要觸發判斷時沒量,就沒有進場是不合理的,因為逐筆是要判斷前一根K棒條件是否有成立,不能因為現在沒量,就當做前一根的條件沒有成立,正常情況,如果有成立,遇到沒量,就是等後面有量時進場,而不是像現在就當做不成立,
而非逐筆,遇到觸發判斷時沒量,就沒有進場也是不合理的,因為條件的成立與否,不一定都跟量有關,以本文用的例子,就是時間到9:03進場,如果因為9:03沒量就不進場,這樣是跟實際交易的操作是不同的,想像成是自己操作,有出現了9:03,等收K就應該會單,不會因為沒量就不下單。
3.4 如何解決成交量為0時不觸發進場的狀況
這個問題,在非逐筆時是無解的,不過,好在在逐筆的設定下是可以解決的,只要我們紀錄條件成立那根K棒的編號,就可以解決逐筆遇到成交量為0,不觸發進場的問題。
下面程式碼,用value1紀錄條件成立那根K棒的編號,如果遇到收K後下一根K棒成交量剛好為0,沒有觸發進場,就會等到後面有量時,就會用現在的K棒編號,計算出要往前推算幾根(value2),取得9:03那根K棒是否成立的資訊。
condition1 = time = 090300 ;
if condition1 = true then value1 = currentbar;
//逐筆時採用condition1[1]進場
if position = 0 and filled = 0 then begin
value2 = currentbar-value1;
if value2 > 0 and condition1[value2] and and close[value2] <> getfield("漲停價", "D") then setposition(1);
end;
if position <> 0 and time >=132000 then setposition(0);
另外,增加了value2 > 0的條件,是因為用了觸發即成交的選項,如有condition[0]的狀況出現,會造成回測時9:03分就進場。
4. 總結
本文把一些逐筆做到收K進場,即時出場需要注意的一些做了說明,有點亂、有點複雜,如果有沒寫清楚的地方,歡迎留言詢問,另外,文章也還沒有把所有可能要注意的情況都寫完,希望在下一篇把他寫完,如果你有發現一些需要注意或排除的地方,也歡迎留言告訴我。
最近XQ年訂閱促銷,A+策略網有提供加碼好禮,歡迎加入,點這邊看詳細說明

發佈留言
很抱歉,必須登入網站才能發佈留言。