我正在尝试创建一个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)

最佳答案

查看代码中的注释。使线条更粗,以便于查看和在脚本末尾添加调试图。

基本思想是在初始化var变量时使用非常方便的l关键字传播先前创建的行的行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)


pine-script - 如何在Pine Script中有条件地删除行-LMLPHP

关于pine-script - 如何在Pine Script中有条件地删除行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59901954/

10-10 03:37