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

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)

关键修改说明

  1. 开盘价逻辑修复

    • 移除了lookahead=barmerge.lookahead_on参数,避免引入未来数据偏差。
    • 通过ta.change(time('D'))检测新交易日,在交易日起始点获取真实的当日开盘价和对应日线ATR值,确保所有水平位基于正确的开盘价计算。
  2. Box填充实现

    • 使用var声明Box变量,确保每个交易日仅创建一次填充Box,避免重复绘制。
    • 创建Box时设置extend=extend.right,让填充区域直接延伸至实时K线区域,解决了原fill函数仅在K线闭合后显示的问题。
    • 保留了原有的plot和line延伸逻辑,保证水平线条与填充区域的可视化一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:01:54