Class NegativeVolumeIndexRTIndicator

java.lang.Object
com.wualabs.qtsurfer.engine.indicators.core.AbstractRTIndicator
com.wualabs.qtsurfer.engine.indicators.volume.pro.NegativeVolumeIndexRTIndicator
All Implemented Interfaces:
Resettable, CacheableRTIndicator, RichRTIndicator<MarketSnapshot>, RTIndicator

public class NegativeVolumeIndexRTIndicator extends AbstractRTIndicator implements RichRTIndicator<MarketSnapshot>, CacheableRTIndicator
Negative Volume Index (NVI) with O(1) per-tick computation.
  if volume < prevVolume:
    NVI = prevNVI + ((close - prevClose) / prevClose) * prevNVI
  else:
    NVI = prevNVI

Starts at 1000. The NVI only changes on days when volume decreases from the previous day, capturing what the "smart money" is doing during quiet periods.

  • Constructor Details

    • NegativeVolumeIndexRTIndicator

      public NegativeVolumeIndexRTIndicator()
  • Method Details

    • signature

      public String signature()
      Description copied from interface: CacheableRTIndicator
      This instance's math identity — equal signatures must mean identical value series for identical input.
      Specified by:
      signature in interface CacheableRTIndicator
      Returns:
      the identity, or null when this instance cannot state one (an unidentifiable source, a mode the implementation does not model) and must therefore compute live
    • reset

      public void reset()
      Specified by:
      reset in interface Resettable
      Overrides:
      reset in class AbstractRTIndicator
    • requiresBarData

      public boolean requiresBarData()
      Whether this indicator's result is only meaningful over per-bar OHLCV data.

      The distinction matters because a RichRTIndicator<MarketSnapshot> accepts a TickerSnapshot just as happily as a KlineSnapshot — and on the ticker path volume, high, low and open are the exchange's 24-hour rolling statistics, not this tick's bar. Nothing throws: OBV silently accumulates a 24h volume figure over and over, ATR reads a 24h range as if it were one bar's. The numbers look plausible and mean nothing, which is the worst failure mode of the three.

      Indicators that return true are flagged once per (indicator, instrument) when bound on the ticker path — see InstrumentMapTickerSourceRTIndicator. Scalar indicators (SMA/EMA/RSI over a single price) are unaffected and default to false.

      true: this indicator reads per-bar OHLCV, which the ticker path does not carry.

      Specified by:
      requiresBarData in interface RichRTIndicator<MarketSnapshot>
      Returns:
      true if this indicator needs real bar data; false by default
    • updateFrom

      public double updateFrom(MarketSnapshot snap)
      Description copied from interface: RichRTIndicator
      Updates the indicator from a full market snapshot. Returns the new value so callers can chain (matching RTIndicator.update(double)'s contract).
      Specified by:
      updateFrom in interface RichRTIndicator<MarketSnapshot>
    • updateCV

      public double updateCV(double close, double volume)
    • update

      public double update(double newValue)
      Specified by:
      update in interface RTIndicator
      Overrides:
      update in class AbstractRTIndicator