TradingView回测策略实现问询:触发信号后次日开盘入场、离场信号当日收盘离场的设置方法
解决TradingView策略:次日开盘入场+当日收盘平仓的需求
你的问题核心是需要两种不同的订单执行时机:买入信号触发后次日开盘价开仓,以及卖出信号触发当日收盘价平仓,而全局的process_orders_on_close参数无法同时满足这两个需求,这也是你之前尝试用BUY[1]却仍以收盘价成交的原因——因为process_orders_on_close=true会强制所有订单在当前bar收盘时执行,不管你引用的是哪个bar的信号。
下面是针对你需求的完整解决方案,结合RSI指标实现,同时解释关键逻辑:
完整策略代码
//@version=5 strategy(title = "RSI 次日开盘入场策略", overlay = true, process_orders_on_close = false) // 回测时间范围过滤 fromYear = year > 2011 toYear = year < 2023 // RSI指标计算 rsi_value = ta.rsi(close, 10) BUY_SIGNAL = rsi_value < 30 // 超卖信号 SELL_SIGNAL = rsi_value > 70 // 超买信号 // 入场逻辑:上一个bar触发买入信号,当前bar以开盘价开多 if (BUY_SIGNAL[1] and fromYear and toYear) // 指定price=open确保以当前bar的开盘价成交 strategy.entry("多单", strategy.long, price=open) // 离场逻辑:当前bar触发卖出信号 或 持仓满21个bar,以收盘价平仓 // 用strategy.position_size > 0避免无持仓时触发平仓 if (strategy.position_size > 0) // 计算持仓时长:从入场bar开始算满21个bar hold_duration_reached = bar_index - strategy.opentrades.entry_bar_index >= 21 exit_condition = SELL_SIGNAL or hold_duration_reached if (exit_condition) // 指定price=close确保以当前bar的收盘价成交 strategy.close("多单", price=close)
关键逻辑解释
全局参数设置:
把process_orders_on_close设为false,这样我们可以手动指定订单的成交价格,而不是被强制在收盘价执行所有订单。入场时机控制:
用BUY_SIGNAL[1]作为入场条件,意思是确认上一个bar已经触发了买入信号,此时当前bar就是信号后的次日,再通过price=open明确指定以当前bar的开盘价开仓,完美实现"信号次日开盘入场"的需求。离场时机控制:
- 直接用当前bar的
SELL_SIGNAL作为触发条件,确保卖出信号触发当日就处理平仓 - 用
price=close指定以当前bar的收盘价成交,满足"当日收盘平仓"的要求 - 持仓时长计算改用
bar_index - strategy.opentrades.entry_bar_index >=21,相比ta.barssince(BUY_SIGNAL)更准确,因为它是从实际入场的bar开始计算持仓天数,避免信号和入场不同步导致的误差。
- 直接用当前bar的
为什么你之前的方法无效?
当你设置process_orders_on_close=true时,不管你用BUY还是BUY[1]作为条件,所有订单都会被强制在当前bar的收盘价执行。即使你判断的是上一个bar的信号,订单依然会在当前bar收盘时成交,而不是开盘价——这就是全局参数的优先级导致的问题。
内容的提问来源于stack exchange,提问作者user15220279




