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

Pine Script策略未按时间触发开平仓问题排查求助

Pine Script策略开仓触发问题排查与修复

核心问题诊断

你的代码无法触发开仓的根本原因是两个严重逻辑错误:

  1. 时间戳与价格混淆:timestamp()返回的是Unix时间戳(时间的数值表示),而非对应时间点的价格。你用prevPrice2045 - prevPrice20计算的是45分钟的时间差,完全不是价格区间的差值,导致开仓判断逻辑完全失效。
  2. 日期边界处理错误:当交易日为每月1号时,dayofmonth(time)-1会得到0,此时timestamp()生成的日期无效,无法获取前一日的价格数据。

另外,Pine Script没有console.logger(),可通过label.new、plotchar等函数实现调试信息输出。

修复后的完整代码

// © Daltonico
//@version=4
strategy("DTCC Basis Predictor", overlay=true)

// 存储交易方向(仅初始化一次)
var string tradeDirection = "none"

// 转换当前时间为时分整数格式(如00:00=0,23:59=2359)
currentTime = hour * 100 + minute

// 初始化前一日20:00、20:45的时间戳
var int prevDay2000 = na
var int prevDay2045 = na

// 每日开盘时更新前一日时间戳(处理每月1号的边界情况)
if ta.newbar("D")
    if dayofmonth == 1
        // 当月1号时,取上月最后一天的20:00/20:45
        lastDayOfPrevMonth = ta.monthdays(month - 1)
        prevDay2000 := timestamp(year, month - 1, lastDayOfPrevMonth, 20, 0, 0)
        prevDay2045 := timestamp(year, month - 1, lastDayOfPrevMonth, 20, 45, 0)
    else
        // 非1号时,取前一天的20:00/20:45
        prevDay2000 := timestamp(year, month, dayofmonth - 1, 20, 0, 0)
        prevDay2045 := timestamp(year, month, dayofmonth - 1, 20, 45, 0)

// 获取前一日20:00和20:45的收盘价(通过1分钟周期精准获取)
price2000 = request.security(syminfo.tickerid, "1", close[ta.time == prevDay2000])
price2045 = request.security(syminfo.tickerid, "1", close[ta.time == prevDay2045])

// 00:00触发开仓逻辑
if currentTime == 0
    priceDiff = price2045 - price2000
    // 调试:在K线顶部打印差值与交易方向
    label.new(bar_index, high, str.tostring(priceDiff) + " | " + str.tostring(tradeDirection), color=color.orange, textcolor=color.white)
    
    tradeDirection := priceDiff < 0 ? "long" : "short"

// 23:59平仓
if currentTime == 2359
    tradeDirection := "none"

// 执行交易指令
strategy.entry("Long", strategy.long, when=tradeDirection == "long")
strategy.close("Long", when=tradeDirection == "none")
strategy.entry("Short", strategy.short, when=tradeDirection == "short")
strategy.close("Short", when=tradeDirection == "none")

关键修复说明

  • 价格获取逻辑修正:使用request.security指定1分钟周期,通过ta.time == prevDay2000过滤出精准时间点的收盘价,确保拿到的是真实价格而非时间戳。
  • 日期边界处理:新增ta.newbar("D")判断每日开盘,针对每月1号的情况,用ta.monthdays()获取上月最后一天日期,避免无效时间戳。
  • 调试功能实现:用label.new在K线顶部打印价格差值和交易方向,直观验证逻辑是否触发。
  • 代码简洁性优化:用三元运算符简化交易方向赋值,提升可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:40:55