MFI - 缩放 pos 和 neg 资金流

MFI - scaling pos and neg money flow

代码

length = input(title="Length", type=input.integer, defval=14, minval=1, maxval=2000)
src = hlc3
mfipos = sum(volume * (change(src) <= 0 ? 0 : src), length)
mfineg = sum(volume * (change(src) >= 0 ? 0 : src), length)

_rsi(mfipos, mfineg) =>
    if mfipos == 0
        100
    if mfineg == 0
        0
    100.0 - (100.0 / (1.0 + mfipos / mfineg))
mf = _rsi(mfipos, mfineg)

plot(mfipos, color=#FF7000, linewidth=2, title='MFI pos')
plot(mfineg, color=#0088FA, linewidth=2, title='MFI neg')

MFI 是有限的。 Pos 和 Neg 资金流量图不绘制以下价格图。

为此,您可能需要使用 study() 函数的 scale 参数。
省去了规范化的麻烦。

参考手册中的study()函数摘录:

scale (const integer) price scale that the indicator should be attached to. Possible values are: scale.right, scale.left, scale.none. Value scale.none can be applied only in combination with 'overlay=true' setting. If omitted, using scale from main series.

示例 scale.left

//@version=4
study("Test", shorttitle="TST", overlay=true, scale=scale.left)

length = input(title="Length", type=input.integer, defval=14, minval=1, maxval=2000)
src = hlc3
mfiSlow = sum(volume * (change(src) <= 0 ? 0 : src), length)
mfiFast = sum(volume * (change(src) >= 0 ? 0 : src), length)

_rsi(mfiSlow, mfiFast) =>
    if mfiFast == 0
        100
    if mfiSlow == 0
        0
    100.0 - (100.0 / (1.0 + mfiSlow / mfiFast))
mf = _rsi(mfiSlow, mfiFast)

plot(mfiSlow, color=#FF7000, linewidth=2, title='MFI Slow')
plot(mfiFast, color=#0088FA, linewidth=2, title='MFI Fast')

产生

使用scale.none会产生这个

资金流量指数是一个从 0 到 100 的有界函数。为了按照我的需要正确绘制正负资金流量,我需要标准化最小值和最大值。

结果:

//Normal MFI calculation
length = input(title="Length", type=input.integer, defval=14, minval=1, maxval=2000)
src = hlc3
mfiPositive = sum(volume * (change(src) <= 0 ? 0 : src), length)
mfiNegative = sum(volume * (change(src) >= 0 ? 0 : src), length)

//MFI variables to normalize data to be plotted
mfiLow = lowest(length)
mfiHigh = highest(length)
min_mfiPos = lowest(mfiPositive, length)
min_mfiNeg = lowest(mfiNegative, length)
max_mfiPos = highest(mfiPositive, length)
max_mfiNeg = highest(mfiNegative, length)

mfiPosNorm = mfiHigh + (mfiPositive - min_mfiPos) * (mfiHigh - mfiLow) / (max_mfiPos - min_mfiPos)
mfiNegNorm = mfiHigh + (mfiNegative - min_mfiNeg) * (mfiHigh - mfiLow) / (max_mfiNeg - min_mfiNeg)
_rsi(mfiPositive, mfiNegative) =>
    if mfiNegative == 0
        100
    if mfiPositive == 0
        0
    100 - (100 / (1.0 + mfiPositive / mfiNegative))
mf = _rsi(mfiPositive, mfiNegative)
plot(mfiPosNorm, color=colorNavy, linewidth=2, title='MFI Positive Money Flow')
plot(mfiNegNorm, color=colorFuchsia, linewidth=2, title='MFI Negative Money Flow')