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

