我在OnBarClose里有平仓逻辑,通常用以下的在OnBarOpen函数里设置提前N秒执行OnBarClose的方式来确保10:15, 15:00, 23:00等收盘的Bar也能执行代码,否则收盘的Bar执行了代码的时候因为已经收盘了,无法执行信号。但是以下的方式仍然有一定的概率出现信号闪烁,因为最后1-2秒内仍然会有很多Tick产生,就可能让在条件临界值的信号产生闪烁。但我又不想在大周期里用回溯值进行条件判断,那样因为大周期在1H以上,隔一根大周期的Bar行情就可能变化很大
OnBarOpen(ArrayRef<Integer> indexes)
{
Numeric advancesec(2); //提前多少秒
Array<Numeric> timePoint;
Numeric ret = DateTimeAdd(RealEndDateTime, -1 * advancesec);
ret = StringToTime(TimeToString(ret));
//Print("endtime="+Text(RealEndDateTime)+" SetTriggerBarClose:" + Text(ret));
ArrayPushBack(timePoint, ret);
SetTriggerBarClose(timePoint);
}基于以上的信号闪烁的原因,我干脆不想在收盘Bar执行OnBarClose里的代码逻辑了,所以有以下问题:
以下是OnBarClose代码,我可不可以在比如If (MarketPosition == 1 And BarsSinceEntry > 0)判断条件里加上 "And BarStatus[1] != 2" 来避免在10:15,15:00,23:00等收盘的Bar执行代码,也不产生信号闪烁?因为我想OnBarClose执行前,前一根Bar的BarStatus应该变成1了,但如果在收盘前的最后一根Bar执行,最后一根Bar的BarStatus应该还是2,我只是想避免收盘Bar产生信号闪烁。
OnBarClose(ArrayRef<Integer> indexs)
{
// 计算大周期MACD指标
Range[0:0]
{
//计算MACD
MainDiff = XAverage(Close, MainFastLength) - XAverage(Close, MainSlowLength);
MainDea = XAverage(MainDiff, MainMACDLength);
MainMACDValue = 2 * (MainDiff - MainDea);
}
Range[1:1]
{
// 多头因大周期MACD指标转空平仓
If (MarketPosition == 1 And BarsSinceEntry > 0)
{
If (MainMACDValue < 0)
{
Sell(Lots, Open);
Commentary("多头因大周期MACD指标转空平仓");
}
}
// 空头因大周期MACD指标转多平仓
If (MarketPosition == -1 And BarsSinceEntry > 0)
{
If (MainMACDValue > 0)
{
BuyToCover(Lots, Open);
Commentary("空头因大周期MACD指标转多平仓");
}
}
}
}
或者有其他不需要通过SetTriggerBarClose(timePoint);的更好的方式来防止在收盘时间执行OnBarClose产生信号闪烁的机制吗?
上述在OnBarClose函数了用了Open价格进行开平仓,应该是Close价格才对,否则不准确。但请忽略这个问题。重点还是信号闪烁相关的问题