如何在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
相关产品推荐
相关产品推荐

