indicator()实盘同K线触发进出警报,bar_index判断逻辑是否合理?
我把
strategy()转换为包含alert()调用的indicator()用于webhook执行,实盘场景下进出警报间隔仅毫秒级,价格差值约等于进场K线的区间范围,但在同一回测周期内未出现成对警报。代码如下:var int posSide = 0 var int entryBar = na if longEntryCond and barstate.isconfirmed and posSide == 0 alert("ENTRY", alert.freq_once_per_bar_close) posSide := 1 entryBar := bar_index if exitCond and barstate.isconfirmed and posSide != 0 and bar_index > entryBar alert("EXIT", alert.freq_once_per_bar_close) posSide := 0请问使用
bar_index > entryBar作为判断条件是否恰当,是否遗漏了策略模拟器原本处理的某些逻辑?
回答
bar_index > entryBar这个判断条件不恰当,且明显遗漏了策略模拟器的核心逻辑,具体分析如下:
限制了同K线内的平仓动作:策略模拟器(
strategy函数)默认支持同一根K线内完成开仓与平仓操作(比如高频策略中的瞬间进出),但bar_index > entryBar强制要求平仓必须在开仓K线的下一根及之后触发,直接过滤掉了同K线平仓的场景——这正是回测中未出现成对警报的核心原因,而你实盘里的毫秒级进出刚好属于同K线内的动作。违背了strategy的持仓状态逻辑:
strategy函数会自动处理订单成交的即时性,哪怕在同一K线内开仓后,持仓状态会立刻更新,允许后续的平仓信号触发。但你用indicator模拟时,bar_index > entryBar人为割裂了同K线内开平仓的关联,完全不符合原策略的执行逻辑。修正方案:直接移除
bar_index > entryBar条件,仅保留posSide != 0判断持仓状态即可。如果担心开仓信号触发后立即触发平仓导致异常,可依托已有的barstate.isconfirmed保证信号仅在K线确认后触发,无需通过K线索引限制操作时机。
内容的提问来源于stack exchange,提问作者user32651446

