Browse Source

Improve handling of derived currencies

pull/2891/head
Thomas Kaul 2 years ago
parent
commit
b383503b95
  1. 26
      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. 85
      apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts

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

@ -263,6 +263,19 @@ export class DataProviderService {
} = {};
const startTimeTotal = performance.now();
if (
items.some(({ symbol }) => {
return symbol === `${DEFAULT_CURRENCY}USX`;
})
) {
response[`${DEFAULT_CURRENCY}USX`] = {
currency: 'USX',
dataSource: this.getDataSourceForExchangeRates(),
marketPrice: 100,
marketState: 'open'
};
}
// Get items from cache
const itemsToFetch: UniqueAsset[] = [];
@ -333,18 +346,11 @@ export class DataProviderService {
promises.push(
promise.then(async (result) => {
for (let [symbol, dataProviderResponse] of Object.entries(result)) {
if (symbol === `${DEFAULT_CURRENCY}USX`) {
dataProviderResponse = {
...dataProviderResponse,
marketPrice: new Big(1).mul(100).toNumber(),
marketState: 'open'
};
}
if (
[
`${DEFAULT_CURRENCY}GBp`,
`${DEFAULT_CURRENCY}ILA`,
`${DEFAULT_CURRENCY}USX`,
`${DEFAULT_CURRENCY}ZAc`
].includes(symbol)
) {
@ -423,10 +429,10 @@ export class DataProviderService {
this.configurationService.get('CACHE_QUOTES_TTL')
);
}
console.log({ response });
}
console.log({ response });
Logger.debug(
`Fetched ${symbolsChunk.length} quote${
symbolsChunk.length > 1 ? 's' : ''

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

@ -20,7 +20,6 @@ import {
DataSource,
SymbolProfile
} from '@prisma/client';
import Big from 'big.js';
import { format, isToday } from 'date-fns';
import got from 'got';
@ -93,10 +92,7 @@ export class EodHistoricalDataService implements DataProviderInterface {
return response.reduce(
(result, historicalItem, index, array) => {
result[this.convertFromEodSymbol(symbol)][historicalItem.date] = {
marketPrice: this.getConvertedValue({
symbol: symbol,
value: historicalItem.close
})
marketPrice: historicalItem.close
};
return result;

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

@ -1,5 +1,3 @@
// TODO
import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface';
import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service';
import { YahooFinanceDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service';
@ -18,7 +16,6 @@ import { DEFAULT_CURRENCY } from '@ghostfolio/common/config';
import { DATE_FORMAT } from '@ghostfolio/common/helper';
import { Injectable, Logger } from '@nestjs/common';
import { DataSource, SymbolProfile } from '@prisma/client';
import Big from 'big.js';
import { addDays, format, isSameDay } from 'date-fns';
import yahooFinance from 'yahoo-finance2';
import { Quote } from 'yahoo-finance2/dist/esm/src/modules/quote';
@ -79,10 +76,7 @@ export class YahooFinanceService implements DataProviderInterface {
for (const historicalItem of historicalResult) {
response[format(historicalItem.date, DATE_FORMAT)] = {
marketPrice: this.getConvertedValue({
symbol,
value: historicalItem.dividends
})
marketPrice: historicalItem.dividends
};
}
@ -131,10 +125,7 @@ export class YahooFinanceService implements DataProviderInterface {
for (const historicalItem of historicalResult) {
response[symbol][format(historicalItem.date, DATE_FORMAT)] = {
marketPrice: this.getConvertedValue({
symbol: symbol,
value: historicalItem.close
})
marketPrice: historicalItem.close
};
}
@ -206,57 +197,6 @@ export class YahooFinanceService implements DataProviderInterface {
: 'closed',
marketPrice: quote.regularMarketPrice || 0
};
if (
symbol === `${DEFAULT_CURRENCY}GBP` &&
yahooFinanceSymbols.includes(`${DEFAULT_CURRENCY}GBp=X`)
) {
// Convert GPB to GBp (pence)
response[`${DEFAULT_CURRENCY}GBp`] = {
...response[symbol],
currency: 'GBp',
marketPrice: this.getConvertedValue({
symbol: `${DEFAULT_CURRENCY}GBp`,
value: response[symbol].marketPrice
})
};
} else if (
symbol === `${DEFAULT_CURRENCY}ILS` &&
yahooFinanceSymbols.includes(`${DEFAULT_CURRENCY}ILA=X`)
) {
// Convert ILS to ILA
response[`${DEFAULT_CURRENCY}ILA`] = {
...response[symbol],
currency: 'ILA',
marketPrice: this.getConvertedValue({
symbol: `${DEFAULT_CURRENCY}ILA`,
value: response[symbol].marketPrice
})
};
} else if (
symbol === `${DEFAULT_CURRENCY}ZAR` &&
yahooFinanceSymbols.includes(`${DEFAULT_CURRENCY}ZAc=X`)
) {
// Convert ZAR to ZAc (cents)
response[`${DEFAULT_CURRENCY}ZAc`] = {
...response[symbol],
currency: 'ZAc',
marketPrice: this.getConvertedValue({
symbol: `${DEFAULT_CURRENCY}ZAc`,
value: response[symbol].marketPrice
})
};
}
}
if (yahooFinanceSymbols.includes(`${DEFAULT_CURRENCY}USX=X`)) {
// Convert USD to USX (cent)
response[`${DEFAULT_CURRENCY}USX`] = {
currency: 'USX',
dataSource: this.getName(),
marketPrice: new Big(1).mul(100).toNumber(),
marketState: 'open'
};
}
return response;
@ -359,27 +299,6 @@ export class YahooFinanceService implements DataProviderInterface {
return { items };
}
private getConvertedValue({
symbol,
value
}: {
symbol: string;
value: number;
}) {
if (symbol === `${DEFAULT_CURRENCY}GBp`) {
// Convert GPB to GBp (pence)
return new Big(value).mul(100).toNumber();
} else if (symbol === `${DEFAULT_CURRENCY}ILA`) {
// Convert ILS to ILA
return new Big(value).mul(100).toNumber();
} else if (symbol === `${DEFAULT_CURRENCY}ZAc`) {
// Convert ZAR to ZAc (cents)
return new Big(value).mul(100).toNumber();
}
return value;
}
private async getQuotesWithQuoteSummary(aYahooFinanceSymbols: string[]) {
const quoteSummaryPromises = aYahooFinanceSymbols.map((symbol) => {
return yahooFinance.quoteSummary(symbol).catch(() => {

Loading…
Cancel
Save