You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pine Script中实现常规交易时段结束时的MOC平仓?

实现Pine Script每日常规交易时段MOC平仓方案

核心思路

要解决盘后时段持仓问题,需精准锁定常规交易时段的收盘时间点,在该节点触发强制平仓指令,同时严格限制开仓信号仅在常规时段内生效。

具体代码修改方案

1. 定义每日重复的常规交易时段

用空参数的timestamp定义每日生效的开盘/收盘时间(替换为你实际的常规时段):

// 每日常规交易时段(示例为美股9:30-16:00,按需求调整)
regularSessionStart = timestamp("", 0, 0, 9, 30, 0)
regularSessionEnd = timestamp("", 0, 0, 16, 0, 0)

前三个参数留空表示该时间规则每日重复,无需指定固定年/月/日。

2. 过滤盘后时段的开仓信号

修改原交易逻辑,仅在回测时间范围+常规交易时段内触发开仓:

start = timestamp(2022,1,1,6,30,0)
end = timestamp(2022,11,16,1,0,0)

// 双重条件过滤:回测时间范围内 + 常规交易时段内
inValidRange = time >= start and time <= end
inRegularSession = time >= regularSessionStart and time <= regularSessionEnd

if inValidRange and inRegularSession
    strategy.entry("buySignal", strategy.long, 300.0, when = buySignal)
    strategy.entry("sellSignal", strategy.short, 300.0, when = sellSignal)
    strategy.close("buySignal", when = sellSignal)  // 修正原代码笔误:buySingnal → buySignal
    strategy.close("sellSignal", when = buySignal)

注意:原代码中buySingnal是拼写错误,必须修正才能触发对应多头头寸的平仓。

3. 触发每日MOC平仓

在常规时段收盘时间点,用strategy.close_all()平掉所有未平仓头寸:

// 常规时段收盘时执行MOC平仓
if inValidRange and time == regularSessionEnd
    strategy.close_all(comment="Daily MOC Close")

如果你的K线周期大于1分钟,建议结合barstate.islast适配,避免错过平仓节点:

// 适配非1分钟周期的平仓逻辑
if inValidRange and inRegularSession and barstate.islast
    strategy.close_all(comment="Daily MOC Close")

4. 可选:强制限制仅常规时段开仓

添加策略风险设置,彻底禁止盘后时段开仓:

// 仅允许在常规交易时段发起新仓位
strategy.risk.allow_entry_in(session.regular)

完整示例代码片段

//@version=5
strategy("带MOC平仓的交易策略", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000)

// 回测时间范围
start = timestamp(2022,1,1,6,30,0)
end = timestamp(2022,11,16,1,0,0)
inValidRange = time >= start and time <= end

// 常规交易时段
regularSessionStart = timestamp("", 0, 0, 9, 30, 0)
regularSessionEnd = timestamp("", 0, 0, 16, 0, 0)
inRegularSession = time >= regularSessionStart and time <= regularSessionEnd

// 示例买卖信号(替换为你的实际信号逻辑)
buySignal = ta.crossover(ta.sma(close, 50), ta.sma(close, 200))
sellSignal = ta.crossunder(ta.sma(close, 50), ta.sma(close, 200))

// 仅在有效范围内触发交易
if inValidRange and inRegularSession
    strategy.entry("buySignal", strategy.long, 300.0, when = buySignal)
    strategy.entry("sellSignal", strategy.short, 300.0, when = sellSignal)
    strategy.close("buySignal", when = sellSignal)
    strategy.close("sellSignal", when = buySignal)

// 每日MOC平仓
if inValidRange and time == regularSessionEnd
    strategy.close_all(comment="Daily MOC Close")

// 限制仅常规时段开仓
strategy.risk.allow_entry_in(session.regular)

关键注意事项

  • 时区匹配:确保timestamp使用的时区与图表时区一致,避免时间判断偏差。
  • 周期适配:非1分钟周期需用barstate.islast辅助判断,保证在时段内最后一根K线触发平仓。
  • 拼写检查:严格核对订单ID的拼写,避免平仓指令失效。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:20:58