OnBar更新highAfterEntry和lowAfterEntry在历史Bar和最新Bar的疑惑

如下代码所示,如果在OnBar里更新highAfterEntry和lowAfterEntry,实盘在最新Bar生命周期内每个Tick都会去更新highAfterEntry和lowAfterEntry吗?如果是这样的话,在有多单的情况下,比如Bar平开高走,highAfterEntry就会不断的变大,那么我根据highAfterEntry计算的多单止损值longStopLossPrice也会不断变大,我的代码里判断到Low<longStopLossPrice的时候就会触发止损,那岂不是会出现如下的现象:在持有多头的情况下,虽然价格不断上涨,longStopLossPrice也跟着上涨,涨到当当前Bar里Low<longStopLossPrice条件满足的时候,就触发了止损?当我把 更新highAfterEntry和lowAfterEntry的代码 放到止损代码之前,历史回测的时候,会出现一根平开高走的Bar触发止损的情况,但如果把 更新highAfterEntry和lowAfterEntry的代码 放到止损代码之后,历史回测的时候,由于OnBar就运行一根包含Bar的OLHC的Tick,就在图上显示不会在同一根Bar上止损。实盘的真实情况会怎么样呢?如果最新Bar上每个Tick都去更新highAfterEntry和lowAfterEntry,那就应该不管代码的顺序如何,都会在同一根平开高走的Bar上去止损多单,所以为了回测的准确性和K线上信号显示的准确性,应该把 更新highAfterEntry和lowAfterEntry的代码 放到止损代码之前?我的理解有问题吗?有什么办法妥善处理这个问题吗?Vars Global Numeric highAfterEntry; Global Numeric lowAfterEntry; Global Numeric longStopLossPrice; Global Numeric shortStopLossPrice; Events OnBar(ArrayRef<Integer> indexs) { // 更新highAfterEntry If (MarketPosition == 1) { If (BarsSinceEntry == 0) highAfterEntry = High; Else highAfterEntry = Max(High, highAfterEntry); } // 更新lowAfterEntry If (MarketPosition == -1) { If (BarsSinceEntry == 0) lowAfterEntry = Low; Else lowAfterEntry = Min(Low, lowAfterEntry); } }

你如果想做移动止盈,那开仓bar就不能平仓,同时也不能实时更新最新bar。你如果觉得不及时,那就化成小周期,能提高颗粒精确度

回复:谢谢回答,我的策略是OnBarOpen里判断要不要开仓的,所以我的最终解决方案是在OnBar的最前面就执行对highAfterEntry和lowAfterEntry的更新,这样一开仓后,如果这跟Bar高开低走,策略也能及时止损。我感觉更符合我需要的逻辑。副作用是如果一根Bar平开高走在极端涨势中也可能触发提前止损。 OnBar(ArrayRef<Integer> indexs) { // 更新highAfterEntry和lowAfterEntry // 在一根Bar之内,High和Low都可能随着Tick的变化而变化,所以放OnBar里执行,这样在开仓Bar里也能得到准确的更新 If (MarketPosition != 0) { highAfterEntry = Max(High, highAfterEntry); // 因为是在OnBarOpen函数里开仓,这个逻辑也能记录开仓Bar里的highAfterEntry的准确值 lowAfterEntry = Min(Low, lowAfterEntry); } // ...... }

如果我把更新 highAfterEntry和lowAfterEntry 的代码在OnBar里放到 移动止损代码 的后面,是不是有可能会出现信号闪烁?因为实时Bar里低开高走的Bar触发了止损后,历史回测的时候,由于要先用上一根Bar里的highAfterEntry和lowAfterEntry计算止损价格,然后判断完移动止损逻辑后,再去用当前历史Bar的High和Low去更新 移动止损价格,所以计算出来不会在低开高走的Bar上显示多头止损信号?

回复:好像有几次观察到实盘中策略单元显示信号为0,但重启策略单元又出现了信号,可能就是因为这个原因导致的,实盘由于实时Bar里有很多Tick进来会根据逻辑触发止损,但一旦实时Bar成为历史Bar,根据回测机制,由于更新 highAfterEntry和lowAfterEntry 的代码在OnBar里的 移动止损代码 的后面,所以又会重新显示出信号,因为历史Bar回撤并没有去及时的更新 highAfterEntry和lowAfterEntry 。我的理解应该没问题吧?

补充问题:为了保持回测结果和实盘的一致性,把更新 highAfterEntry和lowAfterEntry 的代码放到OnBarClose里执行,避免多单在一根 极端低开高走 的Bar上触发止损而错过后面的上涨行情,但其实也失去了让多单在 极端高开低走 的Bar上止损的机会。似乎没有完美的解决办法?

回复:OnBarClose里执行也不保险,因为有SetTriggerBarClose,还是放在OnBarOpen里比较保险