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

Pine Script(71):如何在代码中精确控制策略的加仓次数

#Pine Script入门教学

在交易策略中,加仓是一种常见的技术,尤其是在趋势跟踪系统中。当市场朝着我们有利的方向发展时,顺势增加头寸可以极大地放大我们的盈利。然而,无节制的加仓也是一把双刃剑,会急剧增加我们的风险敞口。

因此如何在代码中精确控制策略的加仓次数,就成了一个至关重要的问题。在PineScript中,strategy() 函数里的 pyramiding 参数就是专门为这个目的而设计的,它能让你设定在同一个方向上(多头或空头)最多允许开仓的次数。

我们通过 strategy() 函数来设置 pyramiding。例如,如果我们想允许策略在同一方向上最多加仓到5笔订单,可以这样写:

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

pyramiding 的默认值是0。这个值意味着策略在同一方向上只允许存在一笔订单,也就是完全禁止加仓。如果你不写这个参数,默认就是这种最保守的设置。

//@version=5
strategy(title="我的策略") // 默认 pyramiding=0,禁止加仓

值得一提的是,pyramiding=1pyramiding=0 的效果是完全一样的,都代表只允许一笔订单,只有当你把这个值设为2或更高时,策略才真正开启了加仓的功能。

pyramiding 的值必须是一个固定的整数,不能使用变量来动态调整,这意味着在整个回测周期中,最大加仓次数是恒定不变的。设置了pyramiding仅仅是给了策略可以加仓的许可。至于是否真的会加仓,完全取决于你代码中的开仓逻辑,如果你的开仓信号本身就不会重复触发,那么即使pyramiding设置得再高,策略也不会进行加仓。 一旦仓位达到了 pyramiding 设置的上限,任何后续的同向开仓指令 (strategy.entry()) 都会被TradingView自动拒绝,不会成交。

pyramiding 只限制订单的“笔数”,和你每笔订单的规模无关,假设你设置 pyramiding=3,每笔订单大小为1手,那么最大总头寸就是3手。但如果你把每笔订单大小设为5手,那么最大总头寸就会变成15手,因此风险管理必须结合订单规模来综合考虑。

有时候你会发现,策略的实际开仓次数超过了pyramiding的设定值,这通常不是Bug,而是由以下两种特殊情况造成的:

  1. pyramiding的限制只对 strategy.entry() 函数生效,而对更底层的 strategy.order() 函数是无效的 ,如果你用 strategy.order() 来下单,那么无论 pyramiding 设置成多少,它都可以无限开仓。

    解决方案一: 尽量使用 strategy.entry() 来处理你的开仓逻辑

    解决方案二: 如果业务逻辑复杂必须使用strategy.order(),那么你需要在下单前,自己写代码来检查当前持仓数量 (strategy.opentrades),手动控制开仓次数

  2. 多个挂单被同时触发,这种情况比较隐蔽。假设你设置了 pyramiding=3,当前持仓为2。此时你挂出了多个止损入场单,在挂单时这些订单都是合法的。但如果市场价格剧烈波动,瞬间同时触发了其中的两个订单,那么你的总持仓就会变成4,超出了3的限制 解决方案可以使用 OCA(One-Cancels-All) 订单组,将所有同向的挂单都放进一个OCA组里。这样一来,只要其中一个订单成交,组内的其他所有订单都会被系统自动取消,从而避免超额开仓的问题

除了在代码里硬编码,TradingView也提供了手动调整的选项,你可以在策略设置的“属性”标签页中找到金字塔(Pyramiding)选项,在这里可以直接修改最大开仓次数:

这个手动设置的优先级更高,会直接覆盖你在代码中 pyramiding 参数所写的值 ,这对于快速测试不同的加仓策略而无需修改代码来说,非常方便。

总结

pyramiding是PineScript 中一个核心的风控参数,它让你能够精确控制策略在同一方向上的最大开仓次数。默认值为0(或1),代表禁止任何加仓行为,只有当值设为2或更高时,加仓功能才被激活 请记住这个设置只对 strategy.entry() 生效,并且在某些特定情况下(如挂单同时触发)可能会被绕过 。在设计任何带加仓功能的策略时,一定要用好 pyramiding 参数,并结合订单规模,把它作为你风险管理体系中不可或缺的一环。

赞(0)
未经允许不得转载:图道交易 » Pine Script(71):如何在代码中精确控制策略的加仓次数
分享到

评论 抢沙发

登录

找回密码

注册