在交易中,当我们分批建仓后,平仓时通常遵循一个默认规则“先进先出”(FIFO)。你可以把它想象成排队出场:最早进场的仓位,在平仓时也最先被平掉,这是TradingView策略的默认行为,也符合大部分经纪商的执行规则。
但如果你的策略逻辑比较复杂呢?比如你有一个基于长期趋势的底仓,后来又根据短期波动信号加了两次仓,现在短期信号消失,你想先平掉后面这两个加仓的头寸,但继续持有最早的那个底仓,这时候排队出场的FIFO规则就成了障碍。
为了解决这个问题,Pine Script提供了 close_entries_rule
这个参数,它允许我们打破默认的排队规则,实现精准点名,想让哪个仓位先出场,就让哪个先出场。
close_entries_rule
有两个可选值:
"FIFO"
:默认值,严格遵守“先进先出”规则。"ANY"
:允许你按任意顺序,指定平掉某一个具体的入场订单。
启用这个功能很简单,只需要在 strategy()
函数中,将 close_entries_rule
的值设为字符串 "ANY"
:
//@version=6
strategy(title="我的策略", close_entries_rule="ANY")
如果你想明确使用或强调默认的FIFO规则,可以这样写:
//@version=6
strategy(title="我的策略", close_entries_rule="FIFO")
当然,更常见的做法是直接省略这个参数,因为默认就是FIFO。
仅仅设置 close_entries_rule="ANY"
是不够的!这只是拿到了可以不排队的许可,你还必须在离场时明确告诉系统,你要让谁插队。
要成功实现非FIFO的平仓,你的代码必须同时满足以下四个条件,缺一不可:
- 分批建仓: 策略在同一方向上至少有2笔或以上的入场订单。
- 开启权限:
strategy()
函数中必须设置close_entries_rule="ANY"
。 - 分批平仓: 策略通过2笔或更多的平仓指令来退出仓位 。
- 明确指定: 你的平仓函数必须明确指定要关闭哪一笔入场订单 。使用
strategy.close()
时,通过其id
参数来指定;使用strategy.exit()
时,通过其from_entry
参数来指定 。
如果这四项没有同时满足,即使你的平仓函数指定了订单ID,Pine Script 依然会强制执行默认的FIFO规则。
提醒
strategy.order()
的局限,你可能会问为什么不能用 strategy.order()
来指定平仓,因为它无法指定要平掉哪一笔入场订单,不满足上述第4个必要条件,所以它只能用于FIFO模式的平仓 。关于经纪商规则限制,这是最重要的一点,由于NFA的合规要求,美国的经纪商在处理股票、期货和外汇时,须使用FIFO规则 ,虽然你可以在TradingView上回测任何品种的非FIFO逻辑,但如果你的经纪商不支持,策略将无法在实盘中正确执行,非美国地区的外汇交易通常则允许非FIFO平仓 。
有个小细节: close_entries_rule
的值必须是全大写的 "ANY"
或 "FIFO"
,任何其他形式(如 “Any” 或 “any”)都会导致代码报错 。此功能无法在策略设置的UI界面中修改,只能通过代码进行配置 。
总结
close_entries_rule
是Pine Script中实现高级平仓策略的关键参数。
- 默认的
"FIFO"
(先进先出)规则在大多数情况下够用且符合监管。 - 当你需要更精细化的平仓控制,比如优先平掉加仓的头寸或对冲仓位时,就需要使用
"ANY"
模式 。 - 请牢记,启用
"ANY"
模式必须与在strategy.close()
或strategy.exit()
函数中明确指定订单ID配合使用,两者缺一不可 。