Pine Script 收盘与K线内:重绘、提醒和 calc_on_every_tick
3分钟阅读 · 更新于
一个在历史上看起来很干净的 Pine Script,实盘时可能触发之后又消失的信号。几乎所有情况都归结为一个问题:脚本处理的是已收盘的K线,还是仍在形成的K线?
本指南介绍控制这一点的每个设置,以及我给价位提醒使用的设置。
历史K线与实时K线
在历史上,Pine 对每根K线只在收盘时运行一次脚本。在实时K线上,每次价格更新都会再次运行。像close > level这样的条件,可能在10:01为真,在10:03为假,到10:04又变为真。历史只保留最后的答案。这个差异就是交易者所说的重绘。
barstate.isconfirmed
barstate.isconfirmed只在K线的最后一次更新,也就是收盘时为真。把它加入条件后,实时K线的表现就和历史一致:
crossUp = ta.crossover(close, level) and barstate.isconfirmed
plotshape(crossUp, style=shape.triangleup, location=location.belowbar)
alertcondition(crossUp, "Close above level")
代价是速度。你在K线收盘时才拿到信号,在较慢的周期上要晚一整根K线。
提醒频率
创建提醒时,TradingView会问你它多久可以触发一次:
- Once Per Bar Close:只在K线收盘且条件为真时触发。与回测一致。
- Once Per Bar:条件在K线内第一次变为真时就触发,即使K线最终收在相反的方向。
- Once Per Minute和Only Once:对触发次数的限制。
对价位提醒,我在1或5分钟图上使用 Once Per Bar Close。穿过价位的影线如果收盘时回到价位内侧,就不会触发,这样能去掉大部分假突破。
策略:calc_on_every_tick 和 process_orders_on_close
策略默认在历史K线和实时K线上都在K线收盘时运行。有两个设置会改变这一点:
calc_on_every_tick=true让策略在每次实时更新时运行。历史无法做到这一点,所以实盘交易会开始与回测产生差异。process_orders_on_close=true让订单在信号K线收盘时成交。默认是在下一根K线开盘时成交。它适合以收盘价为基础的出场,但可能让入场看起来更好。
在策略于K线收盘时正常工作之前,把这两项都保持关闭。指标与策略指南介绍了策略测试器的其余假设。
Bar Magnifier
在历史上,策略只知道每根K线的开盘价、最高价、最低价和收盘价。如果你的止损和目标都在同一根K线内,它就只能猜哪个先触及。use_bar_magnifier=true会用更低周期的数据来判定,适用于付费的TradingView套餐。在信任较紧的止损和目标之前,先把它打开。
request.security 与更高周期
把日线最高价引入5分钟图,是重绘的常见来源。在历史上,日线K线已经完整,所以脚本从当天的第一根K线起就能看到最终的最高价。在实时中,最高价还在不断变动。请求前一个已完成的值:
prevHigh = request.security(syminfo.tickerid, "D", high[1], lookahead=barmerge.lookahead_on)
带有lookahead_on的[1],会在今天的每一根K线上给出昨天的最高价,历史和实时都一样。
检查清单
- 信号使用
barstate.isconfirmed,或者提醒设为 Once Per Bar Close。 - 更高周期的值使用带有
lookahead_on的[1]。 - 策略在K线收盘时运行,并关闭
calc_on_every_tick。 - 当止损和目标靠得很近时,开启 Bar Magnifier。
- 在交易之前,把一周的实时提醒与回测做对比。
不会移动的价位
我的交易计划价位在交易时段开始前就定好,全天固定不变,所以画出它们的脚本没有什么可重绘的。Pine Script 价位指南介绍如何在TradingView上绘制它们。
常见问题
Pine Script 中的收盘和K线内有什么区别?
收盘表示脚本只在K线结束时执行一次。K线内表示脚本在K线内每次价格更新时都执行,所以信号可能在收盘前出现又消失。
如何避免 Pine Script 提醒重绘?
把提醒设为 Once Per Bar Close,或在条件中加入barstate.isconfirmed。对于更高周期的数据,使用前一根K线的值并配合lookahead_on。
策略回测会使用K线内的价格吗?
只有K线内的成交会使用,而且要开启 Bar Magnifier。历史上的信号在每根K线收盘时计算。
来源
- TradingView Pine Script 用户手册:执行模型、重绘、提醒
- TradingView帮助中心:Bar Magnifier
仅供教育参考,不构成投资建议。