Pine Script策略与指标barstate.islast收盘前取值差异问题
barstate.islast在策略与指标中取值差异的底层原因 这个差异是TradingView针对指标、策略两类脚本的设计目标不同,默认计算规则不同导致的,没有特殊黑盒逻辑:
- 指标的核心目标是实时展示行情数据,默认开启逐tick更新:只要未收盘的实时K线有新成交,指标就会立刻重算。在指标的计算上下文里,眼前正在波动的这根未收盘K线,就是当前K线序列的最后一根,所以
barstate.islast会返回true。 - 策略的核心目标是保证回测结果可复现、和实盘表现对齐,默认仅在K线收盘后才触发正式计算:如果默认就让策略在未收盘K线上把当前K线判定为"最后一根K线",很容易出现回测时用了K线走完才确定的价格(比如收盘价、最终高低点)生成信号,实盘却因为K线中途价格波动反复触发信号的问题,也就是常说的未来函数偏差。为了从规则层面避免这个问题,默认配置下策略不会把还没收完的实时K线算入"已确认的K线序列",此时
barstate.islast标记的是上一根已经收盘的确认K线,所以在未收盘的实时K线上,这个变量自然返回false。
观察到的补充现象完全匹配这个逻辑
- 等5分钟K线收盘后,这根K线变成了已确认的历史K线,策略和指标的计算基准完全对齐,二者的
barstate.islast取值就会完全一致。 - 给策略声明加上
calc_on_every_tick = true参数后,策略就会切换到和指标一样的逐tick实时计算模式,放弃默认的收盘确认保护机制,此时它的barstate.islast取值表现就和指标完全相同了。
注意:非必要不要随便给策略开
calc_on_every_tick = true,开启后回测很容易因为用到未收盘K线的临时价格出现虚高的收益表现,实盘运行时也可能出现信号反复闪烁、重复下单的问题。
复现代码
测试指标
//@version=5 indicator("Test Indicator", overlay=true) plotchar(barstate.islast, "islast", "", location = location.top, size = size.tiny)
测试策略
//@version=5 strategy("Test Strategy", overlay=true) plotchar(barstate.islast, "islast", "", location = location.top, size = size.tiny)


内容的提问来源于stack exchange,提问作者Cássio
相关产品推荐
相关产品推荐

