时间: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
十年专业期货服务平台,全国最低手续费保证金开户,咨询微信:cclk88