Fair Value Gap指标开发求助:2 Candle Rejection检测异常
一、1CR未显示的核心原因排查
priceInGap()函数逻辑不匹配规则
当前1CR触发条件仅判断priceInGap()(价格进入FVG区域),但规则要求是“第一根蜡烛试探FVG后收于上方(看涨)/下方(看跌)”。如果priceInGap()只检测价格触碰FVG,未验证收盘价是否脱离FVG并符合方向,会导致1CR触发条件不满足,自然不会显示。liveReady或state变量状态异常- 若
liveReady在FVG出现时未被正确设为true(比如实时数据加载延迟、初始化逻辑问题),会直接跳过1CR触发。 - 若前一次FVG信号未重置
state为0(比如信号失效后未处理状态),新FVG出现时state仍为1/2,1CR条件state == 0无法满足。
- 若
a1Price/barStartInner赋值错误
如果FVG识别逻辑中,a1Price(FVG关键价格)或barStartInner(FVG起始bar索引)未被正确赋值,会导致1CR的线/标签绘制失败,但无报错提示。
二、2CR绘制时机错误的核心原因排查
突破判断未基于收盘价,导致提前触发
当前2CR触发条件是low < candleALow(看涨)或high > candleAHigh(看跌),这是基于当前bar的实时价格波动,而非收盘价。会导致bar未收盘时就提前绘制2CR,出现“提前触发”的问题;若后续收盘价回到candleA范围内,信号实际无效,但2CR已绘制。candleA_bar赋值逻辑错位
规则中candleA是“第一根拒绝FVG的蜡烛”,但当前代码在1CR触发时将candleA_bar设为bar_index(当前触发1CR的bar)。若priceInGap()是在当前bar的盘中触发,candleA应该是完成拒绝动作的那根bar(即收盘价脱离FVG的bar),可能需要赋值为bar_index - 1,否则会导致后续2CR的“第一根突破bar”判断错位,出现滞后/提前。缺失信号失效的状态重置逻辑
规则明确“收盘价跌破缺口、第一根拒绝蜡烛或其低点(看涨场景)则信号失效”,但当前代码未实现该逻辑:当信号失效时,未将state重置为0,导致即使信号无效,仍会错误触发2CR。
三、针对性修复代码示例
1. 修复1CR触发条件
// 1 CR-Bedingung: erste Berührung der Gap-Zone + 收盘价符合拒绝方向 if liveReady and state == 0 and priceInGap() // 新增:判断收盘价是否脱离FVG并符合方向 bool isRejection = isBull ? close > lInner : close < lOuter if isRejection cr1Level := a1Price cr1Line := line.new(barStartInner, cr1Level, bar_index, cr1Level, xloc.bar_index, extend.none, ColorCR, line.style_dotted, 2) lblCR1 := label.new(barStartInner, isBull ? low - offsetY() : high + offsetY(), "1CR", yloc = isBull ? yloc.belowbar : yloc.abovebar, style = label.style_label_center, color = color.new(color.white, 100), textcolor = colCR) // 修正:candleA设为完成拒绝的bar(当前bar,因为收盘价已确认) candleA_bar := bar_index candleAHigh := high candleALow := low alert("⚠️ " + timeframe.period + " FVG : 1 Candle Rejection erkannt!\n🟢 Entry Erlaubt, wenn 2. Candle Expansion Candle.", alert.freq_once_per_bar) state := 1
2. 修复2CR触发逻辑与时机
//───────────────────────────────────────────────────────────── // 6 b) 2 CR State (nur erste Candle nach Candle A darf triggern) //───────────────────────────────────────────────────────────── isAfterCandleA = not na(candleA_bar) and bar_index > candleA_bar isFirstValidBreak = false // 新增:信号失效判断,重置state if state == 1 bool signalInvalid = isBull ? close < min(lInner, candleALow) : close > max(lOuter, candleAHigh) if signalInvalid state := 0 candleA_bar := na // 重置candleA变量 // 可选:删除已绘制的1CR线/标签 if not na(cr1Line) line.delete(cr1Line) if not na(lblCR1) label.delete(lblCR1) if state == 1 and isAfterCandleA // 修改:基于收盘价判断突破,而非实时高低点 if isBull and close < candleALow isFirstValidBreak := true if not isBull and close > candleAHigh isFirstValidBreak := true if isFirstValidBreak float cr2Level = isBull ? candleALow : candleAHigh cr2Line := line.new(candleA_bar, cr2Level, bar_index, cr2Level, xloc.bar_index, extend.none, ColorCR, line.style_dotted, 2) lblCR2 := label.new(candleA_bar, isBull ? cr2Level - offsetY() : cr2Level + offsetY(), "2CR", yloc = isBull ? yloc.belowbar : yloc.abovebar, style = label.style_label_center, color = color.new(color.white, 100), textcolor = colCR) candleBHigh := high candleBLow := low candleB_bar := bar_index state := 2 alert("⚠️ " + timeframe.period + " FVG : 2 Candle Rejection erkannt!\n🟢 Entry Erlaubt, wenn 3. Candle Expansion Candle.\n🟢 Alignment TF Entry erlaubt\n->wenn Alignment TF FVG confirmed!", alert.freq_once_per_bar)
3. 补充state重置逻辑
在FVG失效(比如缺口被回补)或切换新FVG时,必须将state重置为0,同时清空candleA_bar等变量,避免旧状态干扰新信号。
内容的提问来源于stack exchange,提问作者Julien Sylvan Pohl

