在每个最近的移动平均交叉线中获得最高价和最低价,例如锯齿形调整浪

时间:2019-09-07 16:41:27

标签: pine-script

我正在尝试编写一个指标,该指标绘制每个移动平均交叉线之间的最高价和最低价。就像ZigZag指标一样。

例如,如果快速移动平均线从下方穿过慢速移动平均线,则指标应仅寻找最高高线,并且交叉之间应该只有一个值。对于从上方进行的交叉来说,指标也应该仅绘制一个值,该值是自上次交叉以来的最低最低值。

我是Pine脚本的新手,但对于编码一般不是新手。我发现用Pine脚本编写最简单的代码具有挑战性。我正在学习如何用这种语言编写代码。

请帮助指导我如何找到正确的答案。谢谢

//@version=4
study(title="MA Cross", overlay=true, max_bars_back=3000)

MA1 = sma(close, 20)
MA2 = sma(close, 100)

Highest(src, len) =>
    max = high
    for i = 1 to len
        if src[i] > max
            max := src[i]
    max

Lowest(src, len) =>
    min = src[0]
    for i = 1 to len
        if src[i] < min
            min := src[i]
    min

HH = 0.0
HH := Highest(high, barssince(cross(MA1, MA2)))

LL = 0.0
LL := Lowest(low, barssince(cross(MA1, MA2)))

HighLow = 0.0

if(MA1 > MA2)
    HighLow := HH
else
    if(MA1 < MA2)
        HighLow := LL
    else
        HighLow := na


plot(series=HighLow, color = color.red, linewidth=3)
plot(series=MA1, color = color.aqua, linewidth=1)
plot(series=MA2, color = color.orange, linewidth=1)

1 个答案:

答案 0 :(得分:0)

我不确定100%,但是问题似乎与barssince()返回series[integer]的事实有关,并且在for条件下使用它会导致问题。

因此,您需要实现自己的barssince()。我为此使用了一个简单的计数器。

//@version=4
study(title="MA Cross Debug", overlay=false, max_bars_back=3000)

MA1 = sma(close, 20)
MA2 = sma(close, 100)

var cntA1LessThanA2 = 0
HighestCross = 0.0

MovingAverage_Long  = crossover(MA1, MA2) 

Highest(src, len) =>
    max = high
    for i = 1 to len
        if (src[i] > max)
            max := src[i]
    max

if (MA1 > MA2)
    cntA1LessThanA2 := cntA1LessThanA2 + 1
else
    cntA1LessThanA2 := 0

if (MA1 > MA2)
    HighestCross := Highest(high, cntA1LessThanA2)

else
    HighestCross := na

plot(series=barssince(MA1<MA2), title="barssince", color=color.green, linewidth=3)
plot(series=cntA1LessThanA2, title="cntA1LessThanA2", color=color.red, linewidth=3)

enter image description here

在屏幕截图下方的指示器中,我绘制了计数器(红色)并返回了barssince()(绿色)的值,以向您展示计数器的工作原理。

plot(series=barssince(MA1<MA2), title="barssince", color=color.green, linewidth=3)
plot(series=cntA1LessThanA2, title="cntA1LessThanA2", color=color.red, linewidth=3)

请注意,您的指标将没有有效的输出if MA >= M1,因为在这种情况下您将na分配给HighestCross。但是我想你已经知道了。

if (MA1 > MA2)
    HighestCross := Highest(high, cntA1LessThanA2)

else
    HighestCross := na

plot(HighestCross, color = color.red, linewidth = 3)

我相信您可以从这里拿走它。