Volume percentrank[TV1]
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TV-1ndicators
//
//**************************Volume normalized by percentile.**********************************
//The indicator calculates the percentile of the trading volume. 
//The volume in the base asset or the quote asset can be selected as data.
//To calculate the volume in a quote asset, the closing price or another standard method for calculating the price of a bar can be used.
//A feature of percentile calculation with a small data sample length is low accuracy.
//Although the script allows you to calculate a percentile with a length of 1, using a percentile length less than 100 is not recommended.
//On the other hand, huge length values ​​do not allow correctly calculating the percentile at the beginning of the chart,
//so when the date of the first bar changes (this happens on small timeframes if the TradingView subscription does not allow you to see all historical data),
//the indicator is subject to redrawing up to the bar number equal to the percentile sampling length.
//Also, huge percentile length values ​​can cause script errors.
//If the indicator doesn't work, just make the percentile length smaller.
//********************************************************************************************
//**************************Объем, нормализованный по процентилью.****************************
//Индикатор вычисляет процентиль объема торгов.
//В качестве данных может быть выбран объем в базовом(base) активе или котировочном(qute) активе.
//Для расчета объема в котировочном активе может использоваться цена закрытия либо другой стандатный метод расчета цены бара.
//Особенностью расчета процентиля при малой длине выборки данных является малая точность.
//Не смотря на то, что скрипт позволяет вычилить процентиль с длинной 1, использовавть длину процентиля меньше 100 не рекомендуется. 
//С другой стороны, большие значения длины не позволяют корректно рассчитать процентиль в начале графика, 
//поэтому при изменении даты первого бара (это происходит на малых таймфреймах, если подписка TradingView  не позволяет видеть все исторические данные) 
//индикатор подвержен перерисовке вплоть до номера бара равного длине выборки процентиля. 
//Кроме того, большие значения длины процентиля могут приводить к ошибке скрипта. 
//Если индикатор не работает, просто сделайте длину процентиля меньше. 
//********************************************************************************************

//@version=5
indicator("Volume percentrank[TV1]",'VP[TV1]',precision = 2)
var percentileQuote = input.string('quote','Percentile:'        ,options=['quote','base']                   ,inline = 'pecentile') == 'quote'
quoteSrc = input.source(close           ,'Source'                                                           ,inline = 'pecentile')
var percentileLength = input.int(1000   ,'Length'               ,minval=1 ,maxval=4999                      ,inline = 'pecentile')
var maType   = input.string ("SMA"      ,'Moving average'       ,options=["RMA", "SMA", "EMA", "WMA"]       ,inline = 'ma')
var maLength = input.int(100            ,'Length'                                                           ,inline = 'ma')

ma_function(source, length, type) =>
	switch type 
	    "RMA" => ta.rma(source, length)
	    "SMA" => ta.sma(source, length)
	    "EMA" => ta.ema(source, length)
	    =>       ta.wma(source, length)

volume_percentrank(percentileQuote_ ,src_ ,percentileLength_) =>
    var volume_     = percentileQuote_? volume*src_: volume
    var volume_percentrank  = 0.0
    volume_ := percentileQuote_? volume * src_: volume
    if bar_index
        volume_percentrank  := ta.percentrank(volume_, math.min(bar_index, percentileLength_))
    volume_percentrank
    
vp = volume_percentrank(percentileQuote ,quoteSrc ,percentileLength)
ma = ma_function(vp, maLength, maType)
plot(vp ,'VP' ,close>open?color.rgb(64, 192, 160, 65):color.rgb(255, 82, 82, 65) ,style=plot.style_columns)
plot(ma ,'MA' ,color.rgb(33, 149, 243, 85) ,style=plot.style_area)
bgcolor(bar_index < percentileLength?color.rgb(120, 123, 134, 85):color.rgb(255, 255, 255, 100),title='Insufficient Data')