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

如何在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)

关键修改说明

  1. 峰值判定逻辑:重构isPeak函数,支持传入索引判断任意历史K线是否为峰值,同时排除未完成的当前K线及首根K线(无相邻K线可对比)
  2. 范围控制:严格遍历1到lookbackPeriod区间,确保只在最近15根已完成的K线内查找峰值
  3. 最接近价格筛选:通过计算峰值与当前价格的差值绝对值,动态更新最小差值对应的峰值,精准定位最接近的目标
  4. 变量重置机制:利用barstate.isnew在每根新K线生成时重置数组和变量,保证每次计算的独立性和准确性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:40:34