PineScript疑问:图表与request.security计算的EMA值为何不一致?
TradingView中request.security计算的200周期EMA与直接计算值存在差异
问题详情
在TradingView中选择SPY作为图表标的时,通过request.security函数计算的200周期EMA(指数移动平均线)值,与直接使用图表close变量计算的EMA值不一致。尝试调整max_bars_back参数,未对request.security的行为产生影响。
测试结果
测试得到以下数值:
- Ema Sec1 = $417.848
- Ema Sec2 = $417.848
- Ema Chart = $415.278 <=== 此数值为正确值!
问题代码
//@version=5 indicator("EMA not working") // 选择SPY作为图表标的 [price,ema_security1]= request.security("SPY","D",[close,ta.ema(close,200)]) ema_security2 = ta.ema(price,200) ema_chart = ta.ema(close,200) var table _table = table.new(position.bottom_right, 4 , 4 ) table.cell(_table, 0, 0, "EMA Sec1", text_size="huge",bgcolor=color.orange) table.cell(_table, 0, 1, str.tostring(ema_security1, '#.###'), text_size="huge", bgcolor=color.yellow) table.cell(_table, 1, 0, "EMA Sec2", text_size="huge",bgcolor=color.orange) table.cell(_table, 1, 1, str.tostring(ema_security2, '#.###'), text_size="huge", bgcolor=color.yellow) table.cell(_table, 2, 0, "EMA Chart", text_size="huge",bgcolor=color.orange) table.cell(_table, 2, 1, str.tostring(ema_chart, '#.###'), text_size="huge", bgcolor=color.yellow)
原因分析
- 时间周期不匹配:
request.security("SPY","D",...)请求的是SPY的日线级别已完成K线数据,计算EMA用的是200个完整日线收盘价;而直接用ta.ema(close,200)时,使用的是当前图表时间周期(如分钟/小时级)的收盘价序列,包含未完成的当前K线价格,且是200个当前周期的K线,两者的计算基数完全不同。 - max_bars_back无效:该参数仅控制指标回溯的历史K线数量,和
request.security的跨周期数据对齐逻辑无关,因此调整它无法消除差异。
解决方案
- 若图表为日线周期:此时
request.security请求的日线数据与图表close完全一致,两者计算的EMA数值会自动匹配。 - 若图表为低时间周期:
- 若需要计算200个当前周期的EMA:直接使用
ta.ema(close,200)即可,无需通过request.security。 - 若需要计算200日线EMA并在低周期图表显示:这种差异是跨周期数据的正常特性,此时
request.security的结果是正确的日线EMA,而图表直接计算的是当前周期的EMA,两者本就不同。
- 若需要计算200个当前周期的EMA:直接使用
内容的提问来源于stack exchange,提问作者Nelson Pesce
相关产品推荐
相关产品推荐

