PineScript 5背离代码求助:背离点与收盘价假设线对比异常
PineScript 5 背离检测代码:假设线对比问题排查
核心问题
你编写的背离检测代码在验证两个枢轴点之间的K线是否穿过假设线时逻辑错误,导致无法正确识别有效背离。
代码问题分析
斜率计算逻辑错误
原代码用当前收盘价和历史收盘价计算斜率,而假设线应该连接的是两个枢轴点的价格,而非当前K线收盘价,偏离了"连接两个枢轴点"的核心逻辑。
原错误代码:slope1 = math.abs(close-close[len])/len假设线Y值判断逻辑错误
原代码用当前收盘价减去斜率乘偏移量计算假设线价格,不符合两个枢轴点连线的坐标逻辑,应该基于最新枢轴点的价格和位置推导历史K线对应的假设线价格。循环计数与终止条件错误
原代码中not_cross == len-2的判断无逻辑依据,且循环遍历范围未准确覆盖两个枢轴点之间的所有K线。
修改后的代码片段
//@version=5 indicator("divergence 2") plot(na) l_prd = input.int(defval = 5, title = "Left Pivot Period", minval = 1, maxval = 50) r_prd = input.int(defval = 2, title = "Right Pivot Period", minval = 1, maxval =5) source = input.source(close, "Source") maxpp = input.int(defval = 10, title = "Maximum Pivot Points to Check", minval = 1, maxval = 20) maxbars = input.int(defval = 100, title = "Maximum Bars to Check", minval = 30, maxval = 200) dontconfirm = input(defval = false, title = "Don't Wait for Confirmation") // get indicators rsi = ta.rsi(close, 14) // RSI [macd, signal, deltamacd] = ta.macd(close, 12, 26, 9) // MACD os = macd // Check if we get new Pivot High Or Pivot Low float ph = ta.pivothigh((source == close ? close : high), l_prd, r_prd) float pl = ta.pivotlow((source == close ? close : low), l_prd, r_prd) // keep values and positions of Pivot Highs/Lows in the arrays var int maxarraysize = 20 var ph_positions = array.new_int(maxarraysize, 0) var pl_positions = array.new_int(maxarraysize, 0) var ph_vals = array.new_float(maxarraysize, 0.) var pl_vals = array.new_float(maxarraysize, 0.) var ph_os = array.new_float(maxarraysize, 0.) var pl_os = array.new_float(maxarraysize, 0.) // add PHs to the array if ph array.unshift(ph_positions, bar_index-r_prd) array.unshift(ph_vals, ph) array.unshift(ph_os, os[r_prd]) if array.size(ph_positions) > maxarraysize array.pop(ph_positions) array.pop(ph_vals) array.pop(ph_os) plot(close) nrd = false div = false ////negative Regular Divergences for x = 0 to maxpp // 获取历史枢轴点的位置和价格 hist_ph_pos = array.get(ph_positions, x) hist_ph_val = array.get(ph_vals, x) hist_ph_os = array.get(ph_os, x) len = bar_index - hist_ph_pos if hist_ph_pos == 0 or len > maxbars break // 确认是顶背离形态(价格新高,指标新低) if ph and ph > hist_ph_val and os[r_prd] < hist_ph_os nrd := true // 计算两个枢轴点连线的斜率(价格) price_slope = (ph - hist_ph_val) / len // 计算两个枢轴点连线的斜率(指标) os_slope = (os[r_prd] - hist_ph_os) / len is_valid_div = true // 遍历两个枢轴点之间的所有K线 for y = 1 to len - 1 // 当前遍历的K线位置:最新枢轴点往回数y根 current_bar_pos = bar_index - r_prd - y // 计算该位置假设线的价格(基于两个枢轴点的连线) expected_price = ph - price_slope * y // 计算该位置假设线的指标值 expected_os = os[r_prd] - os_slope * y // 顶背离要求中间价格不突破假设线,指标也不突破假设线 if close[current_bar_pos] > expected_price or os[current_bar_pos] < expected_os is_valid_div := false break if is_valid_div div := true line.new(x1=bar_index-r_prd, y1=ph, x2=hist_ph_pos, y2=hist_ph_val, color=color.red)
修改说明
- 修正斜率计算:直接用两个枢轴点的价格差除以间隔K线数,得到准确的连线斜率。
- 调整假设线Y值计算:基于最新枢轴点的位置和价格,推导每个中间K线对应的假设线价格,符合两点连线的坐标逻辑。
- 优化循环逻辑:遍历两个枢轴点之间的所有K线,只要有一根K线不符合条件就标记为无效背离,仅在所有中间K线都满足条件时才绘制背离线。
内容的提问来源于stack exchange,提问作者hasan ahmadi
相关产品推荐
相关产品推荐

