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

Pine Script(75):对限价单模拟成交深度,让回测更准确

#Pine Script入门教学

“为什么我的策略回测是条龙,一到实盘就成了虫?” 这是每个策略开发者都曾问过自己的问题。其中一个最常见的原因,就出在回测引擎对限价单过于理想化的成交假设上。

在默认情况下,TradingView的回测引擎认为,只要K线的价格哪怕只碰到你的限价单价格一个点,这笔订单就瞬间以你的理想价格成交了。这意味着你的策略可以在K线的最低点完美买入,或是在最高点完美卖出。但在真实的交易世界里,由于订单队列、市场深度和成交速度等因素,这种极限摸顶/抄底的成交几乎是不可能完成的任务。

为了让我们的回测更接地气,避免被这种完美成交的神话所迷惑,Pine Script提供了一个至关重要的参数:backtest_fill_limits_assumption

简单来说,这个设置要求市场价格必须穿透你的限价达到指定Ticks数量后,回测引擎才会判定这笔限价单成交。这就模拟了真实世界中,订单需要一定的成交深度才能被撮合的现实。

如何使用backtest_fill_limits_assumption?我们可以通过 strategy() 函数来配置这个参数。它的值代表了价格需要朝对我们有利的方向穿透多少个Ticks。

例如,我们要求买入限价单必须在价格向下跌穿挂单价2个ticks后才能成交,可以这样写:

//@version=6
strategy(title="我的策略", backtest_fill_limits_assumption=2)

这个参数的默认值是0 ,也就是我们前面提到的一触即发的理想化模式,如果你想保持默认行为,直接省略这个参数即可

当你将 backtest_fill_limits_assumption 的值设为大于0时,你的策略回测会发生两个显著变化

  1. 订单可能不会在当前K线成交,而是延迟到未来的某一根K线,直到价格充分穿透你的限价为止
  2. 如果价格在触及你的限价后,未能完成指定的穿透幅度就掉头反向运动,那么这笔订单将永远不会成交,直接被错过

这两个效果,恰恰是真实交易的常态,它能有效地过滤掉那些依赖于“奇迹成交”的虚假盈利信号,让你的回测结果更加保守、稳健

提醒

backtest_fill_limits_assumption 只改变订单何时成交,不改变订单的成交价格

即使你设置了backtest_fill_limits_assumption=8,当订单满足穿透8个ticks的条件并成交时,其成交价依然是你当初设定的那个限价,而不是穿透后的价格。这个参数影响的是成交条件,而非成交价格。此外这个参数的值必须是一个固定的整数,不能动态改变

除了在代码中设置,你也可以在策略的“属性”标签页中手动调整“验证限价单的价格”选项。这个手动设置会覆盖你在代码中的设定,便于快速测试不同的穿透值

总结

backtest_fill_limits_assumption 是每一个严肃的策略开发者都应该强制使用的回测工具。

  • 它通过要求价格穿透指定ticks数,来模拟真实世界的限价单成交深度
  • 它能有效过滤掉那些在K线极端价格点(最高/最低点)发生的不切实际的成交
  • 它可能会让你的回测报告变得更差,但也会让它变得更真实。一个更低但更可信的预期收益,远比一个虚高但无法复制的盈利曲线更有价值。
赞(0)
未经允许不得转载:图道交易 » Pine Script(75):对限价单模拟成交深度,让回测更准确
分享到

评论 抢沙发

登录

找回密码

注册