wiki/examples/ts/calculate-ohlcvs-from-trades.md
'use strict';
import ccxt from '../../js/ccxt.js';
console.log ('CCXT Version:', ccxt.version); // eslint-disable-line import/no-named-as-default-member
async function main () {
let ohlcvs: any = {};
const symbol = 'BTC/USDT';
const exchange = new ccxt.pro.binance ({ 'newUpdates': true });
await exchange.loadMarkets ();
const market = exchange.market (symbol);
const timeframe = '1m';
const duration = exchange.parseTimeframe (timeframe) * 1000;
console.log ('Starting', exchange.id, symbol);
while (true) {
try {
const trades = await exchange.watchTrades (symbol);
for (const trade of trades) { // eslint-disable-line
const timestampInt = Math.floor (trade['timestamp'] / duration) * duration;
const timestampString = timestampInt.toString ();
let candle = exchange.safeValue (ohlcvs, timestampString);
if (candle) {
candle[2] = Math.max (trade['price'], candle[2]);
candle[3] = Math.min (trade['price'], candle[3]);
candle[4] = trade['price'];
candle[5] = exchange.parseNumber (exchange.amountToPrecision (symbol, trade['amount'] + candle[5]));
candle[6] = exchange.parseNumber (exchange.costToPrecision (symbol, trade['cost'] + candle[6]));
} else {
candle = [
timestampInt,
trade['price'],
trade['price'],
trade['price'],
trade['price'],
exchange.parseNumber(exchange.amountToPrecision (symbol, trade['amount'])),
exchange.parseNumber (exchange.costToPrecision (symbol, trade['cost'])),
];
}
ohlcvs[timestampString] = candle;
}
console.log ('');
console.log (exchange.iso8601 (exchange.milliseconds ()), '------------------------------------------------------');
const values: any = Object.values (ohlcvs).slice (-1000);
ohlcvs = exchange.indexBy (values, 0);
console.log ('Datetime ', 'Timestamp ', ...[ 'Open', 'High', 'Low', 'Close', market['base'], market['quote'] ].map ((x: any) => x.toString ().padEnd (10, ' ')));
for (let i = 0; i < values.length; i++) {
const candle = values[i];
console.log (exchange.iso8601 (candle[0]), ...candle.map ((x: any) => x.toString ().padEnd (10, ' ')));
}
} catch (e: any) {
console.log (e.constructor.name, e.message);
await exchange.close (); // you can close connection if needed
}
}
}
main ();