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)
我想从 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)