getExchangeRatesByCurrency already carries missing exchange rates forward
when assembling its result, but getExchangeRates logs a "No exchange rate
has been found" error for every uncovered date before that happens. The
base-currency market data is gathered only from the first activity date
onwards and skips non-trading days, so any weekend, holiday, or date just
outside the gathered range produces a spurious error even though the value
is ultimately carried anyway.
Fill the base-currency price maps with the nearest known price (carry
forward, then back-fill a leading gap) before computing the cross rate, so
those dates resolve quietly. A pair with no data at all still has nothing
to carry and is reported as before.
Signed-off-by: martin <martin@0x01.local>
* feat(client): resolve errors
* feat(client): replace constructor based DI with inject function
* feat(client): enforce encapsulation and immutability
* feat(client): remove unused tap operator
* feat(client): implement generic type parameter
* feat(client): replace constructor based DI with inject functions
* feat(client): implement default date range
* feat(client): resolve errors
* feat(client): replace constructor based DI with inject function
* feat(client): enforce encapsulation
* fix(client): remove dead code
* feat(client): enforce immutability
* feat(client): replace deprecated getDeviceInfo
* feat(client): convert errors to signal
* feat(client): convert hasImpersonationId to signal
* feat(client): convert user to signal
* feat(client): convert to computed signals
* feat(client): convert historicalDataItems and isLoadingPerformance to signals
* feat(client): convert performance and precision to signals
* feat(client): implement OnPush change detection strategy
* fix(common): revert DateRange type change
* fix(client): format file
* fix(client): resolve errors
* feat(client): replace constructor based DI with inject function
* feat(client): enforce encapsulation
* fix(client): remove dead code
* feat(client): replace deprecated getDeviceInfo
* feat(client): convert isLoading to signal
* feat(client): convert hasImpersonationId to signal
* feat(client): convert summary to signal
* feat(client): convert user and hasPermissionToUpdateUserSettings to signals
* feat(client): implement OnPush change detection strategy
* fix(client): remove nested subscription
* feat(client): resolve error
* feat(client): enforce encapsulation
* feat(client): enforce immutability
* feat(client): replace constructor based DI with inject function
* feat(client): replace deprecated getDeviceInfo
* feat(client): convert benchmarks to signal
* feat(client): convert historicalDataItems to signal
* feat(client): convert fearAndGreedIndex to signal
* feat(client): resolve errors
* feat(client): migrate constructor based DI to inject function
* feat(client): implement view child signal
* feat(client): replace deprecated getDeviceInfo
* fix(client): enforce encapsulation and immutability