Bugfix/average price calculation for buy and sell activities of short positions (#5416)
* Fix average price calculation for buy and sell activities of short positions * Update changelogpull/5463/head
parent
d7bcfe871f
commit
e5baa1acd5
@ -0,0 +1,132 @@
|
||||
import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto';
|
||||
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
|
||||
import {
|
||||
activityDummyData,
|
||||
loadActivityExportFile,
|
||||
symbolProfileDummyData,
|
||||
userDummyData
|
||||
} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils';
|
||||
import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory';
|
||||
import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service';
|
||||
import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock';
|
||||
import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
|
||||
import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock';
|
||||
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
|
||||
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
|
||||
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
|
||||
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
|
||||
import { parseDate } from '@ghostfolio/common/helper';
|
||||
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
|
||||
|
||||
import { Tag } from '@prisma/client';
|
||||
import { Big } from 'big.js';
|
||||
import { join } from 'path';
|
||||
|
||||
jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {
|
||||
return {
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
CurrentRateService: jest.fn().mockImplementation(() => {
|
||||
return CurrentRateServiceMock;
|
||||
})
|
||||
};
|
||||
});
|
||||
|
||||
jest.mock(
|
||||
'@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service',
|
||||
() => {
|
||||
return {
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
PortfolioSnapshotService: jest.fn().mockImplementation(() => {
|
||||
return PortfolioSnapshotServiceMock;
|
||||
})
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => {
|
||||
return {
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
RedisCacheService: jest.fn().mockImplementation(() => {
|
||||
return RedisCacheServiceMock;
|
||||
})
|
||||
};
|
||||
});
|
||||
|
||||
describe('PortfolioCalculator', () => {
|
||||
let activityDtos: CreateOrderDto[];
|
||||
|
||||
let configurationService: ConfigurationService;
|
||||
let currentRateService: CurrentRateService;
|
||||
let exchangeRateDataService: ExchangeRateDataService;
|
||||
let portfolioCalculatorFactory: PortfolioCalculatorFactory;
|
||||
let portfolioSnapshotService: PortfolioSnapshotService;
|
||||
let redisCacheService: RedisCacheService;
|
||||
|
||||
beforeAll(() => {
|
||||
activityDtos = loadActivityExportFile(
|
||||
join(__dirname, '../../../../../../../test/import/ok/btcusd-short.json')
|
||||
);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
configurationService = new ConfigurationService();
|
||||
|
||||
currentRateService = new CurrentRateService(null, null, null, null);
|
||||
|
||||
exchangeRateDataService = new ExchangeRateDataService(
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
|
||||
portfolioSnapshotService = new PortfolioSnapshotService(null);
|
||||
|
||||
redisCacheService = new RedisCacheService(null, null);
|
||||
|
||||
portfolioCalculatorFactory = new PortfolioCalculatorFactory(
|
||||
configurationService,
|
||||
currentRateService,
|
||||
exchangeRateDataService,
|
||||
portfolioSnapshotService,
|
||||
redisCacheService
|
||||
);
|
||||
});
|
||||
|
||||
describe('get current positions', () => {
|
||||
it.only('with BTCUSD short sell (in USD)', async () => {
|
||||
jest.useFakeTimers().setSystemTime(parseDate('2022-01-14').getTime());
|
||||
|
||||
const activities: Activity[] = activityDtos.map((activity) => ({
|
||||
...activityDummyData,
|
||||
...activity,
|
||||
date: parseDate(activity.date),
|
||||
feeInAssetProfileCurrency: activity.fee,
|
||||
SymbolProfile: {
|
||||
...symbolProfileDummyData,
|
||||
currency: 'USD',
|
||||
dataSource: activity.dataSource,
|
||||
name: 'Bitcoin',
|
||||
symbol: activity.symbol
|
||||
},
|
||||
tags: activity.tags?.map((id) => {
|
||||
return { id } as Tag;
|
||||
}),
|
||||
unitPriceInAssetProfileCurrency: activity.unitPrice
|
||||
}));
|
||||
|
||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||
activities,
|
||||
calculationType: PerformanceCalculationType.ROAI,
|
||||
currency: 'USD',
|
||||
userId: userDummyData.id
|
||||
});
|
||||
|
||||
const portfolioSnapshot = await portfolioCalculator.computeSnapshot();
|
||||
|
||||
expect(portfolioSnapshot.positions[0].averagePrice).toEqual(
|
||||
Big(45647.95)
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,42 @@
|
||||
{
|
||||
"meta": {
|
||||
"date": "2021-12-12T00:00:00.000Z",
|
||||
"version": "dev"
|
||||
},
|
||||
"accounts": [],
|
||||
"platforms": [],
|
||||
"tags": [],
|
||||
"activities": [
|
||||
{
|
||||
"accountId": null,
|
||||
"comment": null,
|
||||
"fee": 4.46,
|
||||
"quantity": 1,
|
||||
"type": "SELL",
|
||||
"unitPrice": 44558.42,
|
||||
"currency": "USD",
|
||||
"dataSource": "YAHOO",
|
||||
"date": "2021-12-12T00:00:00.000Z",
|
||||
"symbol": "BTCUSD",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"accountId": null,
|
||||
"comment": null,
|
||||
"fee": 4.46,
|
||||
"quantity": 1,
|
||||
"type": "SELL",
|
||||
"unitPrice": 46737.48,
|
||||
"currency": "USD",
|
||||
"dataSource": "YAHOO",
|
||||
"date": "2021-12-13T00:00:00.000Z",
|
||||
"symbol": "BTCUSD",
|
||||
"tags": []
|
||||
}
|
||||
],
|
||||
"user": {
|
||||
"settings": {
|
||||
"currency": "USD"
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue