
RangeBreak系统交易模型是著名的交易系统,这里把他解析出来,供大家参考学习之用,这是个日内交易系统,收盘一定平仓;
RangeBreak基于昨日振幅和今日开盘价的关系。
昨日振幅=昨日最高价-昨日最低价
上轨 = 今日开盘价+N*昨日振幅
下轨 = 今日开盘价-N*昨日振幅
当价格突破上轨,买入开仓。
当价格跌穿下轨,卖出开仓。
RangeBreak指标
Params
Numeric PercentOfRange(0.3);
Vars
Numeric DayOpen;
Numeric preDayRange;
Numeric UpperBand;
Numeric LowerBand;
Begin
DayOpen = OpenD(0);
preDayRange = HighD(1) - LowD(1);
UpperBand = DayOpen + preDayRange*PercentOfRange;
LowerBand = DayOpen - preDayRange*PercentOfRange;
PlotNumeric("UpperBand",UpperBand);
PlotNumeric("LowerBand",LowerBand);
PlotNumeric("MidLine",DayOpen);
End
RBS_V1
Params
Numeric PercentOfRange(0.3);
Numeric ExitOnCloseMins(14.59);
Vars
Numeric DayOpen;
Numeric preDayRange;
Numeric UpperBand;
Numeric LowerBand;
Numeric MyPrice;
Begin
DayOpen = OpenD(0);
preDayRange = HighD(1) - LowD(1);
UpperBand = DayOpen + preDayRange*PercentOfRange;
LowerBand = DayOpen - preDayRange*PercentOfRange;
If(MarketPosition!=1 && High>=UpperBand)
{
MyPrice = UpperBand;
If(Open > MyPrice) MyPrice = Open;
Buy(1,MyPrice);
Return;
}
If(MarketPosition!=-1 && Low<=LowerBand)
{
MyPrice = LowerBand;
If(Open < MyPrice) MyPrice = Open;
SellShort(1,MyPrice);
Return;
}
// 收盘平仓
If(Time >=ExitOnCloseMins/100)
{
Sell(1,Open);
BuyToCover(1,Open);
}
SetExitOnClose;
End
必须考虑的特殊情况
如果前一日涨停或跌停,则会出现范围很小。
解决方案:
设定一个范围的最小值,假定为当前价格的0.2%。
代码中的改动
Params
Numeric MinRange(0.2);
Vars
NumericSeries DayOpen;
Numeric preDayHigh;
Numeric preDayLow;
NumericSeries preDayRange;
Begin
preDayHigh = HighD(1);
preDayLow = LowD(1);
If(Date!=Date[1])
{
DayOpen = Open;
preDayRange = preDayHigh - preDayLow;
If(preDayRange < Open*MinRange*0.01)
preDayRange = Open*MinRange*0.01;
}Else
{
DayOpen = DayOpen[1];
preDayRange = preDayRange[1];
}
增加止损
有可能通道会比较宽,难道非要等到反转才平仓?
考虑增加止损设置,有2种方案:
1、亏损固定点数。
2、亏损当前价格的百分比。
考虑到商品价格变化的差异,我们采取第二种方式。
止损部分代码
先增加一个变量StopLine,用来保存止损位置。
下面是做多时的止损代码:
If(MarketPosition==1)
{
StopLine = AvgEntryPrice-DayOpen*StopLossSet*0.01;
If(Low <= StopLine)
{
MyPrice = StopLine;
If(Open < MyPrice) MyPrice = Open;
Sell(Lots,MyPrice);
}
}
下面是做空的止损代码:
Else If(MarketPosition==-1)
{
StopLine = AvgEntryPrice+DayOpen*StopLossSet*0.01;
If(High >= StopLine)
{
MyPrice = StopLine;
If(Open > MyPrice) MyPrice = Open;
BuyToCover(Lots,MyPrice);
}
}
