Data0是选择的1小时周期,在程序里面subscribeBar 1天。
跨周期出现了信号闪烁,信号闪烁可能的原因有1.方向,2价格,3仓位,4买卖,我跟踪止损里面这4点都打印了一遍出来是固定死的,不知道为什么还是会出现信号闪烁,请教老师,谢谢您抽一点时间回答。
OnInit()
{
SubscribeBar(Symbol, "1d", 20100101);
}
OnBar()
{
Range[0:1]
{
atr = Average(TrueRange, ATRLength);
}
For layer = 0 To GetArraySize(indexs) - 1
{
if(indexs[layer] == 0)
{
Range[0:0]
{
// 追踪止损
If(MarketPosition == 1)
{
If(BarsSinceEntry == 0) // 开仓后第一根bar,直接等于开仓价
{
HighestAfterEntry = AvgEntryPrice;
}
Else If(BarsSinceEntry > 0) // 之后的bar不断用最高和之前最高价做对比,赋值给开仓后最高价
{
HighestAfterEntry = Max(HighestAfterEntry[1], high[1]);
}
Else
{
HighestAfterEntry = HighestAfterEntry[1];
}
//跟踪止损平仓
If(MarketPosition == 1 and BarsSinceEntry > 0 and HighestAfterEntry - AvgEntryPrice > NATRstop*atr[1]) // 有多仓并且最低价已经低于开仓均线的xx 倍atr
{
If(low <= HighestAfterEntry - NATRstop*atr[1])
{
Sell(0, Min(Open, HighestAfterEntry - NATRstop*atr[1]));
Normal_trailing_long = True;
PlotString("trailing stop", "trailing stop", high*1.01, White);
}
}
// 硬止损平仓
If(MarketPosition == 1 and BarsSinceEntry > 0 and low <= AvgEntryPrice - NATRstop*atr[1]/ts) // 只有硬止损时加上ts系数
{
MyExitPrice = Min(Open, AvgEntryPrice - NATRstop*atr[1]/ts);
Sell(0, MyExitPrice);
PlotString("HardStop", "HardStop", high*1.01, White);
}
}
Else If(MarketPosition == -1)
{
If(BarsSinceEntry == 0) // 开仓后第一根bar,直接等于开仓价
{
LowestAfterEntry = AvgEntryPrice;
}
Else If(BarsSinceEntry > 0) // 之后的bar不断用最低和之前最低价做对比,赋值给开仓后最低价
{
LowestAfterEntry = Min(LowestAfterEntry[1], low[1]);
}
Else // 没有仓位时,保持上次价格信息,没有其他用途
{
LowestAfterEntry = LowestAfterEntry[1];
}
//跟踪止损平仓
If(MarketPosition == -1 and BarsSinceEntry > 0 and (AvgEntryPrice - LowestAfterEntry) > NATRstop*atr[1]) // 有空仓并且最高价已经大于开仓均线的xx 倍atr
{
If(high >= (LowestAfterEntry + NATRstop*atr[1]))
{
BuyToCover(0, Max(Open, LowestAfterEntry + NATRstop*atr[1]));
Normal_trailing_short = True;
PlotString("trailing stop", "trailing stop", high*1.01, White);
begins = False;
big_cond[0] = 0;
}
}
// 硬止损平仓
If(MarketPosition == -1 and BarsSinceEntry > 0 and high >= (AvgEntryPrice + NATRstop*atr[1]/ts))
{
MyExitPrice = Max(Open, AvgEntryPrice + NATRstop*atr[1]/ts);
Print("MyExitPrice " + Text(MyExitPrice));
BuyToCover(0, MyExitPrice);
PlotString("HardStop", "HardStop", high*1.01, White);
}
}
}
}
}
}
您好!您这个策略产生信号消失的原因是因为交易信号做了一个 if(indexs[layer] == 0)的判断,这样如果触发OnBar的数据源是data1,就会导致这个Tick,data0图层的交易信号没有执行,从而导致信号消失。
谢谢回复。我的data1日线只是用ATR来算仓位,出现信号闪烁是在在跟踪止损的时候,移动止损的逻辑只在data0里面。
这个不冲突,data1的数据更新,还是算data1的ATR,只要允许公式在Data0上产生交易信号就可以,就能避免Data0上的信号消失。
我的交易信号是在1小时周期data0上产生的。
另外如果我是跨周期一个tick过来应该会执行两遍onBar吧,所以我才加了一个layer来判断只执行一次range[0:0]和一次range[1:1]。
有两个数据源是会可能触发两次(如果两个数据源同时更新就触发一次),所以不能强制某次触发时跳过包含交易信号的代码,这样会导致信号消失。