TradingView PineScript v5获取准确EPS历史数据问题求助
解决PineScript v5中EPS同比数据不受图表周期/标的影响的问题
原代码的核心问题在于跨周期引用逻辑错误:你在request.security里引用了当前图表周期的currEps变量,而currEps的返回值会随当前图表周期变化(比如1小时和日线周期下,currEps的bar索引对应完全不同的时间点),导致prevEps的取值完全混乱。另外lookahead_on会引入未来数据,进一步放大误差。
要获取稳定的季度EPS同比数据,必须直接在季度周期(3M)内完成当前和去年同期EPS的获取,完全脱离当前图表周期的影响。同时要处理标的切换时的数据重置,避免残留旧标的数据。
修正后的代码
//@version=5 indicator("EPS YoY Quarter Growth", overlay=false) // 定义颜色常量(若未全局定义则添加) colorIndAbove = color.new(color.green, 0) colorIndBelow = color.new(color.red, 0) colorIndNeutral = color.new(color.gray, 0) // EPS同比增长率计算函数 getEpsYrQtGrowth() => float epsGrowthAbove = input.float(defval = 0.25, title = "EPS(YQ) ▲ 阈值(%)", minval = -100, step = 0.01, inline="EPS Growth", group = "Fundamental") float epsGrowthBelow = input.float(defval = 0.2, title = "▼ 阈值(%)", minval = 0, step = 0.01, inline="EPS Growth", group = "Fundamental") // 直接在3M周期内获取当前季度和去年同期的EPS数据 [currQtrEps, prevYrSameQtrEps] = request.security(syminfo.tickerid, "3M", [ request.earnings(syminfo.tickerid, earnings.actual, ignore_invalid_symbol=true, lookahead=barmerge.lookahead_off), // 3M周期下,4个bar对应去年同期的季度(12个月) request.earnings(syminfo.tickerid, earnings.actual, ignore_invalid_symbol=true, lookahead=barmerge.lookahead_off)[4] ], lookahead=barmerge.lookahead_off ) // 计算增长率,处理空值和除数为0的情况 float epsGrowth = nz(prevYrSameQtrEps) == 0 ? na : (currQtrEps - prevYrSameQtrEps) / nz(prevYrSameQtrEps) epsGrowth = nz(epsGrowth) // 确定显示颜色 color epsGrowthColor = epsGrowth >= epsGrowthAbove ? colorIndAbove : epsGrowth <= epsGrowthBelow ? colorIndBelow : colorIndNeutral fundamentalObject.new(value = epsGrowth, color = epsGrowthColor) // 调用函数 getEpsYrQtGrowth()
关键改动说明
- 完全脱离当前图表周期:通过
request.security直接在季度周期中获取数据,不管当前图表是1分钟还是日线,都从统一的3M周期取EPS,彻底避免周期切换带来的偏差 - 关闭未来数据:所有
lookahead设为barmerge.lookahead_off,避免提前获取未公布的EPS,保证数据真实性 - 自动适配标的切换:去掉非input变量的
var声明,request.security会随标的切换自动重新获取对应标的的季度数据,不会残留旧标的数据 - 严谨的异常处理:用
nz()处理EPS为空或除数为0的情况,避免出现无效计算值
内容的提问来源于stack exchange,提问作者Henry Oliver
相关产品推荐
相关产品推荐

