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

Pine Script指标绘制异常:预期3条线却出现重复/缺失

问题分析与解决

核心问题

你的代码在每一根K线都会执行一次drawLines()函数,导致每根K线都生成3条新线条——随着K线不断推进,旧线条会被Pine Script的绘图资源回收机制清理,所以看起来线条数量逐渐减少;同时bar_index[15]和bar_index[14]是动态变化的(每根新K线生成时,这两个值指向的都是“当前K线往前数15/14根”的位置),所以每次绘制的线条起点/终点都在移动,完全不符合你“固定从某两个历史bar出发”的预期。

修正后的代码

//@version=5 
indicator("My Fan", overlay=true, max_bars_back = 400)

// 定义线条开关输入(移到函数外,避免重复创建输入项)
draw1x1 = input(true, "Draw 1 Line")
draw1x2 = input(true, "Draw 2 Line")
draw2x1 = input(true, "Draw 3 Line")

// 定义固定的起点/终点bar偏移(这里是往前数15和14根K线,可按需调整)
origBarOffset = 15
adjBarOffset = 14

// 存储线条对象,用var确保只初始化一次
var line line1 = na
var line line2 = na
var line line3 = na

drawLines() =>
    // 获取固定的起点/终点bar索引
    origX = bar_index[origBarOffset]
    origY = input.float(448, "Origin Y")
    adjX = bar_index[adjBarOffset]
    adjY = input.float(446, "Adjustment Y")

    dx = adjX - origX
    dy = adjY - origY
    adjPriceUnit = 1 / 8  // 1/8 line
    adjYnew = adjY - (adjPriceUnit * dx)
    dxnew = adjX - origX
    dynew = adjYnew - origY
    priceUnitnew = dynew / dxnew

    // 更新或创建线条,只执行一次
    if draw1x1
        if na(line1)
            line1 := line.new(origX, origY, adjX, adjYnew, extend=extend.right, color=color.blue, width=2)
        else
            line.set_xy1(line1, origX, origY)
            line.set_xy2(line1, adjX, adjYnew)
    else
        line.delete(line1)
        line1 := na

    if draw1x2
        y2 = origY + priceUnitnew * 2
        if na(line2)
            line2 := line.new(origX, origY, adjX, y2, extend=extend.right, color=color.blue, width=1)
        else
            line.set_xy1(line2, origX, origY)
            line.set_xy2(line2, adjX, y2)
    else
        line.delete(line2)
        line2 := na

    if draw2x1
        x2 = origX + dxnew * 2
        if na(line3)
            line3 := line.new(origX, origY, x2, adjY, extend=extend.right, color=color.blue, width=1)
        else
            line.set_xy1(line3, origX, origY)
            line.set_xy2(line3, x2, adjY)
    else
        line.delete(line3)
        line3 := na

// 只在最新K线执行绘制/更新(确保线条固定且只创建一次)
if barstate.islast
    drawLines()

关键修改说明

  1. 用var存储线条对象:确保线条只被创建一次,后续只更新坐标,不会重复生成新线条。
  2. 限制执行时机:通过barstate.islast让drawLines()只在最新K线执行,避免每根K线都重复绘制。
  3. 统一输入项位置:把开关输入移到函数外,避免每调用一次函数就创建重复的输入控件。
  4. 线条管理:增加了开关控制线条的显示/删除,当关闭某个开关时会自动删除对应线条。

这样修改后,线条会固定在你预期的bar_index[15]和bar_index[14]位置(相对于最新K线),且只会生成3条线,不会随着K线推进出现数量减少或位置偏移的问题。

内容的提问来源于stack exchange,提问作者Peace Nail

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:05:22