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

如何在Pine Script的levels数组中查找最接近当前价格的值?

如何在Pine Script的已排序数组中找到最接近当前价格的值

嘿,你已经把数组排序好了,这一步帮了大忙——排序后我们可以更高效地定位到最接近当前价格的元素,不用傻乎乎地遍历整个数组。下面给你两种实用的实现思路,优先推荐第一种,能充分利用排序数组的特性提升效率:

方法1:基于二分查找的高效实现

因为你的levels数组已经按升序排好序了,我们可以借助二分查找快速定位到第一个大于当前价格的元素,再对比它和前一个元素哪个离当前价格更近。同时还要处理两种边界情况:

  • 所有元素都比当前价格小:直接取数组最大值
  • 所有元素都比当前价格大:直接取数组最小值

我把这个逻辑封装成了一个自定义函数findClosestValue,你可以直接调用:

//@version=5
indicator("Find Closest Level", overlay=true)

// 自定义函数:从已排序的浮点数数组中找到最接近目标值的元素
float findClosestValue(array<float> sortedArray, float target) =>
    arraySize = array.size(sortedArray)
    if arraySize == 0
        na // 空数组返回na
    // 边界情况1:所有元素都小于目标值
    if target >= array.get(sortedArray, arraySize - 1)
        array.get(sortedArray, arraySize - 1)
    // 边界情况2:所有元素都大于目标值
    else if target <= array.get(sortedArray, 0)
        array.get(sortedArray, 0)
    else
        // 找到第一个大于目标值的元素索引(二分查找返回插入位置)
        idx = array.binary_search(sortedArray, target)
        valAbove = array.get(sortedArray, idx)
        valBelow = array.get(sortedArray, idx - 1)
        // 比较哪个元素更接近目标值
        if (target - valBelow) <= (valAbove - target)
            valBelow
        else
            valAbove

// 你的原有代码逻辑
levels = array.new_float()
// 示例值,替换成你自己的valOne/valTwo/valThree即可
valOne = ta.low[1]
valTwo = ta.low[2]
valThree = ta.low[3]
array.push(levels, valOne)
array.push(levels, valTwo)
array.push(levels, valThree)
array.sort(levels, order.ascending)

// 获取当前价格(这里用收盘价,你可以换成open/high/low等)
currentPrice = close

// 调用函数找到最接近的水平位
closestLevel = findClosestValue(levels, currentPrice)

// 绘制结果
plot(closestLevel, color=color.new(color.blue, 0), title="Closest Level", linewidth=2)

// 清除数组用于下一轮迭代
array.clear(levels)

代码说明:

  • array.binary_search是Pine Script内置的二分查找函数,在已排序数组中会返回目标值的插入位置,也就是第一个大于目标值的元素索引,比遍历整个数组高效很多。
  • 我们提前处理了空数组、所有元素都在目标值一侧的边界情况,避免出现索引越界的错误。
  • 最后通过计算绝对差值,返回离目标值更近的那个元素。

方法2:暴力遍历数组(简单直观)

如果你的数组元素数量很少(比如示例里的3个),暴力遍历所有元素计算差值也是完全可行的,逻辑更简单:

float findClosestValueBruteForce(array<float> arr, float target) =>
    closestVal = na
    minDiff = na
    for val in arr
        diff = math.abs(target - val)
        if na(minDiff) or diff < minDiff
            minDiff = diff
            closestVal = val
    closestVal

这个函数会逐个遍历数组元素,计算每个元素和目标值的绝对差,记录差值最小的元素。适合元素数量少的场景,两种方法的效率差异可以忽略。

注意事项

  • 方法1必须依赖已排序的数组,方法2则不需要排序。
  • 如果出现两个元素和目标值的差值完全相同(比如目标值正好在两个元素中间),方法1会返回较小的那个元素,你可以根据需求调整逻辑(比如返回较大的,或者任意一个)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:07:28