您现在的位置:程序化交易>> 期货公式>> 交易开拓者(TB)>> 开拓者公式>>正文内容

RangeBreak系统交易模型[开拓者公式]

标签:公式 交易 开拓者 期货 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);  
 }
}

 

入场时间的考虑


突破的时效性,发生在上午和下午意义是不同的。
不同的商品时效属性不尽相同
为此我们增加最后交易时间参数,可供优化测试来确定最佳值。


实现代码


增加参数:
Numeric LastTradeMins(14.00);
开仓条件处增加一个时间条件。
If(MarketPosition!=1 && High>=UpperBand && Time < LastTradeMins/100)
{
// 多头开仓
}

If(MarketPosition!=-1 && Low<=LowerBand && Time < LastTradeMins/100)
{
// 空头开仓
}

 

止赢规则

为了防止较大的盈利被吞噬,增加跟踪止赢。
设定跟踪止赢的起始点。
设定跟踪止赢的回撤值。
或者可以选择百分比跟踪止赢。
这里我们采取回撤值。

跟踪止损的编码可配合前面的止损编码一起控制。
If(HigherAfterEntry>=AvgEntryPrice+DayOpen*TrailingStart*0.01)
{
 StopLine = HigherAfterEntry - DayOpen*TrailingStop*0.01;
}Else // 止损
{
 StopLine = AvgEntryPrice-DayOpen*StopLossSet*0.01;
}
  
If(Low <= StopLine)
{
 MyPrice = StopLine;
 If(Open < MyPrice) MyPrice = Open;
 Sell(1,MyPrice);   
}
做空的代码类似。

 


再进场原则


当我们止损或跟踪止损之后,有两种情况我们需要加以控制:
止损后,再次突破上轨或下轨;
追踪止赢后,价格仍符合最初的开仓条件,出场后,马上又会开仓入场。
同时,为了不错失大的波段,我们也需要再次入场,只是进场需要更高的条件。我们增加一条:
再次进场必须在突破前期的高点\低点。


代码的修改

我们需要标记止损动作,并要记录高低位。
新建两个布尔型序列变量: 
BoolSeries  bLongStoped;
BoolSeries  bShortStoped;
在脚本开始位置增加处理,保证其值向后传递。
增加HigherAfterEntry和LowerAfterEntry在平仓后的值传递。

 


初次进场和再次进场

在原始开仓位置增加条件,开多仓时bLongStoped不能为True,开空仓时bShortStoped不能为True。
发出交易指令处理这两个序列变量。
增加再次入场的代码:

If(bLongStoped && MarketPosition==0 && High >=UpperBand && High > HigherAfterEntry && Time < LastTradeMins/100)
{
 MyPrice = Max(HigherAfterEntry,UpperBand) + MinPoint;
 If(Open > MyPrice) MyPrice = Open;
 Buy(1,MyPrice);
 bLongStoped = False;
 Return;
}

 

// 做空再次入场代码:
If(bShortStoped && MarketPosition==0 && Low<=LowerBand  && Low < LowerAfterEntry && Time < LastTradeMins/100 && bInBoardRange==false)
{
 MyPrice = Min(LowerAfterEntry,LowerBand) - MinPoint;
 If(Open < MyPrice) MyPrice = Open;
 SellShort(1,MyPrice);
 bShortStoped = False;
 Return;
}


涨跌停的控制

接近涨跌停板不应开仓。
若有持仓,价格到达涨跌停板马上平仓。


判断是否接近涨跌停

我们新建一个布尔变量bInBoardRange,默认值设置为False。
bInBoardRange =
(Open < Q_LowerLimit + DayOpen*StopLossSet*0.02) Or
( Open > Q_UpperLimit - DayOpen*StopLossSet*0.02);

在开仓条件中加入(bInBoardRange==false)


涨跌停板平仓

为了在价格达到涨跌停价马上平仓,我们需要在增加如下代码:
做多时:
If(Open == Q_UpperLimit)  Sell(1,Open);
做空时:
If(Open == Q_LowerLimit)  BuyToCover(Lots,Open);

 

交易次数控制

增加失败次数限制,防止单日亏损无限制扩大。

增加二个变量记录失败的次数。
 NumericSeries LongFailureCnts;
 NumericSeries ShortFailureCnts;
增加一个参数设置最大次数。
 Numeric FailureLimit(2);

 

实现代码

在脚本开始部分增加序列变量值的向后传递处理。
在平仓时增加是否亏损的判断,如果亏损则将计数+1.
 If(PositionProfit < 0 ) LongFailureCnts = LongFailureCnts + 1;
在开仓时增加次数限定。
   LongFailureCnts < FailureLimit

 

 

 

 

如果以上指标公式不适用于您常用的行情软件

或者您想改编成选股公式,以便快速选出某种形态个股的话,

可以联系我们相关技术人员 QQ: 262069696  点击在线交流进行 有偿 改编!

 


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容