Volume

Indicators that weigh price by traded volume. See the indicator reference for how to read a signature, and Indicators for the construction and guarding rules.

ChaikinMoneyFlow

Chaikin money flow: Σ(money-flow volume) / Σ(volume) over length, between −1 and 1.

new ChaikinMoneyFlow(candleIndicator: Indicator<Candle>, length: number = 20)
Parameter Type Default Meaning
candleIndicator Indicator<Candle> required The candle series.
length number 20 Window length.
  • Input: The candle series.
  • Value (getValue() after hasValue()): number | undefined
  • Warm-up: A value from the first candle with non-zero volume; the window is complete after length candles.
const symbol = 'BTC';
const candles = manager.getIntervalData(symbol, 60);
const indicator = new ChaikinMoneyFlow(candles, 20);

manager.onIntervalCandle(symbol, 60, () => {
  if (!indicator.hasValue()) return;
  const value = indicator.getValue();
  if (value === undefined) return;
  manager.debugLog('CMF', value);
});

MFI

Money flow index: a volume-weighted RSI of the typical price, between 0 and 100.

new MFI(candleIndicator: Indicator<Candle>, period: number = 14)
Parameter Type Default Meaning
candleIndicator Indicator<Candle> required The candle series.
period number 14 Window length.
  • Input: The candle series.
  • Value (getValue() after hasValue()): number
  • Warm-up: Returns 50 on the first candle and a partial-window value until period + 1 candles.
const symbol = 'BTC';
const candles = manager.getIntervalData(symbol, 60);
const indicator = new MFI(candles, 14);

manager.onIntervalCandle(symbol, 60, () => {
  if (!indicator.hasValue()) return;
  const value = indicator.getValue();
  manager.debugLog('MFI', value);
});

OnBalanceVolume

On-balance volume: a running total that adds the candle volume when the price rises and subtracts it when it falls.

new OnBalanceVolume(priceIndicator: Indicator<number | undefined>, volumeIndicator: Indicator<number>)
Parameter Type Default Meaning
priceIndicator Indicator<number | undefined> required The price stream (candles.close).
volumeIndicator Indicator<number> required The volume stream (candles.volume).
  • Input: Two number streams: price and volume.
  • Value (getValue() after hasValue()): number
  • Warm-up: A number (starting at 0) from the first candle.
const symbol = 'BTC';
const candles = manager.getIntervalData(symbol, 60);
const indicator = new OnBalanceVolume(candles.close, candles.volume);

manager.onIntervalCandle(symbol, 60, () => {
  if (!indicator.hasValue()) return;
  const value = indicator.getValue();
  manager.debugLog('OBV', value);
});

PMAR

Price-to-moving-average ratio: price / VWMA(price, volume, period).

new PMAR(priceIndicator: Indicator<number>, volumeIndicator: Indicator<number>, period: number)
Parameter Type Default Meaning
priceIndicator Indicator<number> required The price stream.
volumeIndicator Indicator<number> required The volume stream.
period number required VWMA length.
  • Input: Two number streams: price and volume.
  • Value (getValue() after hasValue()): number
  • Warm-up: A number from the first candle (partial VWMA window until period).
const symbol = 'BTC';
const candles = manager.getIntervalData(symbol, 60);
const indicator = new PMAR(candles.close, candles.volume, 20);

manager.onIntervalCandle(symbol, 60, () => {
  if (!indicator.hasValue()) return;
  const value = indicator.getValue();
  manager.debugLog('price / VWMA', value);
});

PMARP

PMAR percentile, The_Caretaker's: the share, in percent, of the previous lookback PMAR values (fewer at first) not above the current one.

new PMARP(priceIndicator: Indicator<number>, volumeIndicator: Indicator<number>, period: number, lookback: number)
Parameter Type Default Meaning
priceIndicator Indicator<number> required The price stream.
volumeIndicator Indicator<number> required The volume stream.
period number required VWMA length.
lookback number required How many PMAR values to rank against.
  • Input: Two number streams: price and volume.
  • Value (getValue() after hasValue()): number | undefined
  • Warm-up: First value on candle period + 1.
const symbol = 'BTC';
const candles = manager.getIntervalData(symbol, 60);
const indicator = new PMARP(candles.close, candles.volume, 20, 350);

manager.onIntervalCandle(symbol, 60, () => {
  if (!indicator.hasValue()) return;
  const value = indicator.getValue();
  if (value === undefined) return;
  manager.debugLog('PMARP', value);
});

VolumeProfile

Volume profile over the last numberOfBars candles: volume per price row, point of control and value area.

new VolumeProfile(candleIndicator: Indicator<Candle>, options: VolumeProfileOptions = { numberOfBars: 150, rowSize: 24, valueAreaPercent: 70 })
Parameter Type Default Meaning
candleIndicator Indicator<Candle> required The candle series.
options VolumeProfileOptions { numberOfBars: 150, rowSize: 24, valueAreaPercent: 70 } { numberOfBars: 1 to 500, rowSize: price rows, valueAreaPercent: share of volume in the value area }. All three are required when you pass the object.
  • Input: The candle series.
  • Value (getValue() after hasValue()): VolumeProfileValue | undefined
    • pocLevel: number | undefined
    • pocVolume: number | undefined
    • valueAreaHigh: number | undefined
    • valueAreaLow: number | undefined
    • profileData: VolumeProfileRow[] | undefined
    • totalVolume: number | undefined
  • VolumeProfileOptions is { numberOfBars: number; rowSize: number; valueAreaPercent: number }.
  • VolumeProfileRow is { priceLevel: number; upVolume: number; downVolume: number; totalVolume: number; isValueArea: boolean; isPOC: boolean }.
  • Warm-up: Available from the first candle; representative once numberOfBars candles are in the window.
const symbol = 'BTC';
const candles = manager.getIntervalData(symbol, 60);
const indicator = new VolumeProfile(candles, { numberOfBars: 100, rowSize: 24, valueAreaPercent: 70 });

manager.onIntervalCandle(symbol, 60, () => {
  if (!indicator.hasValue()) return;
  const value = indicator.getValue();
  if (value === undefined || value.pocLevel === undefined) return;
  manager.debugLog('POC', value.pocLevel, 'value area', value.valueAreaLow, value.valueAreaHigh);
});
Browse the documentation