import { Candlestick, CandlestickInterval } from "binance-api-client"; import { TimeUtils } from "./TimeUtils"; import * as delay from "delay"; import * as Winston from "winston"; import { Configuration } from "../models/Configuration"; import { ResourcesManager } from "../singletons/ResourcesManager"; export class CandleUtils { public static async getDataSourceFromConfiguration( configuration: Configuration ): Promise< Candlestick[] > { let formattedStartTime: string = TimeUtils.formatStandard( configuration.startTime ); let formattedEndTime: string = TimeUtils.formatStandard( configuration.endTime ); Winston.info( `Fetching candles history from ${ formattedStartTime } to ${ formattedEndTime }` ); let candlesHistory: Candlestick[] = []; let endTime: number = configuration.endTime.getTime(); let startTime: number = configuration.startTime.getTime(); let requestIndex: number = 0; do { if( requestIndex >= ( await ResourcesManager.getRequestsLimit() ).value ) { await delay( TimeUtils.requestsLimitToMilliseconds( ( await ResourcesManager.getRequestsLimit() ).interval ) ); } candlesHistory = candlesHistory.concat( await ResourcesManager.apiClient.getCandlesticks( configuration.symbol, CandlestickInterval[ configuration.responsiveness ], null, startTime ) ); requestIndex++; startTime = candlesHistory[ candlesHistory.length - 1 ].closureTime.getTime() + 1; } while( startTime <= endTime ); Winston.info( `Fetched ${ candlesHistory.length } candles in ${ requestIndex } request/s` ); let oldestCandleOpeningTime: Date = candlesHistory[ 0 ].openingTime; if( oldestCandleOpeningTime.getTime() > configuration.startTime.getTime() ) { Winston.warn( `Data goes as back as ${ TimeUtils.formatStandard( oldestCandleOpeningTime ) }` ); } return candlesHistory; } }