如何在PineScript中获取最近15根K线内最接近当前价格的峰值?
问题分析与代码修正
原代码核心问题
peak定义仅针对单根K线,未生成全序列的峰值标记,无法遍历历史K线判断峰值状态seriesshortner函数逻辑错误,最终仅返回指定区间的最后一根K线收盘价,无实际筛选作用- 未实现「最接近当前价格」的筛选逻辑,仅简单赋值峰值价格,无法完成需求
- 范围控制混乱,未严格限制在最近15根K线内查找
修正后的代码
//@version=5 indicator("最近15根K线内最接近当前价的峰值", overlay=true) // 判断指定索引的K线是否为峰值:收盘价高于左右相邻K线(排除边界K线) isPeak(index) => if index == 0 or index == bar_index false else close[index] > close[index-1] and close[index] > close[index+1] lookbackPeriod = 15 // 最近15根K线范围 currentPrice = close[0] // 初始化存储变量:峰值价格数组、最小差值、目标峰值 var float[] peakPrices = array.new_float() var float minDiff = na var float targetPeak = na // 每根新K线生成时重置变量,保证计算准确性 if barstate.isnew array.clear(peakPrices) minDiff := na targetPeak := na // 遍历最近15根已完成的K线(从当前往前数1到15根) for i = 1 to lookbackPeriod if isPeak(i) peakPrice = close[i] array.push(peakPrices, peakPrice) // 计算当前峰值与当前价格的差值绝对值 currentDiff = math.abs(peakPrice - currentPrice) // 更新最小差值及对应峰值 if na(minDiff) or currentDiff < minDiff minDiff := currentDiff targetPeak := peakPrice // 可视化输出结果 plot(targetPeak, color=color.red, style=style_circles, size=size.small, title="最接近当前价的峰值") label.new(bar_index, targetPeak, str.tostring(targetPeak, "#.####"), color=color.red, textcolor=color.white, style=label.style_label_down)
关键修改说明
- 峰值判定逻辑:重构
isPeak函数,支持传入索引判断任意历史K线是否为峰值,同时排除未完成的当前K线及首根K线(无相邻K线可对比) - 范围控制:严格遍历
1到lookbackPeriod区间,确保只在最近15根已完成的K线内查找峰值 - 最接近价格筛选:通过计算峰值与当前价格的差值绝对值,动态更新最小差值对应的峰值,精准定位最接近的目标
- 变量重置机制:利用
barstate.isnew在每根新K线生成时重置数组和变量,保证每次计算的独立性和准确性
内容的提问来源于stack exchange,提问作者Roboman Robo
相关产品推荐
相关产品推荐

