You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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)

关键逻辑解释

  1. 全局参数设置
    process_orders_on_close设为false,这样我们可以手动指定订单的成交价格,而不是被强制在收盘价执行所有订单。

  2. 入场时机控制
    BUY_SIGNAL[1]作为入场条件,意思是确认上一个bar已经触发了买入信号,此时当前bar就是信号后的次日,再通过price=open明确指定以当前bar的开盘价开仓,完美实现"信号次日开盘入场"的需求。

  3. 离场时机控制

    • 直接用当前bar的SELL_SIGNAL作为触发条件,确保卖出信号触发当日就处理平仓
    • price=close指定以当前bar的收盘价成交,满足"当日收盘平仓"的要求
    • 持仓时长计算改用bar_index - strategy.opentrades.entry_bar_index >=21,相比ta.barssince(BUY_SIGNAL)更准确,因为它是从实际入场的bar开始计算持仓天数,避免信号和入场不同步导致的误差。

为什么你之前的方法无效?

当你设置process_orders_on_close=true时,不管你用BUY还是BUY[1]作为条件,所有订单都会被强制在当前bar的收盘价执行。即使你判断的是上一个bar的信号,订单依然会在当前bar收盘时成交,而不是开盘价——这就是全局参数的优先级导致的问题。

内容的提问来源于stack exchange,提问作者user15220279

火山引擎 最新活动