双均线通道过滤交易系统
1. 本策略简介
传统的双均线交易系统是通过快速均线与慢速均线的交叉来捕捉趋势;当快速均线上穿慢速均线的时候,出现买入信号,指示有一波上涨趋势;当快速均线下穿慢速均线的时候,出现卖出信号,指示有一波下跌趋势。
然而,双均线交易系统在趋势行情中能获得较大的收益;由于市场只有20%的趋势行情,80%是振荡行情,双均线交易系统容易发出假信号导致过多的亏损。
为了将假趋势信号过滤掉,可以将双均线与通道结合起来,此时的“通道”充当二次滤网,虽然在一定程度上过滤了假趋势信号使在振荡行情中减少了损失,但是同时在真趋势行情中也损失了一部分利润;降低风险的同时也降低了利润。
2. 策略逻辑
双均线通道过滤交易系统需要两层滤网才能交易:第一层是双均线交叉;第二层是突破通道。该交易系统涉及进场、出场和再进场三个步骤。进场:当快速均线上穿慢速均线时,通道为最近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,则重建之前的空头头寸,否则不交易。
3. 多头策略(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_ratio*0.01+1);
{value3记录突破的价格是最近12根K线的高点与(1+3%)的乘积,利用输入参数jchl记录bar的数量12,函数highest计算最近12根K线的高点}
end;
if bkx>0 and high>=value3 and (currentbar>bkx and currentbar0这个条件,是因为如果当根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 lowzjckx and currentbar=value5 then begin
{zjckx>0是用于判断之前有平仓,并且当后面再进场交易之后,zjckx被赋值为-1,那么zjckx>0不再满足,也就不会在zjcb根bar内出现重复再进场的情况;(currentbar>zjckx and currentbar0 and currentbar>zjckx+zjcb then
zjckx=-1;
4. 空头策略(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_ratio*0.01);
{lowest和highest函数,在计算时,包含当根bar的数值,它们被用于计算从当根bar开始的指定数量的bar内最小的数值和最大的数值}
end;
if skx>0 and lowskx and currentbarskx and currentbar0判断第一层滤网是否完成;low0不再成立}
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 currentbarzjckx and currentbarzjckx+zjcs then
zjckx=-1;
5. 小结
多头策略和空头策略中的输入参数可以根据情况进行优化,双均线只是一个判断趋势的传统指标,也可以用其它判断趋势的指标进行替换一下;通道线的作用是充当第二层滤网,也可以使用其它的过滤系统进行替换,它的作用是辅助趋势信号的,使在振荡行情中减少损失,同时带来的负面作用是在趋势行情中也减少了利润;双均线通道过滤交易系统可以改进和优化的地方是可以通过使用其它的趋势指标和二次过滤系统进行优化,进一步可以思考如何在趋势行情中避免减少利润,在振荡行情中避免
版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。