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

如何在Pine Script中查找并标记两个峰值间的最低谷点?

问题说明

我尝试用以下Pine Script代码查找并标记两个峰值之间的最低谷点,但结果有时不准确。我通过ta.pivothigh识别峰值,ta.pivotlow识别谷点,需求是:当检测到的新峰值高于前一个峰值时,在这两个峰值之间的最低谷点位置添加标记。

//@version=5
indicator("K Ksiw", overlay=true, calc_bars_count = 300)

kac_mum = input.int(2, 'Swing Length')

Tepe = ta.pivothigh(high, kac_mum, kac_mum)
Dip = ta.pivotlow(low, kac_mum, kac_mum)

color CLEAR = color.rgb(0, 0, 0, 100)

var int   Tepe_indexi      = na
var float Onceki_Tepe      = 0.000000
var int   Onceki_Tepe_indx = na
var bool  Tepe_Aktif       = na 
bool      Tepe_Varmi       = na 

var int     Dip_indexi      = na
var int     sonDip_indexi   = na

Dip_indexi :=  not na(Dip) ? bar_index - kac_mum : Dip_indexi
fiyatlar_array = array.new_float()


if not na(Tepe) and Tepe > Onceki_Tepe 
    
    Tepe_indexi      := bar_index - kac_mum      
    Tepe_Varmi       := true 
    Tepe_Aktif       := true
    if not na( Onceki_Tepe_indx ) and Dip_indexi > Onceki_Tepe_indx and Dip_indexi < Tepe_indexi
        
        sonDip_indexi := Dip_indexi - 2
        ff= low[Dip_indexi ]
        fiyatlar_array.push(ff)
        bulunan_F = array.min(fiyatlar_array)
        label.new(bar_index, ff, color = color.white, style = label.style_arrowup, yloc =yloc.belowbar)
        ///label.new(sonDip_indexi, low , color = color.white, style = label.style_arrowup, yloc =yloc.belowbar)


    Onceki_Tepe      := Tepe
    Onceki_Tepe_indx := bar_index - kac_mum

if Tepe_Varmi

    label.new(Tepe_indexi, Tepe,"HH", color=CLEAR, style=label.style_label_down, textcolor=color.yellow)
问题分析与修正方案

你的代码存在几个导致结果不准确的核心问题:

  • 数组逻辑错误:每次触发新峰值时重新创建数组,无法累积区间内所有谷点;且仅加入单个谷点,无法找到真正的最小值。
  • 谷点判断局限:仅验证单个谷点是否在峰值区间内,会遗漏区间内其他谷点。
  • 标记位置错误:标记创建在当前峰值的K线位置,而非谷点所在的K线位置。

以下是修正后的代码:

//@version=5
indicator("K Ksiw", overlay=true, calc_bars_count = 300)

kac_mum = input.int(2, 'Swing Length')

Tepe = ta.pivothigh(high, kac_mum, kac_mum)
Dip = ta.pivotlow(low, kac_mum, kac_mum)

color CLEAR = color.rgb(0, 0, 0, 100)

var int   Onceki_Tepe_indx = na
var float Onceki_Tepe      = 0.0
// 存储区间内谷点的[索引, 价格]信息
var array<float[]> aralik_dipleri = array.new_float()

// 收集前一个峰值之后出现的所有谷点
if not na(Dip)
    dip_indeksi = bar_index - kac_mum
    dip_fiyati = low[dip_indeksi]
    if not na(Onceki_Tepe_indx) and dip_indeksi > Onceki_Tepe_indx
        array.push(aralik_dipleri, array.new_float(2, dip_indeksi, dip_fiyati))

// 检测到更高峰值时,处理区间内的谷点
if not na(Tepe) and Tepe > Onceki_Tepe
    yeni_tepe_indx = bar_index - kac_mum
    label.new(yeni_tepe_indx, Tepe, "HH", color=CLEAR, style=label.style_label_down, textcolor=color.yellow)
    
    // 遍历找到区间内最低的谷点
    if array.size(aralik_dipleri) > 0
        en_dusuk_dip_fiyat = 999999.0
        en_dusuk_dip_indx = na
        for i = 0 to array.size(aralik_dipleri) - 1
            dip_bilgisi = array.get(aralik_dipleri, i)
            mevcut_dip_fiyat = array.get(dip_bilgisi, 1)
            if mevcut_dip_fiyat < en_dusuk_dip_fiyat
                en_dusuk_dip_fiyat = mevcut_dip_fiyat
                en_dusuk_dip_indx = array.get(dip_bilgisi, 0)
        
        // 在最低谷点位置添加标记
        if not na(en_dusuk_dip_indx)
            label.new(en_dusuk_dip_indx, en_dusuk_dip_fiyat, color=color.white, style=label.style_arrowup, yloc=yloc.belowbar)
    
    // 更新峰值信息并清空谷点数组
    Onceki_Tepe = Tepe
    Onceki_Tepe_indx = yeni_tepe_indx
    array.clear(aralik_dipleri)
修正说明
  • 谷点全量收集:只要谷点出现在前一个峰值之后,就存入数组,确保覆盖两个峰值间的所有谷点。
  • 精准查找最低谷点:遍历数组比较所有谷点价格,找到真正的最小值及其索引。
  • 标记位置修正:标记直接创建在谷点对应的K线位置,符合需求逻辑。
  • 数组复用:每次处理完新峰值后清空数组,为下一个峰值区间做准备。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:13:16