簡體   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