如何绘制各周期Anchored VWAP终值的水平射线直至价格回踩
多周期Anchored VWAP水平射线绘制方案
需求描述
针对日线、周线、月线周期的每个Anchored VWAP终点绘制水平射线,当价格回踩该水平时终止射线(即裸VWAP)。
当前示例脚本
//@version=5 indicator("nVWAP(s)", overlay=true) newWeek = ta.change(time("W")) != 0 vwap_w = ta.vwap(open, timeframe.change("1W")) wvwapClose = ta.valuewhen(newWeek, vwap_w[1], 0) plot(wvwapClose, color = color.blue) plot(vwap_w, color = color.blue)
问题说明
当前脚本绘制的线段仅延伸至下一周期,会出现垂直衔接的断层。需要实现:
- 射线从周期VWAP终点开始水平延伸
- 当价格回踩对应VWAP水平时,射线终止
- 避免周期间的垂直衔接问题
预期效果为仅显示未被回踩的射线;周期切换显示功能暂不考虑。
解决方案代码
//@version=5 indicator("Multi-Period Anchored VWAP Rays", overlay=true) // 选择目标周期 periodInput = input.string("Weekly", "Target Period", options=["Daily", "Weekly", "Monthly"]) timeframeStr = periodInput == "Daily" ? "D" : periodInput == "Weekly" ? "W" : "M" // 检测新周期起始点 newPeriod = ta.change(time(timeframeStr)) != 0 // 计算对应周期的VWAP vwapPeriod = ta.vwap(open, timeframe.change(timeframeStr)) // 存储未被回踩的VWAP水平及对应K线位置 var float[] vwapLevels = array.new_float() var int[] levelBars = array.new_int() // 新周期开始时,记录上一周期的VWAP终值 if newPeriod array.push(vwapLevels, vwapPeriod[1]) array.push(levelBars, bar_index[1]) // 移除已被价格触碰的VWAP水平 var int i = 0 while i < array.size(vwapLevels) level = array.get(vwapLevels, i) // 判断价格是否上下影线触碰该水平 touched = ta.low <= level and ta.high >= level if touched array.remove(vwapLevels, i) array.remove(levelBars, i) else i += 1 // 绘制未被触碰的水平射线 for i = 0 to array.size(vwapLevels) - 1 level = array.get(vwapLevels, i) startBar = array.get(levelBars, i) line.new(startBar, level, bar_index, level, color=color.blue, width=2)
关键逻辑解释
- 周期适配:通过输入框切换日线/周线/月线,自动匹配对应时间框架字符串,无需修改代码
- VWAP锚定:使用
timeframe.change()确保每个周期内的VWAP计算独立,准确获取周期终点值 - 水平管理:用数组存储未被回踩的VWAP水平和对应K线索引,实时检查价格触碰状态,触碰则移除该水平
- 射线绘制:遍历有效水平,从周期终点K线绘制水平射线到当前K线,彻底解决垂直衔接问题
内容的提问来源于stack exchange,提问作者Market Monster
相关产品推荐
相关产品推荐

