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

如何在Pine Script中存储特定时间的ATR值以生成开盘区间水平位

代码问题排查与修正方案

已发现的问题点

  • 存在未定义变量:代码中直接使用了openRangeMid但没有提前声明赋值,Pine Script会默认识别为无效值na,直接导致entry_atr的赋值逻辑完全失效,历史回测时该值会出现随机偏移。
  • 跨周期调用request.security用法错误:你将当前图表周期计算的high_range、low_range作为参数传入security函数,没有把高低点计算逻辑放在security的计算域内,会触发时间对齐偏差、重绘问题,回滚历史时就读取到错位的数值。
  • ATR值没有固定时点存储:你需要的是开盘后30分钟时点的固定ATR值,但现有代码没有限定赋值时机,只要满足atrcollect[0] > atrcollect[1]就会更新ATR值,盘中会反复修改该值,历史回测时不同阶段读取的数值自然不一致。
  • 缺失跨周期调用的防未来函数配置:request.security默认开启了前瞻模式,回测时会读取未来数据,导致历史数值失真。

核心逻辑修正方案

你需要在开盘30分钟结束的节点一次性锁定当日的开盘区间高低点、ATR值,后续全天不再修改这几个值,修正后的核心代码如下:

// 补全缺失的变量定义
openRangeMid = na
// 修正跨周期计算逻辑,把开盘区间、ATR计算都放在security内部,关闭前瞻避免未来数据
[ORHigh, ORLow, openingATR] = request.security(syminfo.ticker, resol, 
    [ta.valuewhen(newbarSess, high, 0), ta.valuewhen(newbarSess, low, 0), ta.atr(atrLkb)],
    barmerge.gaps_on, barmerge.lookahead_off)
range_1 = ORHigh - ORLow
openRangeMid := (ORHigh + ORLow)/2

// 固定当日ATR值,仅在开盘30分钟节点赋值一次,后续全天沿用
float entry_atr = na
if newbarSess
    entry_atr := na // 新交易日重置数值
if not na(ORHigh) and na(entry_atr)
    entry_atr := openingATR // 开盘30分钟数据返回后一次性赋值,后续不再修改

// 其余PT水平位计算逻辑保持不变即可

额外优化建议

  • 建议删除原代码中冗余的ticker.new声明,直接用syminfo.ticker即可满足需求,避免不必要的会话规则冲突。
  • 日期判断逻辑可以简化为istoday = ta.change(time("D")) == 0 and time > ta.valuewhen(ta.change(time("D")), time, 0),适配不同市场的交易日规则。

内容的提问来源于stack exchange,提问作者Alex A. Kallai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:06:01