forked from adshao/binance-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaccount.go
104 lines (95 loc) · 2.61 KB
/
account.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package main
import (
"context"
"strings"
"time"
"github.com/adshao/go-binance"
"github.com/juju/errors"
)
func newContext() (context.Context, context.CancelFunc) {
ctx := context.Background()
return context.WithTimeout(ctx, 10*time.Second)
}
// Account define binance account
type Account struct {
*binance.Client
Name string `json:"name"`
Balances []binance.Balance `json:"balances"`
}
// UpdateBalances update account balances
func (account *Account) UpdateBalances(assets []string) error {
ctx, cancel := newContext()
defer cancel()
res, err := account.NewGetAccountService().Do(ctx)
if err != nil {
return errors.Trace(err)
}
if len(assets) > 0 {
var insertedKeys []string
var balances []binance.Balance
for _, asset := range assets {
for _, balance := range res.Balances {
if asset == balance.Asset && !StrContains(insertedKeys, asset) {
balances = append(balances, balance)
insertedKeys = append(insertedKeys, asset)
}
}
}
account.Balances = balances
} else {
account.Balances = res.Balances
}
return nil
}
// ListOpenOrders list open orders
func (account *Account) ListOpenOrders(symbol string) ([]*binance.Order, error) {
ctx, cancel := newContext()
defer cancel()
service := account.NewListOpenOrdersService()
if symbol != "" {
service = service.Symbol(symbol)
}
orders, err := service.Do(ctx)
if err != nil {
return nil, errors.Trace(err)
}
return orders, nil
}
// ListPrices list latest prices for a symbol or symbols
func (account *Account) ListPrices(symbol string) ([]*binance.SymbolPrice, error) {
ctx, cancel := newContext()
defer cancel()
service := account.NewListPricesService()
if symbol != "" {
service = service.Symbol(symbol)
}
prices, err := service.Do(ctx)
if err != nil {
return nil, errors.Trace(err)
}
return prices, nil
}
// CancelOrder cancel open order
func (account *Account) CancelOrder(symbol string, orderID int64) error {
ctx, cancel := newContext()
defer cancel()
_, err := account.NewCancelOrderService().Symbol(symbol).OrderID(orderID).Do(ctx)
if err != nil {
return errors.Trace(err)
}
return nil
}
// CreateOrder create order
func (account *Account) CreateOrder(symbol, side, quantity, price string) (*binance.CreateOrderResponse, error) {
ctx, cancel := newContext()
defer cancel()
side = strings.ToUpper(side)
sideType := binance.SideType(side)
res, err := account.NewCreateOrderService().Symbol(symbol).Side(sideType).
Quantity(quantity).Price(price).Type(binance.OrderTypeLimit).
TimeInForce(binance.TimeInForceTypeGTC).Do(ctx)
if err != nil {
return nil, errors.Trace(err)
}
return res, nil
}