如何在可变数量K线中确定高低价及对应K线编号?函数使用疑问
解决可变K线范围的高低价及相关函数用法问题
一、highestall() / lowestall() 函数用法
这两个函数用于遍历当前图表已加载的全部K线,直接返回全局范围内的最高/最低价,无需额外参数(部分平台支持可选参数,但核心逻辑是覆盖全量K线)。示例代码:
// 获取全图表历史最高价 globalHigh = highestall(high) // 获取全图表历史最低价 globalLow = lowestall(low)
如果需要限定到“从上市到当前K线”这类全局区间,直接调用即可,它们会自动处理所有已存在的K线数据。
二、getvalue() 函数用法
getvalue() 是提取指定索引位置单根K线数据的工具,语法为 getvalue(source, offset):
source:目标数据源(如high、close、volume)offset:偏移K线数(0代表当前K线,1代表前一根,以此类推)
示例代码:
// 获取前3根K线的收盘价 prev3Close = getvalue(close, 3) // 获取当前K线的开盘价(等价于直接写open) currentOpen = getvalue(open, 0)
它的适用场景是你明确需要某一根特定K线的数值,而非范围类统计。
三、可变K线范围的最高价/最低价及对应K线编号
针对旧版highest()不支持变量参数的问题,可通过循环遍历+手动比较实现;新版Pine Script则有更简洁的方案:
1. 通用循环实现(兼容旧版)
假设lookbackLength是你动态计算的K线范围长度(比如金叉以来的K线数):
// 示例:定义可变范围——最近一次5日均线上穿20日均线以来的K线数 lookbackLength = ta.barssince(ta.crossover(ta.sma(close,5), ta.sma(close,20))) + 1 // 初始化变量存储结果 var float rangeHigh = na var int highBarIndex = na var float rangeLow = na var int lowBarIndex = na // 范围变化时重新计算 if lookbackLength != lookbackLength[1] rangeHigh = low // 初始化起点 rangeLow = high highBarIndex = bar_index lowBarIndex = bar_index // 遍历范围内所有K线 for i = 0 to lookbackLength - 1 currentHigh = getvalue(high, i) currentLow = getvalue(low, i) // 更新最高价及对应K线编号 if currentHigh > rangeHigh rangeHigh = currentHigh highBarIndex = bar_index - i // 更新最低价及对应K线编号 if currentLow < rangeLow rangeLow = currentLow lowBarIndex = bar_index - i
2. 新版Pine Script简化方案
Pine Script v5及以上版本中,ta.highest()已支持变量参数,搭配ta.valuewhen()可直接获取对应K线编号:
lookbackLength = 15 // 可变长度,可根据条件动态调整 rangeHigh = ta.highest(high, lookbackLength) rangeLow = ta.lowest(low, lookbackLength) // 获取最高价对应的最新K线编号 highBarIndex = ta.valuewhen(high == rangeHigh, bar_index, 0) // 获取最低价对应的最新K线编号 lowBarIndex = ta.valuewhen(low == rangeLow, bar_index, 0)
ta.valuewhen()的第三个参数0表示取最近一次满足条件的K线编号,若要取更早的可调整为1、2等。
内容的提问来源于stack exchange,提问作者BeetleBum
相关产品推荐
相关产品推荐

