aboutsummaryrefslogtreecommitdiff
path: root/markets/poloniex.go
diff options
context:
space:
mode:
Diffstat (limited to 'markets/poloniex.go')
-rw-r--r--markets/poloniex.go61
1 files changed, 48 insertions, 13 deletions
diff --git a/markets/poloniex.go b/markets/poloniex.go
index 34ebb7e..9aaeafb 100644
--- a/markets/poloniex.go
+++ b/markets/poloniex.go
@@ -52,40 +52,75 @@ func NewPoloniex() *Poloniex {
52 } 52 }
53} 53}
54 54
55func (p *Poloniex) GetBalance(apiKey, apiSecret string) (map[string]decimal.Decimal, error) { 55func (p *Poloniex) GetBalance(apiKey, apiSecret string) (Summary, error) {
56 client, _ := poloniex.NewClient(apiKey, apiSecret) 56 client, _ := poloniex.NewClient(apiKey, apiSecret)
57 var summary Summary
57 58
58 accounts, err := client.TradeReturnAvailableAccountBalances() 59 accounts, err := client.TradeReturnAvailableAccountBalances()
59 if poloniexInvalidCredentialsError(err) { 60 if poloniexInvalidCredentialsError(err) {
60 return nil, utils.Error{InvalidCredentials, "invalid poloniex credentials"} 61 return Summary{}, utils.Error{InvalidCredentials, "invalid poloniex credentials"}
61 } 62 }
62 63
64 if poloniexRestrictedIPError(err) {
65 return Summary{}, utils.Error{IPRestricted, "IP restricted api key"}
66 }
67
68 if err != nil {
69 return Summary{}, err
70 }
71
72 positions, err := client.TradeGetMarginPosition()
63 if err != nil { 73 if err != nil {
64 return nil, err 74 return Summary{}, err
65 } 75 }
66 76
67 balances := make(map[string]decimal.Decimal) 77 marginAccount, err := client.TradeReturnMarginAccountSummary()
68 for currency, balance := range accounts.Margin { 78 if err != nil {
69 balances[currency] = balances[currency].Add(balance) 79 return Summary{}, err
70 } 80 }
71 81
72 for currency, balance := range accounts.Exchange { 82 summary.Balances = make(map[string]Balance)
73 balances[currency] = balances[currency].Add(balance) 83 for currency, amount := range accounts.Exchange {
84 balance := summary.Balances[currency]
85 balance.Amount = balance.Amount.Add(amount)
86
87 summary.Balances[currency] = balance
74 } 88 }
75 89
76 return balances, nil 90 summary.BTCValue, err = p.ComputeAccountBalanceValue(summary.Balances)
91 if err != nil {
92 return Summary{}, err
93 }
94
95 for currencyPair, position := range positions {
96 if position.Type == "none" {
97 continue
98 }
99 currency := currencyPair[4:]
100 balance := summary.Balances[currency]
101 balance.Amount = balance.Amount.Add(position.Amount)
102 balance.BTCValue = balance.BTCValue.Add(position.Total.Add(position.PlusValue))
103
104 summary.Balances[currency] = balance
105 }
106
107 summary.BTCValue = summary.BTCValue.Add(marginAccount.NetValue)
108
109 return summary, nil
77} 110}
78 111
79func (p *Poloniex) ComputeAccountBalanceValue(account map[string]decimal.Decimal, baseCurrency string) (decimal.Decimal, error) { 112func (p *Poloniex) ComputeAccountBalanceValue(account map[string]Balance) (decimal.Decimal, error) {
80 var total decimal.Decimal 113 var total decimal.Decimal
81 114
82 for currency, amount := range account { 115 for currency, balance := range account {
83 pair, err := p.GetCurrencyPair(baseCurrency, currency) 116 pair, err := p.GetCurrencyPair("BTC", currency)
84 if err != nil { 117 if err != nil {
85 return decimal.Zero, err 118 return decimal.Zero, err
86 } 119 }
87 120
88 total = total.Add(amount.Mul(pair.Rate)) 121 total = total.Add(balance.Amount.Mul(pair.Rate))
122 balance.BTCValue = balance.BTCValue.Add(balance.Amount.Mul(pair.Rate))
123 account[currency] = balance
89 } 124 }
90 125
91 return total, nil 126 return total, nil