MACD 直方图平均值的函数

Function for MACD histogram average

我想从 MACD 直方图中得到 X 柱的平均值,但分别只针对正值或负值。有了它,我希望能够搜索直方图尖峰并将它们与平均值进行比较。 因此,为了(我的)简单起见,我试图通过一个针对正值或负值的函数来实现这一点。这是 histogram 正值的示例,我尝试回顾 _lookback 数量的条形图,如果条形图具有正值,我将该值添加到先前的平均值并将其除以在此之前打印的正值(即 c_avgGreenCounter)的数量:

f_getAvgHistoGreen(_lookback) => 
var avgHistogramGreen = 0.0
var avgGreenCounter = 0
for i = 0 to _lookback by 1
    if hist[i] >= 0
        avgGreenCounter +=  1
        avgHistogramGreen := (avgHistogramGreen + hist[i]) / 2
    else
        avgHistogramGreen := avgHistogramGreen
        avgGreenCounter := avgGreenCounter
[avgGreenCounter, avgHistogramGreen]
 

只有当我用这个函数调用它时:

[avgGreenCounter, avgHistogramGreen] = f_getAvgHistoGreen(50)

avgGreenCounter 命中超高数字,这显然是错误的。有人可以至少用积极的价值观帮助我吗?直方图值打印正确,我已经检查过了。我想我也能弄清楚底片。

您的超额结果来自于使用 var 声明变量,因此当脚本在每个历史柱上执行时,这些变量将保留在前一个柱上调用的函数的结果。您最终会得到一个累积结果,而不仅仅是最后 n 个柱的结果。

同样在循环中,你不知道最终会返回多少结果,所以你只需要在循环中找到直方图值的总和。循环完成后,您可以通过除以结果数来获得平均值。

//@version=5
indicator("macd avg hist", overlay = false)


f_getAvgHistoGreen(_lookback, _hist) => 
    float _sumHistogramGreen = 0.0
    int _avgGreenCounter = 0
    for i = 0 to _lookback by 1
        if _hist[i] >= 0
            _avgGreenCounter +=  1
            _sumHistogramGreen += _hist[i]
    _avgHistogramGreen = _sumHistogramGreen / _avgGreenCounter
    [_avgGreenCounter, _avgHistogramGreen]


[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)

[avgGCount, avgHistG] = f_getAvgHistoGreen(50, histLine)

plot(avgGCount)
plot(avgHistG)

您的脚本将在每个柱上执行。因此,您可以一路计算,而不是使用将在每个柱上执行的 for 循环,这样您可以节省一些性能。

//@version=5
indicator("My Script")
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)

var pos_hist_cnt = 0
var pos_hist_total = 0.0
var pos_hist_avg = 0.0
var neg_hist_cnt = 0
var neg_hist_total = 0.0
var neg_hist_avg = 0.0

if (histLine >= 0)
    pos_hist_total := pos_hist_total + histLine
    pos_hist_cnt := pos_hist_cnt + 1
    pos_hist_avg := pos_hist_total / pos_hist_cnt

if (histLine <0)
    neg_hist_total := neg_hist_total + histLine
    neg_hist_cnt := neg_hist_cnt + 1
    neg_hist_avg := neg_hist_total / neg_hist_cnt

plot(series=histLine)
plot(series=pos_hist_avg, color=color.green)
plot(series=neg_hist_avg, color=color.red)