如何在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
相关产品推荐
相关产品推荐

