From 9e745d20a319493ffead28239e6872dd2d631ded Mon Sep 17 00:00:00 2001 From: Yordan Miladinov Date: Thu, 9 Sep 2021 02:35:10 +0300 Subject: [PATCH] Account: Add account.Balance.Available() method (#777) * add account.Balance.Available() method that returns the amount of an asset not locked/held * account: comment Balance.Available() * account: test Balance.Available() --- exchanges/account/account.go | 6 ++++++ exchanges/account/account_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/exchanges/account/account.go b/exchanges/account/account.go index fd9f1582..bd3b8a9c 100644 --- a/exchanges/account/account.go +++ b/exchanges/account/account.go @@ -93,3 +93,9 @@ func (s *Service) Update(a *Holdings) error { return s.mux.Publish([]uuid.UUID{acc.ID}, acc.h) } + +// Available returns the amount you can use immediately. E.g. if you have $100, but $20 +// are held (locked) because of a limit buy order, your available balance is $80. +func (b Balance) Available() float64 { + return b.TotalValue - b.Hold +} diff --git a/exchanges/account/account_test.go b/exchanges/account/account_test.go index e75ffc18..16c9ceff 100644 --- a/exchanges/account/account_test.go +++ b/exchanges/account/account_test.go @@ -134,3 +134,29 @@ func TestHoldings(t *testing.T) { wg.Wait() } + +func TestBalance_Available(t *testing.T) { + t.Parallel() + + b := Balance{ + CurrencyName: currency.BTC, + TotalValue: 16, + Hold: 0, + } + + if have := b.Available(); have != 16 { + t.Errorf("have %f, want 16", have) + } + + b.Hold = 8 + + if have := b.Available(); have != 8 { + t.Errorf("have %f, want 8", have) + } + + b.Hold = 16 + + if have := b.Available(); have != 0 { + t.Errorf("have %f, want 0", have) + } +}