期货软件TB系统源代码解读系列54-基于初始交易范围突破系统

我看了很多TB里写的程序化系统,很多止损止盈都用ATR指标来写,这个效果也许很好,可我总用不惯,所以还是建议各位用自己的习惯来止盈止损好点。先来看策略吧,如下:

策略说明:

用特定时间周期内的最高价位和最低价位计算交易范围,然后计算真实的波动范围和周期内的ATR对比,如果

当前k线的波动范围比n*交易范围的值大,并且真实波动范围比ATR大,这就满足了前两个系统挂单的条件  

入场条件:

1. 7周期区间“空隙”之和 >7周期区间高度的2倍

当前的k线比交易范围的最高值大, 而且如果当前k线的中间价格高于之前一根k线的最高值

做多

2.  7周期区间“空隙”之和 >7周期区间高度的2倍

当前的k线比交易范围的最低值小, 而且如果当前k线的中间价格低于之前一根k线的最低值

做空

出场条件: 

1.初始止损

2.跟踪止损(盈利峰值价回落ATR的一定倍数)

3.收盘价创7周期低点,且K线中点低于前K线最低价多头出场

做多程序化系统代码解读如下:

Params

Numeric RangeLen(7);//声明数值参数RangeLen,初值7.//

Numeric RngPcnt(200);//声明数值参数RngPcnt,初值200.//

Numeric ATRs(8);//声明数值参数ATRs,初值8.//

Numeric ATRLen(2);//声明数值参数ATRLen,初值2.//

Vars

NumericSeries RangeH(0); //声明数值序列变量RangeH,初值0,即7周期高点。//

NumericSeries RangeL(0); //声明数值序列变量RangeL,初值0,即7周期低点。//

NumericSeries TRange(0); //声明数值序列变量TRange,初值0,即7周期区间。//

NumericSeries NoTrades(0); //声明数值序列变量NoTrades,初值0,即记录7周期高低点分别与7周期内各K线最高最低值的距离之和。//

NumericSeries LongRisk(0); //声明数值序列变量LongRisk,初值0,即初始止损价。//

NumericSeries LongHigh(0); //声明数值序列变量LongHigh,初值0,即跟踪止盈价。//

NumericSeries ATR; //声明数值序列变量ATR,即2周期ATR均值。//

NumericSeries ATRMA; //声明数值序列变量ATRMA,即7周期ATR均值。// 

Numeric value1;//声明数值变量value1.//

BoolSeries Condition1;//声明布尔型序列变量Condition1.//

BoolSeries Condition2;//声明布尔型序列变量Condition2.//

BoolSeries Condition3;//声明布尔型序列变量Condition3.//

BoolSeries Condition4;//声明布尔型序列变量Condition4.//

Begin

If(!CallAuctionFilter()) Return;// 集合竞价和小节休息过滤。//

  //初始设置。//

RangeH = Highest(High[1], RangeLen);  //把前一最高价与参数7代入函数Highest求值,即可求得变量RangeH值。//

RangeL = Lowest(Low[1], RangeLen);   //把前一最低价与参数7代入函数Lowest求值,即可求得变量RangeL值。//

TRange = RangeH - RangeL; //把求得的值代入公式,即可求得变量TRange值了。//      

ATR = AvgTrueRange(ATRLen); //指标ATR求值公式了,具体可参考之前的抛物线解读。//     

NoTrades = 0;// 变量NoTrades初值0了。//     

ATRMA=AvgTrueRange(RangeLen); //同上的,可参考之前的抛物线解读。//     

For value1 = 1 To RangeLen      //循环语句了,即1-7循环。//

{

If (High[value1] <= RangeH ) //先看第一个值,假如前高价High[1]<=RangeH了。//  

NoTrades = NoTrades + (RangeH - High[value1]); //代入第一个值NoTrades = 0 + (RangeH - High[1]),循环连续算7周期高点与7周期内各K线最高值的距离之和了。//

If (Low[value1] >= RangeL )//还是第一个值,假如前低价Low[1] >=RangeL。//

NoTrades = NoTrades + (Low[value1] - RangeL); //代入第一个值NoTrades = 0 + (Low[1] - RangeL),同样循环连续算7周期低点与7周期内各K线最低值的距离之和。//

}

Condition1 = NoTrades>= TRange*(RngPcnt*0.01);   //7周期区间“空隙”之和 >7周期区间高度的2倍。//

Condition2 = TrueRange >ATRMA[1] ;     //函数TrueRange即当根K线ATR>前根7周期均值。//

Condition3 = Close > RangeH And (High+Low)*0.5 >High[1];  //收盘价创7周期高点,且K线中点高于前K线最高价。//

Condition4 = Close < RangeL And (High+Low)*0.5 < Low[1];  //收盘价创7周期低点,且K线中点低于前K线最低价。//

//多头入场。//

If (Condition1[1] And Condition2[1]) //假如前一变量Condition1[1]和前一变量Condition2[1]条件成立的。//

{

If (Condition3[1] And MarketPosition==0 And Vol > 0)//假如Condition3[1]条件成立,且当前没有持仓,且成交量大于0.//

{

Buy(0,Open);//以开盘价开仓买入。//

LongRisk = RangeL;  //记录初始止损价。//

LongHigh = High;   //记录跟踪止盈价。//

}

}

//更新盈利峰值价。//

If(MarketPosition == 1 And BarsSinceEntry > 0) //假如当前持有多单,且建仓数位大于0.//

LongHigh = Max(LongHigh,High);//对比取大值了。//

//多头出场。//

If(MarketPosition == 1 And BarsSinceEntry > 0 And Vol > 0)//假如持有多单,且建仓数位大于0,且成交量大于0.//

{

If(Condition4[1])//前一变量Condition4[1]条件成立,即收盘价创7周期低点,且K线中点低于前K线最低价多头出场。//

{

Sell(0,Open);//以开盘价平仓。//

}

If(Low<=LongRisk) //跌破初始止损价多头出场了。//

{

Sell(0,Min(Open,LongRisk));//平仓。//

}

If(Low<=LongHigh[1]-(ATRs * ATR[1]))  //盈利峰值价回落ATR一定倍数多头出场。//

{

Sell(0,Min(Open,LongHigh[1]-(ATRs*ATR[1])));//平仓。//

}

}

End

做空程序化系统代码及结果如下:

Params

Numeric RangeLen(7);

Numeric RngPcnt(200);

Numeric ATRs(8);

Numeric ATRLen(2);

Vars

NumericSeries RangeH(0);

NumericSeries RangeL(0);

NumericSeries TRange(0);

NumericSeries NoTrades(0);

NumericSeries ShortRisk(0);

NumericSeries ShortLow(0);

NumericSeries ATR;

NumericSeries ATRMA;  

Numeric value1;

BoolSeries Condition1;

BoolSeries Condition2;

BoolSeries Condition3;

BoolSeries Condition4;

Begin

If(!CallAuctionFilter()) Return;

RangeH = Highest(High[1], RangeLen); 

RangeL = Lowest(Low[1], RangeLen);  

TRange = RangeH - RangeL;      

ATR = AvgTrueRange(ATRLen);     

NoTrades = 0;      

ATRMA=AvgTrueRange(RangeLen);     

For value1 = 1 To RangeLen    

{

If (High[value1] <= RangeH )   

NoTrades = NoTrades + (RangeH - High[value1]);

If (Low[value1] >= RangeL )

NoTrades = NoTrades + (Low[value1] - RangeL);

}


Condition1 = NoTrades>= TRange*(RngPcnt*0.01);

Condition2 = TrueRange >ATRMA[1] ;        

Condition3 = Close > RangeH And (High+Low)*0.5 >High[1];

Condition4 = Close < RangeL And (High+Low)*0.5 < Low[1];

If (Condition1[1] And Condition2[1] ) 

{

If (Condition4[1] And MarketPosition==0 And vol > 0)

{

SellShort(0,Open);

ShortRisk = RangeH;

ShortLow = Low;

}

}

If(MarketPosition == -1 And BarsSinceEntry > 0) ShortLow = Min(ShortLow,Low);

If(MarketPosition == -1 And BarsSinceEntry > 0 And Vol > 0) 

{

If(Condition3[1])

{

BuyToCover(0,Open);

}

If(High>=ShortRisk) 

{

BuyToCover(0,Max(Open,ShortRisk));

}

If(High>=ShortLow[1]+(ATRs*ATR[1]))

{

BuyToCover(0,Max(Open,ShortLow[1]+(ATRs*ATR[1])));

}

}

End

初眼一看,都知道这结果很一般,也许是参数不符合,我也没做过参数优化的,但也没兴趣的。我只感兴趣的是,跟踪止盈的另一个写法,所以这个系统,也只是解读一下了。

你可能感兴趣的:(期货软件TB系统源代码解读系列54-基于初始交易范围突破系统)