X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=markets%2Fpoloniex.go;h=58645b2b2a23750c4adae2633e7c7297bfb71d19;hb=24e4797900b3d2edf642fdb547bc22357a5b39ad;hp=34ebb7eaf5e296bd9d550118d18428b18ccd4155;hpb=908ee2dd22c85d5d850f62b1a9d0066b43b80a69;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FCryptoportfolio%2FFront.git diff --git a/markets/poloniex.go b/markets/poloniex.go index 34ebb7e..58645b2 100644 --- a/markets/poloniex.go +++ b/markets/poloniex.go @@ -52,40 +52,91 @@ func NewPoloniex() *Poloniex { } } -func (p *Poloniex) GetBalance(apiKey, apiSecret string) (map[string]decimal.Decimal, error) { +func (p *Poloniex) TestCredentials(apiKey, apiSecret string) error { client, _ := poloniex.NewClient(apiKey, apiSecret) + _, err := client.TradeReturnDepositAdresses() + + if poloniexInvalidCredentialsError(err) { + return utils.Error{InvalidCredentials, "invalid poloniex credentials"} + } + + if poloniexRestrictedIPError(err) { + return utils.Error{IPRestricted, "IP restricted api key"} + } + + return nil +} + +func (p *Poloniex) GetBalance(apiKey, apiSecret string) (Summary, error) { + client, _ := poloniex.NewClient(apiKey, apiSecret) + var summary Summary + accounts, err := client.TradeReturnAvailableAccountBalances() if poloniexInvalidCredentialsError(err) { - return nil, utils.Error{InvalidCredentials, "invalid poloniex credentials"} + return Summary{}, utils.Error{InvalidCredentials, "invalid poloniex credentials"} + } + + if poloniexRestrictedIPError(err) { + return Summary{}, utils.Error{IPRestricted, "IP restricted api key"} } if err != nil { - return nil, err + return Summary{}, err } - balances := make(map[string]decimal.Decimal) - for currency, balance := range accounts.Margin { - balances[currency] = balances[currency].Add(balance) + positions, err := client.TradeGetMarginPosition() + if err != nil { + return Summary{}, err } - for currency, balance := range accounts.Exchange { - balances[currency] = balances[currency].Add(balance) + marginAccount, err := client.TradeReturnMarginAccountSummary() + if err != nil { + return Summary{}, err } - return balances, nil + summary.Balances = make(map[string]Balance) + for currency, amount := range accounts.Exchange { + balance := summary.Balances[currency] + balance.Amount = balance.Amount.Add(amount) + + summary.Balances[currency] = balance + } + + summary.BTCValue, err = p.ComputeAccountBalanceValue(summary.Balances) + if err != nil { + return Summary{}, err + } + + for currencyPair, position := range positions { + if position.Type == "none" { + continue + } + currency := currencyPair[4:] + balance := summary.Balances[currency] + balance.Amount = balance.Amount.Add(position.Amount) + balance.BTCValue = balance.BTCValue.Add(position.Total.Add(position.PlusValue)) + + summary.Balances[currency] = balance + } + + summary.BTCValue = summary.BTCValue.Add(marginAccount.NetValue) + + return summary, nil } -func (p *Poloniex) ComputeAccountBalanceValue(account map[string]decimal.Decimal, baseCurrency string) (decimal.Decimal, error) { +func (p *Poloniex) ComputeAccountBalanceValue(account map[string]Balance) (decimal.Decimal, error) { var total decimal.Decimal - for currency, amount := range account { - pair, err := p.GetCurrencyPair(baseCurrency, currency) + for currency, balance := range account { + pair, err := p.GetCurrencyPair("BTC", currency) if err != nil { return decimal.Zero, err } - total = total.Add(amount.Mul(pair.Rate)) + total = total.Add(balance.Amount.Mul(pair.Rate)) + balance.BTCValue = balance.BTCValue.Add(balance.Amount.Mul(pair.Rate)) + account[currency] = balance } return total, nil