Pine Script中使用varip变量无法捕获实时Bar内值的问题求助
跨时间帧捕获Bar内特定时间点数据的问题与解决方法
场景与测试代码
需求是用varip变量实时捕获Bar内数据,例如在5分钟Bar的第2分钟节点捕获最高价。以下是简化测试代码:
//@version=5 indicator("My script", overlay=true) varip float h0 = na varip float h2 = na varip float h5 = na d = 8 hr = 0 min = 10 capture_time_0 = time == timestamp(year, month, d, hr, min + 0) capture_time_2 = time == timestamp(year, month, d, hr, min + 2) capture_time_5 = time == timestamp(year, month, d, hr, min + 5) h0 := capture_time_0 ? high + 0 : h0 h2 := capture_time_2 ? high + 2 : h2 h5 := capture_time_5 ? high + 5 : h5 plot(h0, color=color.white, linewidth = 3) plot(h2, color=color.fuchsia, linewidth = 3) plot(h5, color=color.yellow, linewidth = 3) plot(high, color=color.blue)
代码逻辑:varip变量h0、h2、h5初始化为na,捕获时间设定为交易所时间7月8日00:10之后的0、2、5分钟。当到达指定捕获时间时,变量会被赋值为当时的high值并加上对应偏移量(用于图形区分);时间离开捕获点后,变量保留捕获值并与high一同绘制。
问题现象
在实时1分钟图表中一切正常,但切换到5分钟时间帧时,h2(紫红色线)缺失——它是唯一的Bar内捕获值(对应5分钟Bar的第2分钟)。测试发现该问题在所有时间帧中普遍存在:仅能捕获Bar起始和结束时刻的值,无法捕获中间的Bar内值,尽管varip设计用于保留Bar内值,但此场景下无法生效。
中间尝试:基于timenow的捕获区间优化
根据建议,将time替换为timenow,并设置5秒的捕获区间而非精确时间,代码调整如下:
capture_time_0 = timenow >= timestamp(year, month, d, hr, min + 0) and timenow <= timestamp(year, month, d, hr, min + 0) + 5000 capture_time_2 = timenow >= timestamp(year, month, d, hr, min + 2) and timenow <= timestamp(year, month, d, hr, min + 2) + 5000 capture_time_5 = timenow >= timestamp(year, month, d, hr, min + 5) and timenow <= timestamp(year, month, d, hr, min + 5) + 5000
此方法能捕获所有时间点的数据,但存在明显缺陷:
- 捕获的是区间内某时刻的
high,而非区间内的真实最高价; - 区间时长受标的活跃度影响;
- 切换时间帧后数据无法迁移。
最终跨时间帧解决方案
针对不同时间帧场景,采用两种处理逻辑:
- 当捕获时间跨度大于当前图表时间帧时,使用
ta.highest或ta.lowest识别开盘区间的高低点; - 当捕获时间跨度小于当前图表时间帧时,使用
request.security_lower_tf获取低时间帧数据存入数组,再结合var变量、array.max、array.min和array.slice提取捕获区间的高低点。
局限性
该方法适用于所有时间帧,但在低流动性标的中存在问题:数组填充时若无交易则不会插入na,导致基于数组位置的提取出现异常。
内容的提问来源于stack exchange,提问作者paamachat
相关产品推荐
相关产品推荐

