繁体   English   中英

在每个最后的移动平均线交叉(如 ZigZag)中获得最高点和最低点

[英]Get Highest high and lowest low in every last Moving Average Cross like ZigZag

我正在尝试编写一个指标来绘制每个移动平均线交叉点之间的最高点和最低点。 就像锯齿形调整浪指标。

例如,如果快速 MA 从下方穿过慢速 MA,则指标应该只寻找最高的高点,并且交叉之间应该只有一个值。 对于上面的交叉,指标应该只绘制一个值,即自上次交叉以来的最低点。

我是 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)

我不是 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)

在此处输入图片说明

在屏幕截图下方的指标中,我绘制了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 ,您的指标将没有有效输出if MA >= M1因为在这种情况下您将na分配给HighestCross 但我想你已经知道了。

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

else
    HighestCross := na

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM