diff options
Diffstat (limited to 'markets/poloniex.go')
-rw-r--r-- | markets/poloniex.go | 61 |
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 | ||
55 | func (p *Poloniex) GetBalance(apiKey, apiSecret string) (map[string]decimal.Decimal, error) { | 55 | func (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 | ||
79 | func (p *Poloniex) ComputeAccountBalanceValue(account map[string]decimal.Decimal, baseCurrency string) (decimal.Decimal, error) { | 112 | func (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 |