1. 程式人生 > >雙均線通道過濾交易系統

雙均線通道過濾交易系統

  1. 本策略簡介

傳統的雙均線交易系統是通過快速均線與慢速均線的交叉來捕捉趨勢;當快速均線上穿慢速均線的時候,出現買入訊號,指示有一波上漲趨勢;當快速均線下穿慢速均線的時候,出現賣出訊號,指示有一波下跌趨勢。

然而,雙均線交易系統在趨勢行情中能獲得較大的收益;由於市場只有20%的趨勢行情,80%是振盪行情,雙均線交易系統容易發出假訊號導致過多的虧損。

為了將假趨勢訊號過濾掉,可以將雙均線與通道結合起來,此時的“通道”充當二次濾網,雖然在一定程度上過濾了假趨勢訊號使在振盪行情中減少了損失,但是同時在真趨勢行情中也損失了一部分利潤;降低風險的同時也降低了利潤。

  1. 策略邏輯

雙均線通道過濾交易系統需要兩層濾網才能交易:第一層是雙均線交叉;第二層是突破通道。該交易系統涉及進場、出場和再進場三個步驟。進場:當快速均線上穿慢速均線時,通道為最近12根K線的高點的價格與(1+3%)的乘積,如果價格在未來12根K線內向上突破通道,買入,否則不交易,重新等待下一次均線交叉;當快速均線下穿慢速均線時,通道為最近12根K線的低點的價格與(1-3%)的乘積,如果價格在未來12根K線內向下突破通道,則賣出,否則不交易,重新等待下一次均線交叉。

出場與再進場:當持有多頭的時候,如果價格跌破8根K線的低點時,多頭平倉同時儲存最近10根K線的高點價格high_price,如果平倉之後的15根K線內價格達到high_price,則重建之前的多頭頭寸,否則不交易;當持有空頭的時候,如果價格突破最近8根K線的高點,空頭平倉同時儲存最近10根K線的低點價格low_price,如果平倉之後的15根K線內價格達到low_price,則重建之前的空頭頭寸,否則不交易。

  1. 多頭策略(MC_MovingAverageCrossOver_L)

input:P_ratio(3),jchl(12),jcbs(12),cchl(8),zjch(10),zjcb(15),pricevalue(close),fastlength(12),slowlength(26);

var:bkx(0),zjckx(0);

value1=xaverage(pricevalue,fastlength);

value2=xaverage(pricevalue,slowlength);

{這裡使用指數移動平均線EMA,xaverage函式計算EMA,也可以使用加權移動均線WMA、簡單移動均線SMA和自適應移動均線adaptive moving average}

condition1=value1 cross above value2;

{第一層濾網,均線交叉,condition1記錄第一層濾網條件是否滿足}

if condition1 then begin

bkx=currentbar;

{由於必須在未來jcbs根bar內突破才會交易,否則不交易,所以設定變數bkx來記錄從第一層濾網滿足開始的bar的數量}

value3=highest(high,jchl)(p_ratio0.01+1);

{value3記錄突破的價格是最近12根K線的高點與(1+3%)的乘積,利用輸入引數jchl記錄bar的數量12,函式highest計算最近12根K線的高點}

end;

if bkx>0 and high>=value3 and (currentbar>bkx and currentbar<=bkx+jcbs)

{這裡之所以加入bkx>0這個條件,是因為如果當根bar的最高價格在jcbs根bar內突破通道之後,發出委託單同時將bkx賦值為-1,這樣bkx>0就不再成立}

then begin

buy(“breakthrough_b”) next bar at market;

bkx=-1;

end

else if bkx>0 and currentbar>bkx+jcbs then

bkx=-1;

{當currentbar>bkx+jcbs,也就是說在jcbs根bar內如果價格未突破通道,則不交易,此時也需要賦值bkx為-1,使bkx>0不再成立}

//上面的部位是進場邏輯部分

value4=lowest(low,cchl)[1];

{當持多倉的時候,通過value4記錄最近cchl根bar的最低價格,lowest函式計算cchl根bar的最低價格; value4是每根bar都更新,只要當根bar跌value4的價格,就平倉}

if marketposition=1 and low<=value4 then begin

sell next bar at market;

value5=highest(high,zjch);

zjckx=currentbar;

{ marketposition=1判斷當前持多倉,low<=value4判斷是否跌破最近cchl根bar的最低價格;當這兩個條件都成立時,平倉同時記錄zjckx和value5為後面的再進場做準備;zjckx是記錄平倉時的bar的編號,value5是記錄平倉時的最近zjch根bar的最高價格}

end;

if zjckx>0 and (currentbar>zjckx and currentbar<=zjckx+zjcb) and high>=value5 then begin

{zjckx>0是用於判斷之前有平倉,並且當後面再進場交易之後,zjckx被賦值為-1,那麼zjckx>0不再滿足,也就不會在zjcb根bar內出現重複再進場的情況;(currentbar>zjckx and currentbar<=zjckx+zjcb) 這個條件是判斷是否在zjcb根bar內,如果超出規定的bar的數量,則不再交易}

buy(“zjc_b”) next bar at market;

zjckx=-1;

end

else if zjckx>0 and currentbar>zjckx+zjcb then

zjckx=-1;

  1. 空頭策略(MC_MovingAverageCrossOver_S)

input:P_ratio(3),jchl(12),jcbs(12),cchl(8),zjcl(10),zjcs(15),pricevalue(close),fastlength(12),slowlength(26);

var:skx(0),zjckx(0);

{空頭策略和多頭策略是對稱的,唯一的不同是方向的不同,它們的邏輯和思路是一致的}

value1=xaverage(pricevalue,fastlength);

value2=xaverage(pricevalue,slowlength);

{這裡使用的是指數移動均線EMA,當然也可以使用簡單移動均線SMA,加權移動均線WMA和自適應移動均線adaptive moving average來代替,代替後的效果和應用場景會有一定的差異}

condition1=value1 cross under value2;

if condition1 then begin

{當快速均線下穿慢速均線的時候,第一層濾網形成了,此時通過變數skx來記錄一下第一層濾網形成時的bar的編號,通過變數value3來儲存第二層濾網的通道線}

skx=currentbar;

value3=lowest(low,jchl)(1-p_ratio0.01);

{lowest和highest函式,在計算時,包含當根bar的數值,它們被用於計算從當根bar開始的指定數量的bar內最小的數值和最大的數值}

end;

if skx>0 and low<=value3 and (currentbar>skx and currentbar<=skx+jcbs) then begin

sellshort(“breakthrough_s”) next bar at market;

skx=-1;

{currentbar>skx and currentbar<=skx+jcbs是用來限制從第一層濾網形成到突破第二層濾網必須在jcbs根bar內完成;skx>0判斷第一層濾網是否完成;low<=value3判斷價格是否突破第二層濾網;當這三個條件都成立的時候,才會去執行sellshort賣出語句,並且同時將skx賦值為-1,使skx>0不再成立}

end

else if skx>0 and currentbar>skx+jcbs then

skx=-1;

{當currentbar>skx+jcbs判斷第二層濾網未在jcbs根bar內突破,此時也將skx賦值為-1,重新判斷第一層濾網是否成立,當前第一層濾網失效}

//從這裡之前的部分都是進場策略部分,後面的部分是出場和再進場部分

value4=highest(high,cchl)[1];

{通過value4儲存最近cchl根bar的最高價格,它是每根bar都更新,但是隻有在marketposition=-1的情況下,它的更新才有效果,因為它會影響到high>=value4是否成立}

if marketposition=-1 and high>=value4 then begin

buytocover next bar at market;

value5=lowest(low,zjcl);

zjckx=currentbar;

{當持倉為空頭的時候,並且當根bar的最高價格突破value4時,執行平倉並且同時儲存兩個值,它們將被用於追蹤後續的再進場策略;value5用來儲存平倉時最近zjcl根bar的最低價格,zjckx用來儲存平倉時的bar的編號,因為再進場策略需要限制在指定數量的bar內完成,否則再進場失效}

end;

if zjckx>0 and (currentbar>zjckx and currentbar<=zjckx+zjcs) and low<=value5 then begin

sellshort(“zjc_s”) next bar at market;

zjckx=-1;

{zjckx>0用來判斷已經平倉,當前正在執行再進場策略部分;(currentbar>zjckx and currentbar<=zjckx+zjcs)用來限制再進場策略必須在zjcs根bar內完成,否則不再執行再進場策略;low<=value5用來判斷當根bar的最低價格是否突破value5;當這三個條件都滿足的情況下,執行再進場指令,重建之前的空倉部位,並且同時將zjckx賦值為-1,使策略不再執行再進場判斷}

End

else if zjckx>0 and currentbar>zjckx+zjcs then

zjckx=-1;

  1. 小結

多頭策略和空頭策略中的輸入引數可以根據情況進行優化,雙均線只是一個判斷趨勢的傳統指標,也可以用其它判斷趨勢的指標進行替換一下;通道線的作用是充當第二層濾網,也可以使用其它的過濾系統進行替換,它的作用是輔助趨勢訊號的,使在振盪行情中減少損失,同時帶來的負面作用是在趨勢行情中也減少了利潤;雙均線通道過濾交易系統可以改進和優化的地方是可以通過使用其它的趨勢指標和二次過濾系統進行優化,進一步可以思考如何在趨勢行情中避免減少利潤,在振盪行情中避免更多的假訊號。

  1. 雙均線通道過濾交易系統和傳統雙均線交易系統的比較

商品合約選擇shfe.pbhot(滬鉛主力連續)從2010-01-13到2017-06-18,週期為1日,策略屬性中設定最大bars數為50(預設的),滑價為2跳的金額(折算成每手金額50),手續費為成交金額的0.004%(和上期所交易手續費一致)。圖1是雙均線系統權益曲線圖,前期由於市場處於振盪行情,過多的假趨勢訊號使雙均線系統頻繁交易,導致過多手續費、滑點費用及虧損,權益最低點為78659元,虧損了21341元;2016-04-25號之後,出現了趨勢行情,開始扭虧為盈達到權益最高點140729元,上升幅度為53593元。

圖2是雙均線通道過濾交易系統權益曲線,前期市場處於振盪行情,由於加入了通道過濾,所以並沒有頻繁的交易;相比雙均線系統,雙均線通道過濾交易系統產生很少的滑點費用、交易手續費用及虧損,權益最低點為89558元,虧損了10442元,比雙均線交易系統少51.1%;雖然從2016-04-25號之後,出現了趨勢行情,但是雙均線通道過濾交易系統由於加入了過濾,在抓取趨勢行情上會比較遲鈍,導致沒有在趨勢行情中獲得過多的利潤;圖2中顯示,雙均線通道過濾交易系統是從2016-07-08號之後進場,從權益102766元上升到權益最高點150230,上升幅度為47464元,上升幅度比雙均線系統小11.4%左右;總體上,在當前行情下,加入通道過濾系統在一定程度上避免了在振盪行情中過多的虧損,但是並沒有過多的減少在趨勢行情中的利潤,這點通過表1的盈利因子可以看出。詳細的可以看錶1,雙均線系統和雙均線通道過濾交易系統的績效對比。

原始碼:https://www.fageka.com/i/JW071Lu0242