Untitled

 avatar
unknown
typescript
12 days ago
2.5 kB
7
Indexable
import Debug from "debug";
import api from "../utils/api";

const debug = Debug("app:trades-aggregator");

interface Candle {
  time: number;
  close_time: number;
  open: number;
  high: number;
  low: number;
  close: number;
  volume: number;
  trades: number;
  quote: number;
  sell_trades: number;
  sell_volume: number;
  sell_quote: number;
  buy_trades: number;
  buy_volume: number;
  buy_quote: number;
}

interface Trade {
  id: number;
  price: string;
  qty: string;
  quoteQty: string;
  time: number;
  isBuyerMaker: boolean;
  isBestMatch: boolean;
}

const symbol = "ETHUSDT";
// const fromId = 1266365373 // start of 2024
const fromId = 1388839494;
const limit = 1000;
const interval = 1;
const msInterval = interval * 60e3;

let lastId = fromId;
let current: Candle;

const data: Candle[] = [];

export default async ({ nextCall }: { nextCall: (ii: number) => void }) => {
  const response = await api.getHistoricalTrades({
    symbol,
    limit,
    fromId: lastId,
  });
  const trades: Trade[] = response.data;

  for (const trade of trades) {
    const side = trade.isBuyerMaker ? "sell" : "buy";
    const price = parseFloat(trade.price);
    const volume = parseFloat(trade.qty);
    const quote = parseFloat(trade.quoteQty);
    const time = trade.time - (trade.time % msInterval);

    if (!current || current.time !== time) {
      if (current) {
        debug("new candle", new Date(current.time));
        data.push(current);
      }

      current = {
        time,
        close_time: time + msInterval,
        open: price,
        high: price,
        low: price,
        close: price,
        volume: 0,
        trades: 0,
        quote: 0,
        sell_trades: 0,
        sell_volume: 0,
        sell_quote: 0,
        buy_trades: 0,
        buy_volume: 0,
        buy_quote: 0,
      };
    }

    current.close = price;
    current.volume += volume;
    current.trades += 1;
    current.quote += quote;
    current.high = Math.max(price, current.high);
    current.low = Math.min(price, current.low);

    if (current && side === "buy") {
      current.buy_trades += 1;
      current.buy_volume += volume;
      current.buy_quote += quote;
    }
    if (current && side === "sell") {
      current.sell_trades += 1;
      current.sell_volume += volume;
      current.sell_quote += quote;
    }
  }

  if (trades.length) {
    lastId = trades[trades.length - 1].id + 1;
  }

  if (trades.length !== limit) {
    nextCall(1e3);
  } else {
    nextCall(0);
  }
};
Editor is loading...
Leave a Comment