You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pine Script指标开发:固定日期连续收益率振荡器负值显示问题排查

问题解决:Velocity/ROR指标无法显示负值的修复方案

问题根源

  1. ROC公式逻辑错误:原代码中ROC的分子写反,导致价格下跌时计算结果为正值,无法正确反映下跌变动率
  2. 天数计数逻辑漏洞:原日期判断条件无法处理跨月、跨年的情况,会导致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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:35:23