Pine Script需求:用Box替代Fill填充区间+修正开盘价逻辑
修复TradingView Pine Script自动水平指标的两个问题
针对你提到的两个问题,以下是修复后的完整代码,同时做了针对性优化:
//@version=5 indicator('AutoLevels', overlay=true) // 检测新交易日 is_new_day = ta.change(time('D')) // 初始化当日开盘价和ATR值 var float daily_open = na var float daily_atr = na // 新交易日时更新开盘价和对应的ATR if is_new_day daily_open = request.security(syminfo.tickerid, 'D', open) // 获取日线级别的ATR(前14周期) daily_atr = request.security(syminfo.tickerid, 'D', ta.atr(14)) // 倍数输入 mult2 = input(.236, title="0.236 Multiplier") mult3 = input(.382, title="0.382 Multiplier") mult5 = input(.618, title="0.618 Multiplier") mult6 = input(.786, title="0.786 Multiplier") mult7 = input(1.236, title="1.236 Multiplier") mult8 = input(1.382, title="1.382 Multiplier") mult9 = input(1.0, title="1.0 Multiplier") // 计算上方水平位 u_mult2 = daily_open + daily_atr / 2 * mult2 u_mult3 = daily_open + daily_atr / 2 * mult3 u_mult5 = daily_open + daily_atr / 2 * mult5 u_mult6 = daily_open + daily_atr / 2 * mult6 u_mult7 = daily_open + daily_atr / 2 * mult7 u_mult8 = daily_open + daily_atr / 2 * mult8 u_mult9 = daily_open + daily_atr / 2 * mult9 // 计算下方水平位 l_mult2 = daily_open - daily_atr / 2 * mult2 l_mult3 = daily_open - daily_atr / 2 * mult3 l_mult5 = daily_open - daily_atr / 2 * mult5 l_mult6 = daily_open - daily_atr / 2 * mult6 l_mult7 = daily_open - daily_atr / 2 * mult7 l_mult8 = daily_open - daily_atr / 2 * mult8 l_mult9 = daily_open - daily_atr / 2 * mult9 // 绘制当日开盘线 plot(daily_open, color=color.rgb(255, 255, 255), linewidth=2) // 绘制上方水平位 line1 = plot(u_mult2, color=color.green, linewidth=1) line2 = plot(u_mult3, color=color.green, linewidth=1) plot(u_mult5, color=color.rgb(175, 147, 76)) line5 = plot(u_mult6, color=color.rgb(175, 147, 76)) plot(u_mult7, color=color.rgb(175, 147, 76)) plot(u_mult8, color=color.rgb(175, 147, 76)) line6 = plot(u_mult9, color=color.rgb(175, 147, 76)) // 绘制下方水平位 line3 = plot(l_mult2, color=color.red, linewidth=1) line4 = plot(l_mult3, color=color.red, linewidth=1) plot(l_mult5, color=color.rgb(175, 147, 76)) line7 = plot(l_mult6, color=color.rgb(175, 147, 76)) plot(l_mult7, color=color.rgb(175, 147, 76)) plot(l_mult8, color=color.rgb(175, 147, 76)) line8 = plot(l_mult9, color=color.rgb(175, 147, 76)) // 用Box实现区间填充(向右延伸) var box upper_green_box = na var box upper_gray_box = na var box lower_red_box = na var box lower_gray_box = na // 新交易日时创建Box if is_new_day // 上方绿色区间 upper_green_box := box.new(bar_index, u_mult2, bar_index, u_mult3, color=color.rgb(15, 61, 16), extend=extend.right) // 上方灰色区间 upper_gray_box := box.new(bar_index, u_mult6, bar_index, u_mult9, color=color.rgb(73, 87, 73, 54), extend=extend.right) // 下方红色区间 lower_red_box := box.new(bar_index, l_mult3, bar_index, l_mult2, color=color.rgb(147, 15, 15, 14), extend=extend.right) // 下方灰色区间 lower_gray_box := box.new(bar_index, l_mult9, bar_index, l_mult6, color=color.rgb(73, 87, 73, 45), extend=extend.right) // 延伸水平线至未来 if barstate.islastconfirmedhistory line.new(bar_index, daily_open, bar_index + 1, daily_open, color=color.rgb(255, 255, 255), width=2, extend=extend.right) line.new(bar_index, u_mult2, bar_index + 1, u_mult2, color=color.green, extend=extend.right) line.new(bar_index, u_mult3, bar_index + 1, u_mult3, color=color.green, width=1, extend=extend.right) line.new(bar_index, u_mult5, bar_index + 1, u_mult5, color=color.rgb(175, 147, 76), extend=extend.right) line.new(bar_index, u_mult6, bar_index + 1, u_mult6, color=color.rgb(175, 147, 76), extend=extend.right) line.new(bar_index, u_mult7, bar_index + 1, u_mult7, color=color.rgb(175, 147, 76), extend=extend.right) line.new(bar_index, u_mult8, bar_index + 1, u_mult8, color=color.rgb(175, 147, 76), extend=extend.right) line.new(bar_index, u_mult9, bar_index + 1, u_mult9, color=color.rgb(175, 147, 76), extend=extend.right) line.new(bar_index, l_mult2, bar_index + 1, l_mult2, color=color.red, extend=extend.right) line.new(bar_index, l_mult3, bar_index + 1, l_mult3, color=color.red, width=1, extend=extend.right) line.new(bar_index, l_mult5, bar_index + 1, l_mult5, color=color.rgb(175, 147, 76), extend=extend.right) line.new(bar_index, l_mult6, bar_index + 1, l_mult6, color=color.rgb(175, 147, 76), extend=extend.right) line.new(bar_index, l_mult7, bar_index + 1, l_mult7, color=color.rgb(175, 147, 76), extend=extend.right) line.new(bar_index, l_mult8, bar_index + 1, l_mult8, color=color.rgb(175, 147, 76), extend=extend.right) line.new(bar_index, l_mult9, bar_index + 1, l_mult9, color=color.rgb(175, 147, 76), extend=extend.right)
关键修改说明
开盘价逻辑修复
- 移除了
lookahead=barmerge.lookahead_on参数,避免引入未来数据偏差。 - 通过
ta.change(time('D'))检测新交易日,在交易日起始点获取真实的当日开盘价和对应日线ATR值,确保所有水平位基于正确的开盘价计算。
- 移除了
Box填充实现
- 使用
var声明Box变量,确保每个交易日仅创建一次填充Box,避免重复绘制。 - 创建Box时设置
extend=extend.right,让填充区域直接延伸至实时K线区域,解决了原fill函数仅在K线闭合后显示的问题。 - 保留了原有的plot和line延伸逻辑,保证水平线条与填充区域的可视化一致性。
- 使用
内容的提问来源于stack exchange,提问作者Steven E
相关产品推荐
相关产品推荐

