diff --git a/package-lock.json b/package-lock.json index 5cec6e1b4..f1f176dcf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "inversify": "6.0.1", "lib-js-util-base": "git+https://github.com/bitfinexcom/lib-js-util-base.git", "lodash": "4.17.21", + "mathjs": "14.8.1", "moment": "2.29.4", "puppeteer": "24.1.0", "uuid": "9.0.0", @@ -2067,6 +2068,19 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "node_modules/complex.js": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.4.2.tgz", + "integrity": "sha512-qtx7HRhPGSCBtGiST4/WGHuW+zeaND/6Ld+db6PbrulIB1i2Ev/2UPiqcmpQNPSyfBKraC0EOvOKCB5dGZKt3g==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", @@ -2410,6 +2424,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -2848,6 +2868,12 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, + "node_modules/escape-latex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==", + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -3759,6 +3785,19 @@ "node": ">= 0.6" } }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -5010,6 +5049,12 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", + "license": "MIT" + }, "node_modules/js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", @@ -5466,6 +5511,29 @@ "node": ">= 0.4" } }, + "node_modules/mathjs": { + "version": "14.8.1", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-14.8.1.tgz", + "integrity": "sha512-7UDitJFsXoPbFdK2V7S6uJp7krx9B5bQSzAvCnh7ecsceSK4w0PBbEt9B3IRg9lHqzjk3YJNT1fZg/BNK+4CQw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.26.10", + "complex.js": "^2.2.5", + "decimal.js": "^10.4.3", + "escape-latex": "^1.2.0", + "fraction.js": "^5.2.1", + "javascript-natural-sort": "^0.7.1", + "seedrandom": "^3.0.5", + "tiny-emitter": "^2.1.0", + "typed-function": "^4.2.1" + }, + "bin": { + "mathjs": "bin/cli.js" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -7114,6 +7182,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "license": "MIT" + }, "node_modules/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", @@ -7916,6 +7990,12 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8120,6 +8200,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.2.1.tgz", + "integrity": "sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA==", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, "node_modules/typed-query-selector": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", diff --git a/package.json b/package.json index fa48288a6..7bb6e35f2 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "inversify": "6.0.1", "lib-js-util-base": "git+https://github.com/bitfinexcom/lib-js-util-base.git", "lodash": "4.17.21", + "mathjs": "14.8.1", "moment": "2.29.4", "puppeteer": "24.1.0", "uuid": "9.0.0", diff --git a/test/test-cases/additional-api-sync-mode-sqlite-test-cases.js b/test/test-cases/additional-api-sync-mode-sqlite-test-cases.js index b4cd8fc6b..5b79c8d9b 100644 --- a/test/test-cases/additional-api-sync-mode-sqlite-test-cases.js +++ b/test/test-cases/additional-api-sync-mode-sqlite-test-cases.js @@ -819,7 +819,14 @@ module.exports = ( 'balanceChangeUsd', 'balanceChangePerc', 'volumeUsd', - 'tradingFeesUsd' + 'tradingFeesUsd', + 'allFeesUsd', + 'depositsWithdrawalsUsd', + 'plUsd', + 'volatilityPerc', + 'sharpeRatio', + 'sortinoRatio', + 'maxDrawdownPerc' ]) }) @@ -866,7 +873,14 @@ module.exports = ( 'balanceChangeUsd', 'balanceChangePerc', 'volumeUsd', - 'tradingFeesUsd' + 'tradingFeesUsd', + 'allFeesUsd', + 'depositsWithdrawalsUsd', + 'plUsd', + 'volatilityPerc', + 'sharpeRatio', + 'sortinoRatio', + 'maxDrawdownPerc' ]) }) diff --git a/workers/loc.api/data-validator/schemas/getSummaryByAssetReq.js b/workers/loc.api/data-validator/schemas/getSummaryByAssetReq.js index fbb0b21d1..70e7e29d7 100644 --- a/workers/loc.api/data-validator/schemas/getSummaryByAssetReq.js +++ b/workers/loc.api/data-validator/schemas/getSummaryByAssetReq.js @@ -12,6 +12,9 @@ module.exports = { }, end: { $ref: 'defs#/definitions/end' + }, + isUnrealizedProfitExcluded: { + $ref: 'fwDefs#/definitions/isUnrealizedProfitExcluded' } } } diff --git a/workers/loc.api/sync/data.consistency.checker/checkers.js b/workers/loc.api/sync/data.consistency.checker/checkers.js index ff5b666e4..9133b3a54 100644 --- a/workers/loc.api/sync/data.consistency.checker/checkers.js +++ b/workers/loc.api/sync/data.consistency.checker/checkers.js @@ -181,9 +181,12 @@ class Checkers { auth, params: { schema: [ + this.SYNC_API_METHODS.TRADES, this.SYNC_API_METHODS.LEDGERS, this.SYNC_API_METHODS.CANDLES, - this.SYNC_API_METHODS.MOVEMENTS + this.SYNC_API_METHODS.MOVEMENTS, + this.SYNC_API_METHODS.POSITIONS_SNAPSHOT, + this.SYNC_API_METHODS.POSITIONS_HISTORY ] } }) diff --git a/workers/loc.api/sync/summary.by.asset/index.js b/workers/loc.api/sync/summary.by.asset/index.js index 93106646b..36a8dd316 100644 --- a/workers/loc.api/sync/summary.by.asset/index.js +++ b/workers/loc.api/sync/summary.by.asset/index.js @@ -2,6 +2,10 @@ const { omit } = require('lib-js-util-base') const moment = require('moment') +const math = require('mathjs') + +const { getBackIterable } = require('../helpers') +const { pushLargeArr } = require('../../helpers/utils') const { decorateInjectable } = require('../../di/utils') @@ -12,9 +16,20 @@ const depsTypes = (TYPES) => [ TYPES.SYNC_API_METHODS, TYPES.ALLOWED_COLLS, TYPES.Wallets, - TYPES.Trades + TYPES.Trades, + TYPES.Movements, + TYPES.WinLossVSAccountBalance ] class SummaryByAsset { + #ledgerMarginFundingPaymentCat = 28 + #ledgerTradingFeeCat = 201 + + #ledgerFeeCats = [this.#ledgerTradingFeeCat, 204, 207, 222, 224, + 228, 241, 243, 251, 254, 255, 258, 905] + + #allUsedLedgerCats = [this.#ledgerMarginFundingPaymentCat, + ...this.#ledgerFeeCats] + constructor ( dao, syncSchema, @@ -22,7 +37,9 @@ class SummaryByAsset { SYNC_API_METHODS, ALLOWED_COLLS, wallets, - trades + trades, + movements, + winLossVSAccountBalance ) { this.dao = dao this.syncSchema = syncSchema @@ -31,6 +48,8 @@ class SummaryByAsset { this.ALLOWED_COLLS = ALLOWED_COLLS this.wallets = wallets this.trades = trades + this.movements = movements + this.winLossVSAccountBalance = winLossVSAccountBalance this.ledgersMethodColl = this.syncSchema.getMethodCollMap() .get(this.SYNC_API_METHODS.LEDGERS) @@ -70,31 +89,69 @@ class SummaryByAsset { auth, params: { end } }) + const withdrawalsPromise = this.movements.getMovements({ + auth, + start, + end, + isWithdrawals: true, + isExcludePrivate: false + }) + const depositsPromise = this.movements.getMovements({ + auth, + start, + end, + isDeposits: true, + isExcludePrivate: false + }) + const dailyBalancesAndPLPromise = this.winLossVSAccountBalance + .getWinLossVSAccountBalance({ + auth, + params: { + start, + end, + timeframe: 'day', + isUnrealizedProfitExcluded: args?.params + ?.isUnrealizedProfitExcluded, + shouldTimeframePLBeReturned: true + } + }) const [ trades, ledgers, startWallets, - endWallets + endWallets, + withdrawals, + deposits, + dailyBalancesAndPL ] = await Promise.all([ tradesPromise, ledgersPromise, startWalletsPromise, - endWalletsPromise + endWalletsPromise, + withdrawalsPromise, + depositsPromise, + dailyBalancesAndPLPromise ]) - const _summaryByAsset = await this.#calcSummaryByAsset({ + const _summaryByAsset = this.#calcSummaryByAsset({ trades, ledgers, startWallets, endWallets }) - const total = this.#calcTotal(_summaryByAsset) + const total = this.#calcTotal( + _summaryByAsset, + withdrawals, + deposits, + dailyBalancesAndPL + ) const summaryByAsset = _summaryByAsset.map((item) => ( omit(item, [ 'balanceChangeUsd', 'tradingFeesUsd', - 'calcedStartWalletBalanceUsd' + 'calcedStartWalletBalanceUsd', + 'allFeesUsd' ]) )) @@ -104,7 +161,7 @@ class SummaryByAsset { } } - async #calcSummaryByAsset ({ + #calcSummaryByAsset ({ trades, ledgers, startWallets, @@ -161,18 +218,23 @@ class SummaryByAsset { ? 1 : calcedActualRate - const ledgersForCurrency = ledgers.filter((ledger) => ( - ledger[this.ledgersSymbolFieldName] === currency - )) + const ledgerMap = this.#makeLedgerMapFilteredByCcyGroupedByCategory( + ledgers, + currency, + this.#allUsedLedgerCats + ) const tradesForCurrency = trades.filter((trade) => ( trade?.baseCurrency === currency )) - const marginFundingPaymentLedgers = ledgersForCurrency.filter((ledger) => ( - ledger._category === 28 - )) - const tradingFeeLedgers = ledgersForCurrency.filter((ledger) => ( - ledger._category === 201 - )) + const marginFundingPaymentLedgers = ledgerMap + .get(this.#ledgerMarginFundingPaymentCat) ?? [] + const tradingFeeLedgers = ledgerMap + .get(this.#ledgerTradingFeeCat) ?? [] + const allFeeLedgers = this.#ledgerFeeCats.reduce((accum, cat) => { + pushLargeArr(accum, ledgerMap.get(cat) ?? []) + + return accum + }, []) const volume = this.#calcFieldByName( tradesForCurrency, @@ -195,6 +257,10 @@ class SummaryByAsset { tradingFeeLedgers, 'amountUsd' ) + const calcedAllFeeUsdLedgers = this.#calcFieldByName( + allFeeLedgers, + 'amountUsd' + ) const balanceChange = calcedEndWalletBalance - calcedStartWalletBalance const balanceChangePerc = calcedStartWalletBalance === 0 @@ -205,6 +271,7 @@ class SummaryByAsset { // In the Ledgers amount of fee is negative value, skip sign for UI const tradingFees = Math.abs(calcedTradingFeeLedgers) const tradingFeesUsd = Math.abs(calcedTradingFeeUsdLedgers) + const allFeesUsd = Math.abs(calcedAllFeeUsdLedgers) if ( calcedEndWalletBalanceUsd < 0.01 && @@ -227,6 +294,7 @@ class SummaryByAsset { volumeUsd, tradingFees, tradingFeesUsd, + allFeesUsd, marginFundingPayment, // It's used to total perc calc @@ -276,15 +344,48 @@ class SummaryByAsset { ) } - #calcTotal (summaryByAsset) { + #calcTotal ( + summaryByAsset, + withdrawals, + deposits, + dailyBalancesAndPL + ) { + const calcedWithdrawalsUsd = this.#calcFieldByName( + withdrawals, + 'amountUsd' + ) + const calcedDepositsUsd = this.#calcFieldByName( + deposits, + 'amountUsd' + ) + const plUsd = this.#calcPLUsd(dailyBalancesAndPL) + const returns = this.#getDailyReturns(dailyBalancesAndPL) + const { + volatilityPerc, + sharpeRatio, + sortinoRatio + } = this.#calcDailyReturnStatistics(returns) + const maxDrawdownPerc = this.#calcMaxDrawdownPerc(dailyBalancesAndPL) + const initTotal = { balanceUsd: 0, balanceChangeUsd: 0, balanceChangePerc: 0, volumeUsd: 0, tradingFeesUsd: 0, - - calcedStartWalletBalanceUsd: 0 + allFeesUsd: 0, + + calcedStartWalletBalanceUsd: 0, + + depositsWithdrawalsUsd: ( + calcedWithdrawalsUsd + + calcedDepositsUsd + ), + plUsd, + volatilityPerc, + sharpeRatio, + sortinoRatio, + maxDrawdownPerc } const res = summaryByAsset.reduce((accum, curr) => { @@ -296,6 +397,7 @@ class SummaryByAsset { 'balanceChangeUsd', 'volumeUsd', 'tradingFeesUsd', + 'allFeesUsd', 'calcedStartWalletBalanceUsd' ] @@ -318,6 +420,117 @@ class SummaryByAsset { : accum[propName] } } + + #makeLedgerMapFilteredByCcyGroupedByCategory ( + ledgers, ccy, categories + ) { + const ledgerMap = new Map() + + if ( + !Array.isArray(categories) || + categories.length === 0 + ) { + return ledgerMap + } + + for (const category of categories) { + ledgerMap.set(category, []) + } + + for (const ledger of ledgers) { + if ( + ledger?.[this.ledgersSymbolFieldName] !== ccy || + !ledgerMap.has(ledger?._category) + ) { + continue + } + + ledgerMap.get(ledger?._category).push(ledger) + } + + return ledgerMap + } + + #calcPLUsd (dailyBalancesAndPL) { + if ( + !Array.isArray(dailyBalancesAndPL) || + dailyBalancesAndPL.length === 0 + ) { + return 0 + } + + const lastBalance = dailyBalancesAndPL?.[0] + ?.balanceWithoutMovementsUsd ?? 0 + const firstBalance = dailyBalancesAndPL?.[dailyBalancesAndPL.length - 1] + ?.balanceWithoutMovementsUsd ?? 0 + + return lastBalance - firstBalance + } + + #getDailyReturns (dailyBalancesAndPL) { + if (!Array.isArray(dailyBalancesAndPL)) { + return [] + } + + return dailyBalancesAndPL.map((item) => item?.returns) + } + + #calcDailyReturnStatistics (dailyReturns) { + const returnStd = math.std(dailyReturns) + const avgReturn = math.mean(dailyReturns) + const sqrt365 = Math.sqrt(365) + + const volatilityPerc = returnStd * sqrt365 * 100 + const sharpeRatio = returnStd !== 0 + ? (avgReturn / returnStd) * sqrt365 + : 0 + + const negativeReturns = dailyReturns.filter((r) => r < 0) + const downsideStd = negativeReturns.length > 0 + ? math.std(negativeReturns) + : 0.00001 + const sortinoRatio = downsideStd !== 0 + ? (avgReturn / downsideStd) * sqrt365 + : 0 + + return { + volatilityPerc, + sharpeRatio, + sortinoRatio + } + } + + #calcMaxDrawdownPerc (dailyBalancesAndPL) { + if ( + !Array.isArray(dailyBalancesAndPL) || + dailyBalancesAndPL.length === 0 + ) { + return 0 + } + + const iterator = getBackIterable(dailyBalancesAndPL) + let peak = dailyBalancesAndPL?.[dailyBalancesAndPL.length - 1] + ?.balanceWithoutMovementsUsd ?? 0 + let maxDrawdown = 0 + + for (const item of iterator) { + const balance = item?.balanceWithoutMovementsUsd ?? 0 + + if (balance > peak) { + peak = balance + } + + const drawdown = peak !== 0 + ? (peak - balance) / peak + : 0 + + if (drawdown > maxDrawdown) { + maxDrawdown = drawdown + } + } + + return maxDrawdown * 100 + } } decorateInjectable(SummaryByAsset, depsTypes) diff --git a/workers/loc.api/sync/win.loss.vs.account.balance/index.js b/workers/loc.api/sync/win.loss.vs.account.balance/index.js index 7b4269854..3cec3e0d8 100644 --- a/workers/loc.api/sync/win.loss.vs.account.balance/index.js +++ b/workers/loc.api/sync/win.loss.vs.account.balance/index.js @@ -32,6 +32,7 @@ class WinLossVSAccountBalance { timeframe = 'day', start = 0, end = Date.now(), + shouldTimeframePLBeReturned, isUnrealizedProfitExcluded, isVSPrevDayBalance } = params ?? {} @@ -57,9 +58,13 @@ class WinLossVSAccountBalance { plGroupedByTimeframe } = await this.winLoss.getDataToCalcWinLoss(args) - const getWinLossPercByTimeframe = isVSPrevDayBalance + const getWinLossPercByTimeframe = ( + isVSPrevDayBalance || + shouldTimeframePLBeReturned + ) ? this._getWinLossPrevDayBalanceByTimeframe( { + shouldTimeframePLBeReturned, isUnrealizedProfitExcluded, firstWalletsVals } @@ -97,10 +102,14 @@ class WinLossVSAccountBalance { return res }) - pickedRes.push({ - mts: start, - perc: 0 - }) + + if (!shouldTimeframePLBeReturned) { + pickedRes.push({ + mts: start, + perc: 0 + }) + } + const res = this.winLoss.shiftMtsToNextTimeframe( pickedRes, { timeframe, end } @@ -193,6 +202,7 @@ class WinLossVSAccountBalance { } _getWinLossPrevDayBalanceByTimeframe ({ + shouldTimeframePLBeReturned, isUnrealizedProfitExcluded, firstWalletsVals }) { @@ -200,6 +210,7 @@ class WinLossVSAccountBalance { let prevWallets = 0 let prevPL = 0 let prevMultiplying = 1 + let totalMovements = 0 return ({ walletsGroupedByTimeframe = {}, @@ -228,6 +239,7 @@ class WinLossVSAccountBalance { const movements = Number.isFinite(movementsRes[symb]) ? movementsRes[symb] : 0 + totalMovements += movements const wallets = Number.isFinite(walletsGroupedByTimeframe[symb]) ? walletsGroupedByTimeframe[symb] : 0 @@ -242,19 +254,42 @@ class WinLossVSAccountBalance { const winLoss = realized + unrealized - prevWallets = wallets + const balanceWithoutMovements = wallets - totalMovements + const fullBalanceWithoutMovements = isUnrealizedProfitExcluded + ? balanceWithoutMovements + : balanceWithoutMovements + pl + prevPL = pl if ( !Number.isFinite(winLoss) || prevWallets === 0 ) { + if (shouldTimeframePLBeReturned) { + return { + balanceWithoutMovementsUsd: fullBalanceWithoutMovements, + returns: 0, + perc: prevPerc + } + } + return { perc: prevPerc } } prevMultiplying = ((prevWallets + winLoss) / prevWallets) * prevMultiplying const perc = (prevMultiplying - 1) * 100 + const returns = winLoss / prevWallets + prevPerc = perc + prevWallets = wallets + + if (shouldTimeframePLBeReturned) { + return { + balanceWithoutMovementsUsd: fullBalanceWithoutMovements, + returns, + perc + } + } return { perc } } diff --git a/workers/loc.api/sync/win.loss/index.js b/workers/loc.api/sync/win.loss/index.js index 61f780e90..d6b0bd7f3 100644 --- a/workers/loc.api/sync/win.loss/index.js +++ b/workers/loc.api/sync/win.loss/index.js @@ -12,7 +12,6 @@ const { const { decorateInjectable } = require('../../di/utils') const depsTypes = (TYPES) => [ - TYPES.DAO, TYPES.SyncSchema, TYPES.BalanceHistory, TYPES.PositionsSnapshot, @@ -24,7 +23,6 @@ const depsTypes = (TYPES) => [ ] class WinLoss { constructor ( - dao, syncSchema, balanceHistory, positionsSnapshot, @@ -34,7 +32,6 @@ class WinLoss { movements, wallets ) { - this.dao = dao this.syncSchema = syncSchema this.balanceHistory = balanceHistory this.positionsSnapshot = positionsSnapshot