Interface IExchangeSchema

Exchange schema registered via addExchange(). Defines candle data source and formatting logic.

interface IExchangeSchema {
    callbacks?: Partial<IExchangeCallbacks>;
    exchangeName: string;
    formatPrice?: (
        symbol: string,
        price: number,
        backtest: boolean,
    ) => Promise<string>;
    formatQuantity?: (
        symbol: string,
        quantity: number,
        backtest: boolean,
    ) => Promise<string>;
    getAggregatedTrades?: (
        symbol: string,
        from: Date,
        to: Date,
        backtest: boolean,
    ) => Promise<IAggregatedTradeData[]>;
    getCandles: (
        symbol: string,
        interval: CandleInterval,
        since: Date,
        limit: number,
        backtest: boolean,
    ) => Promise<IPublicCandleData[]>;
    getOrderBook?: (
        symbol: string,
        depth: number,
        from: Date,
        to: Date,
        backtest: boolean,
    ) => Promise<IOrderBookData>;
    note?: string;
}

Properties

callbacks?: Partial<IExchangeCallbacks>

Optional lifecycle event callbacks (onCandleData)

exchangeName: string

Unique exchange identifier for registration

formatPrice?: (
    symbol: string,
    price: number,
    backtest: boolean,
) => Promise<string>

Format price according to exchange precision rules.

Optional. If not provided, defaults to Bitcoin precision on Binance (2 decimal places).

Type declaration

    • (symbol: string, price: number, backtest: boolean): Promise<string>
    • Parameters

      • symbol: string

        Trading pair symbol

      • price: number

        Raw price value

      • backtest: boolean

        Whether running in backtest mode

      Returns Promise<string>

      Promise resolving to formatted price string

formatQuantity?: (
    symbol: string,
    quantity: number,
    backtest: boolean,
) => Promise<string>

Format quantity according to exchange precision rules.

Optional. If not provided, defaults to Bitcoin precision on Binance (8 decimal places).

Type declaration

    • (symbol: string, quantity: number, backtest: boolean): Promise<string>
    • Parameters

      • symbol: string

        Trading pair symbol

      • quantity: number

        Raw quantity value

      • backtest: boolean

        Whether running in backtest mode

      Returns Promise<string>

      Promise resolving to formatted quantity string

getAggregatedTrades?: (
    symbol: string,
    from: Date,
    to: Date,
    backtest: boolean,
) => Promise<IAggregatedTradeData[]>

Fetch aggregated trades for a trading pair. Optional. If not provided, throws an error when called.

Type declaration

    • (
          symbol: string,
          from: Date,
          to: Date,
          backtest: boolean,
      ): Promise<IAggregatedTradeData[]>
    • Parameters

      • symbol: string

        Trading pair symbol (e.g., "BTCUSDT")

      • from: Date

        Start of time range (used in backtest for historical data, can be ignored in live)

      • to: Date

        End of time range (used in backtest for historical data, can be ignored in live)

      • backtest: boolean

        Whether running in backtest mode

      Returns Promise<IAggregatedTradeData[]>

      Promise resolving to array of aggregated trade data

// Backtest implementation: returns historical aggregated trades for the time range
const backtestAggregatedTrades = async (symbol: string, from: Date, to: Date, backtest: boolean) => {
if (backtest) {
return await database.getAggregatedTrades(symbol, from, to);
}
return await exchange.fetchAggregatedTrades(symbol);
};

// Live implementation: ignores from/to when not in backtest mode
const liveAggregatedTrades = async (symbol: string, _from: Date, _to: Date, backtest: boolean) => {
return await exchange.fetchAggregatedTrades(symbol);
};
getCandles: (
    symbol: string,
    interval: CandleInterval,
    since: Date,
    limit: number,
    backtest: boolean,
) => Promise<IPublicCandleData[]>

Fetch candles from data source (API or database).

Type declaration

    • (
          symbol: string,
          interval: CandleInterval,
          since: Date,
          limit: number,
          backtest: boolean,
      ): Promise<IPublicCandleData[]>
    • Parameters

      • symbol: string

        Trading pair symbol (e.g., "BTCUSDT")

      • interval: CandleInterval

        Candle time interval (e.g., "1m", "1h")

      • since: Date

        Start date for candle fetching

      • limit: number

        Maximum number of candles to fetch

      • backtest: boolean

        Whether running in backtest mode

      Returns Promise<IPublicCandleData[]>

      Promise resolving to array of OHLCV candle data

getOrderBook?: (
    symbol: string,
    depth: number,
    from: Date,
    to: Date,
    backtest: boolean,
) => Promise<IOrderBookData>

Fetch order book for a trading pair.

Optional. If not provided, throws an error when called.

Type declaration

    • (
          symbol: string,
          depth: number,
          from: Date,
          to: Date,
          backtest: boolean,
      ): Promise<IOrderBookData>
    • Parameters

      • symbol: string

        Trading pair symbol (e.g., "BTCUSDT")

      • depth: number

        Maximum depth levels for both bids and asks (default: CC_ORDER_BOOK_MAX_DEPTH_LEVELS)

      • from: Date

        Start of time range (used in backtest for historical data, can be ignored in live)

      • to: Date

        End of time range (used in backtest for historical data, can be ignored in live)

      • backtest: boolean

        Whether running in backtest mode

      Returns Promise<IOrderBookData>

      Promise resolving to order book data

// Backtest implementation: returns historical order book for the time range
const backtestOrderBook = async (symbol: string, depth: number, from: Date, to: Date, backtest: boolean) => {
if (backtest) {
return await database.getOrderBookSnapshot(symbol, depth, from, to);
}
return await exchange.fetchOrderBook(symbol, depth);
};

// Live implementation: ignores from/to when not in backtest mode
const liveOrderBook = async (symbol: string, depth: number, _from: Date, _to: Date, backtest: boolean) => {
return await exchange.fetchOrderBook(symbol, depth);
};
note?: string

Optional developer note for documentation