Pine Script区间盘整(Range bound)指标全图表标注配置方法
标普500指数($SPX)曾连续约12个交易日处于区间盘整(Range bound)状态,整个盘整区间的波动幅度略超100点。
我一开始写了个简易指标,用来识别价格在固定区间内运行的时段,代码如下:
//@version=5 indicator("My script", "", true) val = close[0] n = ta.barssince(math.abs(val - close[1]) > 50) if n > 1 label.new(bar_index, hl2[1], str.tostring(n), color = color(na), textcolor = color.orange)
这个版本的逻辑很简单:从当前K线向前回溯,直到找到收盘价和当前K线收盘价差值超过50的K线,统计中间连续满足价差小于50的K线数量。
在之前观察到的12天盘整区间里,这个指标基本能正常运行:
但这个指标有个明显异常:把K线视图缩小、展示更长时间周期的历史走势时,其他历史区间里符合盘整特征的位置完全没有指标标签显示:
按照指标的判断逻辑,图上明明有大量符合盘整条件、应该显示标签的区间,这个表现明显不符合预期。
怎么调整这个盘整识别指标,才能让它在全图表所有符合条件的位置都正常显示标注?
我一开始以为是ta.barssince函数的问题,试着改用while循环重写了判断逻辑,但测下来显示效果和初始版本没什么区别:
//@version=5 indicator("Range Bound - while", "", true) n = 1 while math.abs(close - close[n]) < 50 n := n + 1 if n > 1 label.new(bar_index, hl2[1], str.tostring(n), color = color(na), textcolor = color.orange)
后来靠Bjorn提供的思路找到了问题根源:
Pine Script默认配置下,单张图表最多只允许绘制50个左右的绘图对象,包括线段、标签等所有可视化元素。
明白原因后我先做了第一步调整:把标签触发条件从n > 1改成n > 50,只有连续盘整K线数足够多的时候才绘制标签,改完之后已经能显示更多标签了:
if n > 50 label.new(bar_index, high, str.tostring(n), color = color(na), textcolor = color.orange)
之后我又做了几处优化:在indicator声明里加max_labels_count=500参数把标签数量上限提到500,给while循环加了最多回溯1000根K线的边界判断避免脚本超时,同时把价差阈值调整为55。优化后的完整代码如下:
//@version=5 indicator("Range Bound - while", "", true, max_labels_count=500) n = 1 while true if n > 1000 n := 0 break if (math.abs(close - close[n]) > 55) break n := n + 1 if n > 50 label.new(bar_index, high, str.tostring(n), color = color(na), textcolor = color.orange)
优化完成后,图表上所有符合条件的盘整区间都能正常显示标签了:
内容的提问来源于stack exchange,提问作者dharmatech

