当前位置:主页 > TB交易开拓者策略 >

期货软件TB系统源代码:置换均线的二次穿越突破策略

时间:2020-04-14 | 栏目:TB交易开拓者策略 | 点击:

策略说明:

本策略是基于置换均线的二次穿越突破系统  

系统要素:

1. 将移动平均K线向后平移一定BAR数即为置换均线

2. 相隔一定BAR数的收盘价二次穿越置换均线

3. 二次穿越完成时那根BAR的高点(或低点)作为突破进场价

4. 完成二次穿越的一定BAR数内突破

入场条件:

1. 有效期内价格向上突破设定进场价做多

2. 有效期内价格向下突破设定进场价做空

出场条件: 

1. 价格反向穿越均线后止损

2. 基于N根K线的高低点的跟踪止损

做多代码及解读如下:

Params

Numeric AvgLength(5); //声明数值参数AvgLength,初值5,即均线周期。//

Numeric AvgDisplace(5); //声明数值参数AvgDisplace,初值5, 置换均线向后平移Bar数。//

Numeric ValidBars1(5); //声明数值参数ValidBars1,初值5, 开仓先决条件之一(收盘价上穿DMA均线)条件值保持有效的BAR数。//

Numeric ValidBars2(5); // 声明数值参数ValidBars2,初值5,开仓先决条件之二(上穿后再下穿)条件值保持有效的BAR数。//

Numeric ValidBars3(5); // 声明数值参数ValidBars3,初值5,开仓先决条件之三(上穿再下穿再上穿)条件值保持有效的BAR数。//

Numeric TrailStopBars(5); // 声明数值参数TrailStopBars,初值5,多少根BAR的最低价作为跟踪止损价。//

Vars

NumericSeries MA; // 声明数值序列变量MA,即均线了。//

NumericSeries DMA; // 声明数值序列变量DMA,即置换均线。//

BoolSeries ConCrossOver; // 声明布尔型序列变量ConCrossOver,当前BAR是否上穿DMA。//

BoolSeries ConCrossUnder; // 声明布尔型序列变量ConCrossUnd,当前BAR是否下穿DMA。//

Numeric BarsLastCrsUnd; // 声明数值变量BarsLastCrsUnd,最近一次下穿离现在的BAR数。//

Numeric BarsFstCrsOvr; // 声明数值变量BarsFstCrsOvr,最近倒数第二次上穿离现在的BAR数。//

Numeric BarsSecCrsOvr; //声明数值变量BarsSecCrsOvr, 最近的一次上穿离现在的BAR数。//

BoolSeries EntryFlag(False); // 声明布尔型序列变量EntryFlag,初值为假,开仓标志。//

NumericSeries EntryPoint; // 声明数值序列变量EntryPoint,突破开仓的价格。//

NumericSeries EntryCount; // 声明数值序列变量EntryCount,满足开仓先决条件的BAR计数。//

Numeric ReversalPrice; // 声明数值变量ReversalPrice,趋势反向的平仓价格。//

Numeric TrailStopPrice; // 声明数值变量TrailStopPrice,跟踪止损的平仓价格。//

Begin

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

MA = Average(Close, AvgLength);//计算均线。//

DMA = MA[AvgDisplace];// 计算置换均线。//

PlotNumeric("DMA",DMA);//画线置换均线。//

// 判断收盘价是否穿越置换均线。//

ConCrossOver = CrossOver(Close,DMA);//上穿置换均线。//

ConCrossUnder = CrossUnder(Close,DMA);//下穿置换均线。//

// 计算最近的一次下穿发生的BAR离当前BAR的根数。//

BarsLastCrsUnd = NthCon(ConCrossUnder==True,1);//这里就看函数NthCon,意思第N个满足条件的Bar距当前的Bar数目。//

// 计算最近的两次上穿发生的BAR离当前BAR的根数。//

BarsFstCrsOvr = NthCon(ConCrossOver==True,2);//同上解读。//

BarsSecCrsOvr = NthCon(ConCrossOver==True,1);//同上解读。//

If(ConCrossOver And BarsLastCrsUnd - BarsSecCrsOvr <= ValidBars2 And BarsFstCrsOvr - BarsLastCrsUnd <= ValidBars1)// 设置开仓标志。//

{

EntryFlag = True;//为真。//

EntryPoint = High + MinMove * PriceScale;//计算进场价位。//

EntryCount = 0;//赋值为0.//

}

Commentary("EntryFlag = "+iifstring(EntryFlag,"True","False"));//在超级图表上添加注释说明,iifstring逻辑判断,就是判断这个EntryFlag条件真假,显示相应值//

Commentary("EntryPoint = "+Text(EntryPoint));//在超级图表上添加注释说明。//

Commentary("EntryCount = "+Text(EntryCount));//在超级图表上添加注释说明。//

// 开仓条件。//

If(MarketPosition == 0 And EntryCount <= ValidBars3)//当前没有持仓,且满足开仓先决条件的BAR计数小于等于开仓先决条件之三。//

{

If(EntryFlag And High >= EntryPoint And Vol >0)//假如EntryFlag为真,且最高价大于等于进场价,且成交量大于0.//

{

Buy(0, Max(Open,EntryPoint));//开仓买多。//

}

Else//假如EntryFlag为假,且最高价小于进场价,且成交量小于等于0.//

{

EntryCount = EntryCount + 1;//满足开仓先决条件的BAR计数加1.//

}

}

// 开仓或者开仓先决条件已过有效BAR数,修改开仓标志。//

If(MarketPosition == 1 Or EntryCount > ValidBars3)//假如当前持有多单,且满足开仓先决条件的BAR计数大于开仓先决条件之三。//

{

EntryFlag = False;//为假。//

}

// 止损价格计算。//

ReversalPrice = DMA[1] - MinMove * PriceScale;//代入相应数值。//

TrailStopPrice = Lowest(Low[1],TrailStopBars);//求最低价。//

Commentary("ReversalPrice = "+Text(ReversalPrice));//注释说明。//

Commentary("TrailStopPrice = "+Text(TrailStopPrice));//注释说明。//

// 平仓。//

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

{

If(Low <= Max(ReversalPrice,TrailStopPrice))//平仓条件对比。//

{

Sell(0,Min(Open, Max(ReversalPrice,TrailStopPrice) ) );//先比较取大值,再比较取较小值。//

}

}

End

 
 

 

 

做空代码及结果如下:

Params

Numeric AvgLength(5);

Numeric AvgDisplace(5);

Numeric ValidBars1(5);

Numeric ValidBars2(5);

Numeric ValidBars3(5);

Numeric TrailStopBars(5);

Vars

NumericSeries MA;

NumericSeries DMA;

BoolSeries ConCrossOver;

BoolSeries ConCrossUnder;

Numeric BarsLastCrsOvr;

Numeric BarsFstCrsUnd;

Numeric BarsSecCrsUnd;

BoolSeries EntryFlag(False);

NumericSeries EntryPoint;

NumericSeries EntryCount;

Numeric ReversalPrice;

Numeric TrailStopPrice;

Begin

If(!CallAuctionFilter()) Return;

MA = Average(Close, AvgLength);

DMA = MA[AvgDisplace];

PlotNumeric("DMA",DMA);

ConCrossOver = CrossOver(Close,DMA);

ConCrossUnder = CrossUnder(Close,DMA);

BarsLastCrsOvr = NthCon(ConCrossOver==True,1);

BarsFstCrsUnd = NthCon(ConCrossUnder==True,2);

BarsSecCrsUnd = NthCon(ConCrossUnder==True,1);

If(ConCrossUnder And BarsLastCrsOvr - BarsSecCrsUnd <= ValidBars2 And BarsFstCrsUnd - BarsLastCrsOvr <= ValidBars1)

{

EntryFlag = True;

EntryPoint = Low - MinMove * PriceScale;

EntryCount = 0;

}

Commentary("EntryFlag = "+iifstring(EntryFlag,"True","False"));

Commentary("EntryPoint = "+Text(EntryPoint));

Commentary("EntryCount = "+Text(EntryCount));

If(MarketPosition == 0 And EntryCount <= ValidBars3)

{

If(EntryFlag And Low <= EntryPoint And Vol > 0)

{

SellShort(0, Min(Open,EntryPoint));

}

Else

{

EntryCount = EntryCount + 1;

}

}

If(MarketPosition == -1 Or EntryCount > ValidBars3)

{

EntryFlag = False;

}

ReversalPrice = DMA[1] + MinMove * PriceScale;

TrailStopPrice = Highest(High[1],TrailStopBars);

Commentary("ReversalPrice = "+Text(ReversalPrice));

Commentary("TrailStopPrice = "+Text(TrailStopPrice));

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

{

If(High >= Min(ReversalPrice,TrailStopPrice))

{

BuyToCover(0,Max(Open, Min(ReversalPrice,TrailStopPrice) ) );

}

}

End

  (责任编辑:admin)

十年专业期货服务平台,全国最低手续费保证金开户,咨询微信:cclk88

您可能感兴趣的文章:

相关文章