【问题标题】:How to conditionally delete line in Pine Script如何有条件地删除 Pine Script 中的行
【发布时间】:2020-01-24 18:36:58
【问题描述】:

我正在尝试创建一个 TradingView 研究,该研究从当前柱上的交叉线到前一个柱上的交叉线绘制一条线,其中前一个柱小于设置的最大柱数。

我只想绘制具有负斜率的线(即之前的交叉点发生在更高的值),我也不想要多条具有相同起点的线(没有重叠的线)。

我能够正确绘制线条,但我不知道如何在它们重叠时删除线条(具有相同的起点)。

当绘制一条与旧线重叠的新线时,如何获取对旧线的引用以便删除它?

在 pine 脚本中似乎不可能:

  • 迭代行序列中的先前值以检查它们的 x,y 值
  • 通过 bar_index 之类的索引访问行系列
  • 访问前一行值而不创建新行
//@version=4
study(title='MACD trend')
src = input(close)
fast = input(12)
slow = input(26)
smooth = input(9)
numBarsBack = input(50)

fast_ma = wma(src, fast)
slow_ma = wma(src, slow)
macd = fast_ma-slow_ma
signal = wma(macd, smooth)
hist = macd - signal

if (crossunder(macd, signal))
// cross under happened on previous bar
    for i = 1 to numBarsBack
    // inspect previous bars up to 'numBarsBack'
        if (crossunder(macd,signal)[i])
            if (macd - macd[i] < 0)
            // located a previous cross under with a higher macd value
                l = line.new(bar_index[1], macd[1], bar_index[i+1], macd[i+1], width=1, color=color.red)
                // drew line from previous cross under to current cross under, 
                // offset x's by 1 bar since crossunder returns true based on previous bar's cross under
                for k = 1 to i
                // inspect previous bars up to the starting point of drawn line
                    if (crossunder(macd, signal)[k] and macd > macd[k])
                    // if the previous cross under value is less than the current one
                        line.delete(l[1])
                        // not sure what the 1 here indexes???

plot(title='MACD', series=macd,transp=0,linewidth=2, color=color.yellow)
plot(title='SIGNAL', series=signal,transp=0,linewidth=2, color=color.red)

【问题讨论】:

    标签: pine-script


    【解决方案1】:

    查看代码中的 cmets。使线条更粗,以便更容易看到,并在脚本末尾添加调试图。

    基本思想是在初始化l 变量时使用非常方便的var 关键字传播先前创建的行的行ID。这样,在创建新行之前,我们会获取用于创建前一行的y2,因此如果它的y2 与我们将要创建的行匹配(因此是从同一个峰值绘制的),则可以删除该行。

    交叉峰检测使用 Pine 内置插件而不是 for 循环。这样代码会运行得更快。

    //@version=4
    study(title='MACD trend2')
    src = input(close)
    fast = input(12)
    slow = input(26)
    smooth = input(9)
    numBarsBack = input(50)
    
    fast_ma = wma(src, fast)
    slow_ma = wma(src, slow)
    macd = fast_ma-slow_ma
    signal = wma(macd, smooth)
    hist = macd - signal
    
    xDn = crossunder(macd, signal)
    // Get macd at at highest xDn in last numBarsBack bars. If no Xdn found, set value to -10e10.
    highestXDnMacd = highest(xDn ? macd : -10e10, numBarsBack)
    // Get offset to that point.
    highestXDnOffset = - highestbars(xDn ? macd : -10e10, numBarsBack)
    
    // Detect if previous xDn meets all criteria.
    lastXDnWasHigher = xDn and macd < highestXDnMacd
    // Make l persistent, so that it always contains the line id of the last line created.
    var line l = na
    if lastXDnWasHigher
        // Retrieve y2 used to draw previous line.
        if line.get_y2(l) == highestXDnMacd
            // Last line drawn used same y2 as the one we are about to use; delete it.
            // No more than one line back can have same peak since previous ones have already been deleted.
            line.delete(l)
        // The line id we assign to l here will persist through future bars,
        // which is what will allow us to delete the corresponding line using the line.delete() above, if needed.
        l := line.new(bar_index[1], macd[1], bar_index - highestXDnOffset, macd[highestXDnOffset], width=3, color=color.black)
    
    plot(title='MACD', series=macd,transp=0,linewidth=2, color=color.yellow)
    plot(title='SIGNAL', series=signal,transp=0,linewidth=2, color=color.red)
    
    // Debugging.
    plot(highestXDnMacd != -10e10 ? highestXDnMacd : na, "highestXDnMacd", color.silver, 2, plot.style_circles)
    plotchar(highestXDnOffset, "highestXDnOffset", "", location.top)    // For Data Window display.
    bgcolor(lastXDnWasHigher ? color.green : xDn ? color.silver : na, 60)
    

    【讨论】:

    • 啊,这解决了我的问题,谢谢你的提示! “var line l”语法是我所缺少的,不知道你可以为变量定义一个类型而不用在 pine 脚本中初始化它。
    • 很高兴它对您有用。 var 实际上初始化变量,但仅在第一个柱上,它具有跨柱传播其值的次要效果,而不需要像在 v3 中那样,当你不想时从最后一个柱连续获取它的值失去它。因此,虽然 var 的行为可以在 v3 中重现,但使用它可以简化代码,使其更易于阅读,因为它明确地声明了我们的意图,并且比在每个柱上初始化略快。
    猜你喜欢
    • 2019-01-16
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2022-08-20
    • 2013-06-04
    • 2015-08-31
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多