Volume Weighted Pivot Point Moving Averages VPPMA
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © peacefulLizard50262

//@version=5
indicator("PPMA", overlay = true)

timeframe = input.timeframe(defval = '240')
leftBars  = input.int(defval = 2, title = "Left Bars", minval = 1)
rightBars  = input.int(defval = 2, title = "Right Bars", minval = 1)

get_phpl()=>
    float ph = ta.pivothigh(leftBars, rightBars)
    float pl = ta.pivotlow(leftBars, rightBars)
    phtimestart = ph ? time[rightBars] : na
    phtimeend = ph ? time[rightBars - 1] : na
    pltimestart = pl ? time[rightBars] : na
    pltimeend = pl ? time[rightBars - 1] : na

    [ph, phtimestart, phtimeend, pl, pltimestart, pltimeend]

// get if there if Pivot High/low and their start/end times
[ph, phtimestart, phtimeend, pl, pltimestart, pltimeend] = request.security(syminfo.tickerid, timeframe, get_phpl(), lookahead = barmerge.lookahead_on)

// keep time of each bars, this is used for lines/labels
var mytime = array.new_int(0)
array.unshift(mytime, time)

// calculate end of the line/time for pivot high/low
bhend = array.get(mytime, math.min(array.indexof(mytime, phtimeend) + 1, array.size(mytime) - 1))
blend = array.get(mytime, math.min(array.indexof(mytime, pltimeend) + 1, array.size(mytime) - 1))

// to draw once
float pivothigh = na(ph[1]) and ph ? ph : na
float pivotlow  = na(pl[1]) and pl ? pl : na

vppma()=>
    signal = ta.change(pivothigh or pivotlow)
    var int count        = na
    var float sum        = na
    var float volume_sum = na
    if not signal
        count := nz(count[1]) + 1
        sum := nz(sum[1]) + close * volume
        volume_sum := nz(volume_sum[1]) + volume
    else
        count := na
        sum := na
        volume_sum := na
    sum/volume_sum


plot(vppma())
