Pine Script指标开发:固定日期连续收益率振荡器负值显示问题排查
问题解决:Velocity/ROR指标无法显示负值的修复方案
问题根源
- ROC公式逻辑错误:原代码中ROC的分子写反,导致价格下跌时计算结果为正值,无法正确反映下跌变动率
- 天数计数逻辑漏洞:原日期判断条件无法处理跨月、跨年的情况,会导致
delta计数不准确
修复后的完整代码
//@version=4 study("Velocity/ROR", shorttitle="vel", overlay=false) // 改为非叠加面板,更适合振荡器展示 // 起始日期输入 timeYear = input(2022, title="起始年份", minval=1991, maxval=2100, type=input.integer) timeMonth = input(1, title="起始月份", minval=1, maxval=12, type=input.integer) timeDay = input(4, title="起始日期", minval=1, maxval=31, type=input.integer) timeHours = input(9, title="起始小时", minval=0, maxval=23, type=input.integer) timeMinutes = input(30, title="起始分钟", minval=0, maxval=59, type=input.integer) // 转换为时间戳,避免日期判断漏洞 startTime = timestamp(timeYear, timeMonth, timeDay, timeHours, timeMinutes) // 初始化天数计数器 var int delta = 0 // 重置计数器:当bar时间等于起始时间时重置为0 if time == startTime delta := 0 // 累计天数:当前bar时间晚于起始时间时,每根bar加1 else if time > startTime delta += 1 // 获取起始日的价格 startPrice = close[delta] // 计算正确的累计ROC:(当前价格 - 起始价格)/起始价格 * 100 roc = 100 * (close - startPrice) / startPrice // 计算Velocity/ROR,处理delta为0的情况避免除以0 ror = delta > 0 ? roc / delta : na // 绘图 plot(delta, title="已过天数", color=color.green, display=display.data_window) plot(roc, title="累计ROC", color=#2962FF, display=display.data_window) plot(ror, title="Velocity/ROR", color=color.yellow)
关键修改说明
- 时间戳判断:用
timestamp函数将输入的起始日期转换为时间戳,通过time变量直接比较,解决跨月、跨年的计数错误 - ROC公式修正:将分子改为
close - startPrice,价格低于起始价时会得到负值,正确反映下跌变动率 - 除以0防护:使用三元运算符
delta > 0 ? roc / delta : na,避免起始日当天除以0的错误 - 展示优化:将
overlay改为false,让振荡器在独立面板展示,避免干扰主图价格
内容的提问来源于stack exchange,提问作者lvbx9
相关产品推荐
相关产品推荐

