Browse Source

Introduce maximum number of symbols per request

pull/1111/head
Thomas 3 years ago
parent
commit
505f3874c9
  1. 55
      apps/api/src/services/data-provider/data-provider.service.ts
  2. 6
      apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
  3. 2
      apps/api/src/services/data-provider/interfaces/data-provider.interface.ts
  4. 4
      apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts

55
apps/api/src/services/data-provider/data-provider.service.ts

@ -168,6 +168,7 @@ export class DataProviderService {
const response: { const response: {
[symbol: string]: IDataProviderResponse; [symbol: string]: IDataProviderResponse;
} = {}; } = {};
const startTimeTotal = performance.now();
const itemsGroupedByDataSource = groupBy(items, (item) => item.dataSource); const itemsGroupedByDataSource = groupBy(items, (item) => item.dataSource);
@ -176,25 +177,59 @@ export class DataProviderService {
for (const [dataSource, dataGatheringItems] of Object.entries( for (const [dataSource, dataGatheringItems] of Object.entries(
itemsGroupedByDataSource itemsGroupedByDataSource
)) { )) {
const dataProvider = this.getDataProvider(DataSource[dataSource]);
const symbols = dataGatheringItems.map((dataGatheringItem) => { const symbols = dataGatheringItems.map((dataGatheringItem) => {
return dataGatheringItem.symbol; return dataGatheringItem.symbol;
}); });
const promise = Promise.resolve( const maximumNumberOfSymbolsPerRequest =
this.getDataProvider(DataSource[dataSource]).getQuotes(symbols) dataProvider.getMaxNumberOfSymbolsPerRequest?.() ??
); Number.MAX_SAFE_INTEGER;
for (
let i = 0;
i < symbols.length;
i += maximumNumberOfSymbolsPerRequest
) {
const startTimeDataSource = performance.now();
const symbolsChunk = symbols.slice(
i,
i + maximumNumberOfSymbolsPerRequest
);
promises.push( const promise = Promise.resolve(dataProvider.getQuotes(symbolsChunk));
promise.then((result) => {
for (const [symbol, dataProviderResponse] of Object.entries(result)) { promises.push(
response[symbol] = dataProviderResponse; promise.then((result) => {
} for (const [symbol, dataProviderResponse] of Object.entries(
}) result
); )) {
response[symbol] = dataProviderResponse;
}
Logger.debug(
`Fetched ${symbolsChunk.length} quotes from ${dataSource} in ${(
(performance.now() - startTimeDataSource) /
1000
).toFixed(3)} seconds`
);
})
);
}
} }
await Promise.all(promises); await Promise.all(promises);
Logger.debug('------------------------------------------------');
Logger.debug(
`Fetched ${items.length} quotes in ${(
(performance.now() - startTimeTotal) /
1000
).toFixed(3)} seconds`
);
Logger.debug('================================================');
return response; return response;
} }

6
apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts

@ -81,6 +81,12 @@ export class EodHistoricalDataService implements DataProviderInterface {
} }
} }
public getMaxNumberOfSymbolsPerRequest() {
// It is not recommended using more than 15-20 tickers per request
// https://eodhistoricaldata.com/financial-apis/live-realtime-stocks-api
return 20;
}
public getName(): DataSource { public getName(): DataSource {
return DataSource.EOD_HISTORICAL_DATA; return DataSource.EOD_HISTORICAL_DATA;
} }

2
apps/api/src/services/data-provider/interfaces/data-provider.interface.ts

@ -20,6 +20,8 @@ export interface DataProviderInterface {
[symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; [symbol: string]: { [date: string]: IDataProviderHistoricalResponse };
}>; // TODO: Return only one symbol }>; // TODO: Return only one symbol
getMaxNumberOfSymbolsPerRequest?(): number;
getName(): DataSource; getName(): DataSource;
getQuotes( getQuotes(

4
apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts

@ -208,6 +208,10 @@ export class YahooFinanceService implements DataProviderInterface {
} }
} }
public getMaxNumberOfSymbolsPerRequest() {
return 50;
}
public getName(): DataSource { public getName(): DataSource {
return DataSource.YAHOO; return DataSource.YAHOO;
} }

Loading…
Cancel
Save