保持敬畏之心
交易是一场持久战

Pine Script(79):calc_on_order_fills - 让策略拥有即时反应能力

#Pine Script入门教学

默认情况下,PineScript策略是个慢性子,它的工作模式是耐心等待一根K线走完,在收盘的瞬间进行一次计算,如果发现交易机会,就生成订单,但这个订单最快也要等到下一根K线开盘才能成交。整个过程规规矩矩,但总是慢半拍。

在很多交易场景下,这种延迟是致命的。比如:

  • 当一个强劲的趋势在日线图上启动时,你希望迅速分批建仓,但默认模式下,你可能需要好几天才能把仓位建满,早就错过了最佳时机。
  • 当你的入场单成交后,头寸就暴露在了市场风险之下。你最想做的,就是在成交的瞬间,立刻为这笔订单挂上一个保护性的止损单,但默认模式下你的仓位要到下一根K线开盘前都处于裸奔状态。

为了解决这些问题,PineScript提供了一个强大的高级功能:calc_on_order_fills

简单来说,一旦你开启了这个设置,你的策略就获得了即时反应的能力。只要有一个订单成交,策略就会立刻在当前这根K线内部,额外进行一次计算和行动,而无需等待K线收盘。

我们可以通过 strategy() 函数来开启这个功能,只需将 calc_on_order_fills 的值设为 true

//@version=6
strategy(title="我的策略", calc_on_order_fills=true)

它的默认值是 false,如果你想保持策略的慢性子,直接省略这个参数即可。

calc_on_order_fills 的核心特性

这个功能最强大的地方在于它可以触发连锁反应,当第一笔订单成交,会触发一次额外计算;如果这次计算又生成了第二笔订单,并且它在同一根K线内也成交了,那么就会触发第二次额外计算,以此类推。这对于快速分批建仓来说是绝佳的利器。

这个功能在小时图、日线图等较大时间周期的图表上,价值最大。在一分钟图上等一分钟不算什么,但在日线图上,入场后要等到第二天才挂止损,这期间的风险敞口是难以接受的。要想利用这个功能快速下单,你的开仓条件在K线内部的额外计算时,必须仍然为真。如果你的条件仅仅在上一根K线收盘时才满足,那么在额外计算时就不会触发新的订单。

process_orders_on_close 不兼容,目前,你无法同时开启订单成交时计算和上一篇我们讲的K线收盘价成交这两个功能。

实战演练

我们来看一个均线交叉策略,当快线(10MA)连续两根K线都位于慢线(30MA)之上时,我们分批做多,最多加仓到3笔。

默认的模式策略代码如下:

//@version=6
strategy(title="在订单成交时计算示例", overlay=true,
     pyramiding=3)

//计算
fastEMA = ta.ema(close, 10)
slowEMA = ta.ema(close, 30)
plot(fastEMA, color=color.orange, title="快线 EMA")
plot(slowEMA, color=color.teal, linewidth=2, title="慢线 EMA")

//逻辑
if fastEMA > slowEMA and fastEMA[1] > slowEMA[1]
    strategy.entry("Enter Long", strategy.long)
if fastEMA < slowEMA and fastEMA[1] < slowEMA[1]
    strategy.entry("Enter Short", strategy.short)

在默认设置下,假设我们在1小时图上运行,第一根K线收盘时满足条件,生成订单1,在第二根K线开盘时成交。第二根K线收盘时条件依然满足,生成订单2,在第三根K线开盘时成交。第三根K线收盘时条件依然满足,生成订单3,在第四根K线开盘时成交。

为了建满3笔仓位,策略足足花了3个小时,这对于一个快速启动的趋势来说,效率太低了。

现在我们给策略注入活力,只需在 strategy() 函数中增加一个参数:

strategy(title="在订单成交时计算示例", overlay=true,
     pyramiding=3, calc_on_order_fills=true)

这样所有的建仓动作都在一根K线上完成了!第一根K线收盘满足条件,生成订单1,在第二根K线开盘时成交。订单1成交的瞬间,触发了第一次额外计算,此时条件依然满足,策略立刻生成订单2。订单2(市价单)也立即成交,再次触发了第二次额外计算,条件依然满足,策略生成订单3,订单3也成交了,此时已达到加仓上限,建仓完成。

整个过程从耗时3小时,缩短到了第二根K线开盘后的几秒钟内,这就是 calc_on_order_fills 的威力。

你也可以在策略的“属性”设置中,勾选“订单成交后重新计算”来手动开启此功能,这个手动设置会覆盖你在代码中的配置。

总结

calc_on_order_fills 是一个能让你的策略从被动变主动的高级开关。

  • 它将策略的计算时机,从“K线收盘时”,额外增加了一个“订单成交时”。
  • 它最核心的应用场景有两个:快速分批建仓/平仓和入场后立即设置止损/止盈。
  • 这个功能对于大周期策略的风控和效率提升尤为重要。

如果你希望你的策略能像一个真正的交易员一样,在下单后能立刻做出下一步反应,那么 calc_on_order_fills 是你必须掌握的利器。

赞(0)
未经允许不得转载:图道交易 » Pine Script(79):calc_on_order_fills - 让策略拥有即时反应能力
分享到

评论 抢沙发

登录

找回密码

注册