Params
Numeric AvgLength(5); // 均线周期
Numeric AvgDisplace(5); // 置换均线向后平移Bar数
Numeric ValidBars1(5); // 开仓先决条件之一(收盘价上穿DMA均线)条件值保持有效的BAR数
Numeric ValidBars2(5); // 开仓先决条件之二(上穿后再下穿)条件值保持有效的BAR数
Numeric ValidBars3(5); // 开仓先决条件(上穿再下穿再上穿)条件值保持有效的BAR数
Numeric TrailStopBars(5); // 多少根BAR的最低价作为跟踪止损价
Vars
Series<Numeric> MA; // 均线
Series<Numeric> DMA; // 置换均线
Series<Bool> ConCrossOver; // 当前BAR是否上穿DMA
Series<Bool> ConCrossUnder; // 当前BAR是否下穿DMA
Numeric BarsLastCrsOvr; // 最近一次上穿离现在的BAR数
Numeric BarsFstCrsUnd; // 最近倒数第二次下穿离现在的BAR数
Numeric BarsSecCrsUnd; // 最近的一次下穿离现在的BAR数
Series<Bool> EntryFlag(False); // 开仓标志
Series<Numeric> EntryPoint; // 突破开仓的价格
Series<Numeric> EntryCount; // 满足开仓先决条件的BAR计数
Numeric ReversalPrice; // 趋势反向的平仓价格
Numeric TrailStopPrice; // 跟踪止损的平仓价格
Events
OnBar(ArrayRef<Integer> indexs)
{
// 计算置换均线
MA = Average(Close, AvgLength);
DMA = MA[AvgDisplace];
PlotNumeric("DMA",DMA);
// 判断收盘价是否穿越置换均线
ConCrossOver = CrossOver(Close,DMA);
ConCrossUnder = CrossUnder(Close,DMA);
// 计算最近的一次上穿发生的BAR离当前BAR的根数
BarsLastCrsOvr = NthCon(ConCrossOver==True,1);
// 计算最近的两次下穿发生的BAR离当前BAR的根数
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;
}
}
// 开仓或者开仓先决条件已过有效BAR数,修改开仓标志
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) ) );
}
}
}
老师你好,我研究开拓者自带的 基于置换均线的二次穿越突破系统空 这个策略的时候,发现这段代码没有回溯,
If(ConCrossUnder And BarsLastCrsOvr - BarsSecCrsUnd <= ValidBars2 And BarsFstCrsUnd - BarsLastCrsOvr <= ValidBars1)
{
EntryFlag = True;
EntryPoint = Low - MinMove * PriceScale;
EntryCount = 0;
}
而且EntryFlag作为开仓条件之一,他也没回溯,这样不会导致信号闪烁吗? 这是开拓者自带的策略,不可能会闪烁才对,这是什么原理呢?老师指导一下,谢谢
// 开仓
If(MarketPosition == 0 And EntryCount <= ValidBars3)
{
If(EntryFlag And Low <= EntryPoint And Vol > 0)
{
SellShort(0, Min(Open,EntryPoint));
}
Else
{
EntryCount = EntryCount + 1;
}
}
您好,这个内置策略是我当年写的,我有点忘了当时为啥没有加上回溯,看上去确是有信号闪烁的可能,我上午检查并测试一下再回复您吧。感谢您指出我们代码中的问题!