// Licensed under the Apache License, Version 2.0 // © mihakralj //@version=6 indicator("Trade Volume Index (TVI)", "TVI", overlay=false) //@function Calculates Trade Volume Index //@param price Price series for tick direction analysis //@param vol Volume series for weighting //@param min_tick Minimum price movement to register direction change //@returns Trade Volume Index value //@optimized for performance and dirty data tvi(series float price, simple float min_tick, series float vol=volume) => float p = nz(price, close), float v = nz(vol, 0.0) float pp = nz(p[1], p) float price_change = p - pp var int direction = 1 var float tvi_sum = 0.0 direction := price_change > min_tick ? 1 : price_change < -min_tick ? 0 : direction tvi_sum += direction == 1 ? v : -v tvi_sum // ---------- Main loop ---------- // Inputs i_price_source = input.source(close, "Price Field", tooltip="Open, High, Low or Closing price") i_min_tick = input.float(0.125, "Min. Move", minval=0.0001, tooltip="Minimum price change to register direction") // Calculation tvi_value = tvi(i_price_source, i_min_tick) // Plot plot(tvi_value, "TVI", color=color.yellow, linewidth=2)