You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PineScript 5背离代码求助:背离点与收盘价假设线对比异常

PineScript 5 背离检测代码:假设线对比问题排查

核心问题

你编写的背离检测代码在验证两个枢轴点之间的K线是否穿过假设线时逻辑错误,导致无法正确识别有效背离。

代码问题分析

  1. 斜率计算逻辑错误
    原代码用当前收盘价和历史收盘价计算斜率,而假设线应该连接的是两个枢轴点的价格,而非当前K线收盘价,偏离了"连接两个枢轴点"的核心逻辑。
    原错误代码:

    slope1 = math.abs(close-close[len])/len
    
  2. 假设线Y值判断逻辑错误
    原代码用当前收盘价减去斜率乘偏移量计算假设线价格,不符合两个枢轴点连线的坐标逻辑,应该基于最新枢轴点的价格和位置推导历史K线对应的假设线价格。

  3. 循环计数与终止条件错误
    原代码中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)

修改说明

  1. 修正斜率计算:直接用两个枢轴点的价格差除以间隔K线数,得到准确的连线斜率。
  2. 调整假设线Y值计算:基于最新枢轴点的位置和价格,推导每个中间K线对应的假设线价格,符合两点连线的坐标逻辑。
  3. 优化循环逻辑:遍历两个枢轴点之间的所有K线,只要有一根K线不符合条件就标记为无效背离,仅在所有中间K线都满足条件时才绘制背离线。

内容的提问来源于stack exchange,提问作者hasan ahmadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:40:18