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) + } +}