咨询代码

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;

}

}


代码咨询
代码咨询
咨询函数
咨询编写问题
咨询minmove的用法
TB策略咨询
咨询
咨询水平线
关于之前咨询的问题
咨询关于导出策略的问题

您好,这个内置策略是我当年写的,我有点忘了当时为啥没有加上回溯,看上去确是有信号闪烁的可能,我上午检查并测试一下再回复您吧。感谢您指出我们代码中的问题!