RangeBreak策略最初来源于期货和外汇交易,属于日内突破策略的一种。在《Futures Truth Magazine》(美国权威交易系统评选杂志)中曾经连续多年排名前十。无论是专业的投资机构还是个人交易者都在广泛使用。
但是,如果一个交易策略被大众广为所知,那么这个交易策略在实战中的应用就会大打折扣。所以,这篇文章的目的,不是介绍RangeBreak策略让大家生搬硬套,而是通过对RangeBreak策略的学习,让大家从一个盈利的交易系统中融会贯通,提高交易的能力。
最初的RangeBreak策略是当日的开盘价和昨日的价格波动幅度,来决定今日的多空方向。当日的开盘价加上昨日的价格波动幅度形成上轨,当日开盘价减去昨日的价格波动幅度形成下轨。如果价格升破上轨就进场做多,如果价格跌破下轨就进场做空。没有止盈止损,临近收盘平仓。具体计算公式:
细心的朋友可能会发现,在计算上轨和下轨时加入了一个变量N,可能会有人问为什么要在昨日价格波动幅度乘以N呢,这个N到底代表什么含义。其实这里的变量N并没有特别的含义,之所以在这个地方加入一个变量N,只不是交易者可以根据具体的交易品种或者个人的主观经验来灵活调整上轨和下轨的距离,变量N的参数范围可以是0.1~1.5。
依次打开:youquant.com > 登录 > 控制中心 > 策略库 > 新建策略,在策略编辑界面的左上角,点击下拉框选择编程语言为:My语言
,开始编写策略。注意看下面代码中的注释。
Q:=BARSLAST(DATE<>REF(DATE,1))+1; // 判断是不是新一天的K线
DIFF:=REF(HHV(HIGH,Q),Q)-REF(LLV(LOW,Q),Q); // 昨日最高价与最低价的价格差
OO:VALUEWHEN(Q=1,OPEN); // 当天开盘价
UP:OO+DIFF*N; // 上轨
DOWN:OO-DIFF*N; // 下轨
TIME>=0905&&TIME<1455&&CLOSE>UP,BK; // 多头开仓
TIME>=0905&&TIME<1455&&CLOSE<DOWN,SK; // 空头开仓
TIME>=1455,CLOSEOUT; // 收盘平仓
AUTOFILTER; // 信号过滤
为了更接近真实的交易环境,我们在回测时采用开平仓各2跳以及2倍的手续费来压力测试,测试环境如下:
资金曲线
从上面的回测结果看,策略在市场行情走势流畅的时候表现很好,无论是在上涨或下跌中,阿隆指标可以完整的跟踪到行情。资金曲线也整体走势向上,并没有出现较大幅度的回撤。但是在震荡行情中,特别是连续的震荡行情中,出现了局部回撤。
如上图所示,原版RangeBreak策略即便在市场趋势明显的时候,效果也不尽人意,特别是在市场处于震荡状态时,资金曲线波动较大,当市场处于长期震荡时,出现了较大回撤。我们知道RangeBreak属于趋势型策略,同样也有趋势策略的软肋。
需要特别注意的是,原版策略在计算昨日的波动幅度时,只是用简单的昨日的最高价减去昨日的最低价。但是在计算价格波动幅度的时候,可以利用ATR指标,因为ATR代表的是价格的平均真实波动率,比如在海龟交易法则中就用到了ATR。
另外,国内商品期货的价格走势往往上涨的时候比较缓慢,下跌的时候跌得比较急,所以我们可以在计算上轨和下轨的时候,可以分别用N1和N2,这样可以使策略更加灵活的应对不同的市场环境。
正如RangeBreak策略的设计理念一样,从来不去预测市场终究是上涨下跌还是震荡,只要当天的价格突破上下轨,就预示着当天市场价格走势的方向,交易者只需要跟随信号顺势而为即可。当然你还可以根据自己的交易习惯或者市场特性加以改进,升级迭代这个交易策略。
(*backtest start: 2015-02-22 00:00:00 end: 2019-07-13 00:00:00 period: 5m exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}] args: [["RunMode",1,126961],["SlideTick",0,126961],["ContractType","ZC888",126961]] *) Q:=BARSLAST(DATE<>REF(DATE,1))+1; // 判断是不是新一天的K线 DIFF:=REF(HHV(HIGH,Q),Q)-REF(LLV(LOW,Q),Q); // 昨日最高价与最低价的价格差 OO:=VALUEWHEN(Q=1,OPEN); // 当天开盘价 UP^^OO+DIFF*N; // 上轨 DOWN^^OO-DIFF*N; // 下轨 TIME>=0905&&TIME<1455&&CLOSE>UP,BK; // 多头开仓 TIME>=0905&&TIME<1455&&CLOSE<DOWN,SK; // 空头开仓 TIME>=1455,CLOSEOUT; // 收盘平仓 AUTOFILTER; // 信号过滤template: strategy.tpl:40:21: executing "strategy.tpl" at <.api.GetStrategyListByName>: wrong number of args for GetStrategyListByName: want 7 got 6