双均线通道过滤交易系统

  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

猜你喜欢

转载自blog.csdn.net/mozhuinsking/article/details/85467280
今日推荐