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

如何在TradingView PineScript中结合ta.atr与dayofweek分析周内波动差异

解决PineScript中结合dayofweek与ta.atr分析交易日波动差异的问题

你的当前代码存在逻辑错误:dayofweek.monday是布尔值,而ta.atr(4)返回的是浮点型数值,两者直接用and运算不符合语法,也无法实现“分析不同交易日ATR波动”的核心需求。由于ta.atr确实不支持自定义源参数,我们可以通过筛选目标交易日的价格数据,再单独计算ATR的方式实现需求,以下是两种可行方案:


方案1:用ta.valuewhen提取目标交易日数据计算ATR

通过提取指定交易日的高低收数据,手动计算真实波幅(TR)后再做移动平均,逻辑和原生ta.atr完全一致:

//@version=5
indicator("分交易日ATR波动分析", overlay=false)

// 定义ATR计算周期
atr_length = 4

// ---------------------- 周一ATR计算 ----------------------
is_monday = dayofweek == dayofweek.monday
// 提取周一的最高价、最低价,以及上一个周一的收盘价(ATR计算依赖前周期收盘价)
mon_high = ta.valuewhen(is_monday, high, 0)
mon_low = ta.valuewhen(is_monday, low, 0)
mon_prev_close = ta.valuewhen(is_monday, close, 1)
// 计算周一的真实波幅TR
mon_tr = math.max(math.max(mon_high - mon_low, math.abs(mon_high - mon_prev_close)), math.abs(mon_low - mon_prev_close))
// 基于周一的TR序列计算ATR(默认用SMA,和ta.atr逻辑一致)
mon_atr = ta.sma(mon_tr, atr_length)
// 仅在周一绘制ATR数值
plot(is_monday ? mon_atr : na, title="周一ATR", color=color.blue, linewidth=2)

// ---------------------- 周二ATR计算(可复制到其他交易日) ----------------------
is_tuesday = dayofweek == dayofweek.tuesday
tue_high = ta.valuewhen(is_tuesday, high, 0)
tue_low = ta.valuewhen(is_tuesday, low, 0)
tue_prev_close = ta.valuewhen(is_tuesday, close, 1)
tue_tr = math.max(math.max(tue_high - tue_low, math.abs(tue_high - tue_prev_close)), math.abs(tue_low - tue_prev_close))
tue_atr = ta.sma(tue_tr, atr_length)
plot(is_tuesday ? tue_atr : na, title="周二ATR", color=color.red, linewidth=2)

方案2:用数组存储目标交易日TR值计算ATR

通过数组仅存储指定交易日的真实波幅,再基于数组内的数据计算ATR,适合需要更灵活控制数据序列的场景:

//@version=5
indicator("分交易日ATR波动分析", overlay=false)

atr_length = 4
// 初始化数组存储周一的TR值
var float[] mon_tr_array = array.new_float()

// 仅在周一计算TR并加入数组,同时保持数组长度不超过ATR周期
if dayofweek == dayofweek.monday
    current_tr = ta.tr // 直接调用原生TR计算函数
    array.push(mon_tr_array, current_tr)
    if array.size(mon_tr_array) > atr_length
        array.shift(mon_tr_array)

// 当数组长度满足ATR周期时,计算周一的ATR
mon_atr = array.size(mon_tr_array) >= atr_length ? ta.sma(array.get(mon_tr_array, 0), atr_length) : na
plot(dayofweek == dayofweek.monday ? mon_atr : na, title="周一ATR", color=color.blue)

两种方案的核心逻辑都是先筛选目标交易日的波动数据,再基于这些数据计算ATR,完美避开ta.atr不支持源参数的限制,你可以根据自己的习惯选择使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:07:08