尚未出现的 request.security() 值 笔记

尚未出现的 request.security() 值

当策略在回测中盈利但在实盘中亏损时,人们常归咎于滑点,但首先应检查 Pine Script 中 request.security() 函数的特定原因。此问题由 TradingView 记录,涉及更高时间框架数据的使用方式。默认情况下,request.security() 使用 barmerge.lookahead_off,以防止未来数据泄露。然而,为避免感知到的单根 K 线滞后而设置 lookahead=barmerge.lookahead_on,会引入一个关键缺陷。该设置允许历史回补数据纳入实盘中尚未可用的数据。例如,一个将当前价格与更高时间框架收盘价进行比较的策略,在回测中会对日内 K 线使用未来的收盘价;而在实盘中,该未来数据并不存在,从而导致差异。此问题具有隐蔽性,因为在实盘中难以察觉。在实时交易期间,lookahead_on 和 lookahead_off 序列显示相同的值,因为此时不存在未来数据。然而,一旦实时 K 线收盘并变为历史数据,它就会“重绘”,利用完整的历史记录重新计算,从而与实盘中观察到的结果产生分歧。这意味着看似正常的实盘会话,在图表重新加载后可能完全改变。另一种相关变体出现在 request.security() 用于等于或低于图表自身分辨率的时间框架时。此时,lookahead 设置决定了返回哪一根 intrabar(K 线内)的值,可能导致回测与实盘执行之间的不匹配。为诊断此问题,脚本用户应检查所有 request.security() 调用中是否存在"lookahead_on"。若发现,需验证是否应用了明确的历史偏移量。此外,请确认相同或更低时间框架请求中的 intrabar 选择。重绘的一个直接症状是:在脚本重新加载后,最近已收盘 K 线上的数值发生变化。区分历史可用数据与实盘中可获知数据这一关键区别,对于策略的可靠表现至关重要。