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()afterhasValue()):number | undefined - Warm-up: A value from the first candle with non-zero volume; the window is complete after
lengthcandles.
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()afterhasValue()):number - Warm-up: Returns 50 on the first candle and a partial-window value until
period + 1candles.
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()afterhasValue()):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()afterhasValue()):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()afterhasValue()):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()afterhasValue()):VolumeProfileValue | undefinedpocLevel: number | undefinedpocVolume: number | undefinedvalueAreaHigh: number | undefinedvalueAreaLow: number | undefinedprofileData: VolumeProfileRow[] | undefinedtotalVolume: number | undefined
VolumeProfileOptionsis{ numberOfBars: number; rowSize: number; valueAreaPercent: number }.VolumeProfileRowis{ priceLevel: number; upVolume: number; downVolume: number; totalVolume: number; isValueArea: boolean; isPOC: boolean }.- Warm-up: Available from the first candle; representative once
numberOfBarscandles 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);
});