forked from arianitu/go-questrade
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaccounts.go
217 lines (179 loc) · 4.93 KB
/
accounts.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
package questrade
import (
"errors"
"fmt"
"net/url"
"time"
)
type Account struct {
Type string
Number string
Status string
IsPrimary bool
IsBilling bool
ClientAccountType string
}
type Accounts struct {
Accounts []Account
UserId int64
}
type Position struct {
Symbol string
SymbolId uint64
OpenQuantity float64
ClosedQuantity float64
CurrentMarketValue float64
CurrentPrice float64
AverageEntryPrice float64
ClosedPnL float64
OpenPnL float64
TotalCost float64
IsRealTime bool
IsUnderReorg bool
}
type Positions struct {
Positions []Position
}
type Balance struct {
Currency string
Cash float64
MarketValue float64
TotalEquity float64
BuyingPower float64
MaintenanceExcess float64
IsRealTime bool
}
type Balances struct {
PerCurrencyBalances []Balance
CombinedBalances []Balance
SodPerCurrencyBalances []Balance
SodCombinedBalances []Balance
}
type Execution struct {
Symbol string
SymbolId uint64
Quantity int
Side string
Price float64
Id int
OrderId int
OrderChainId int
ExchangeExecId string
Timestamp time.Time
Notes string
Venue string
TotalCost float64
OrderPlacementCommission float64
Commission float64
ExecutionFee float64
SecFee float64
CanadianExecutionFee int
ParentId int
}
type Executions struct {
Executions []Execution
}
type Activities struct {
Activities []Activity
}
type Activity struct {
TradeDate time.Time
TransactionDate time.Time
SettlementDate time.Time
Action string
Symbol string
SymbolId uint64
Description string
Currency string
Quantity float64
Price float64
GrossAmount float64
Commission float64
NetAmount float64
Type string
}
var (
OrderNotFound = errors.New("Order not found")
)
func (c *Client) Accounts() ([]Account, error) {
var accounts Accounts
err := c.NewRequest("GET", "accounts", nil, &accounts)
if err != nil {
return nil, err
}
return accounts.Accounts, nil
}
func (c *Client) Positions(account Account) (*Positions, error) {
u := fmt.Sprintf("accounts/%v/positions", account.Number)
var positions Positions
err := c.NewRequest("GET", u, nil, &positions)
if err != nil {
return nil, err
}
return &positions, nil
}
func (c *Client) Balances(account Account) (*Balances, error) {
u := fmt.Sprintf("accounts/%v/balances", account.Number)
var balances Balances
err := c.NewRequest("GET", u, nil, &balances)
if err != nil {
return nil, err
}
return &balances, nil
}
func (c *Client) Executions(account Account, startTime time.Time, endTime time.Time) (*Executions, error) {
parameters := url.Values{}
parameters.Add("startTime", startTime.Format(time.RFC3339))
parameters.Add("endTime", endTime.Format(time.RFC3339))
u := fmt.Sprintf("accounts/%vp/executions?%v", account.Number, parameters.Encode())
fmt.Println(u)
var executions Executions
err := c.NewRequest("GET", u, nil, &executions)
if err != nil {
return nil, err
}
return &executions, nil
}
func (c *Client) getOrders(account Account, parameters url.Values) (*Orders, error) {
u := fmt.Sprintf("accounts/%vp/orders?%v", account.Number, parameters.Encode())
fmt.Println(u)
var orders Orders
err := c.NewRequest("GET", u, nil, &orders)
if err != nil {
return nil, err
}
return &orders, nil
}
func (c *Client) OrderById(account Account, orderId int, stateFilter string) (*Order, error) {
parameters := url.Values{}
parameters.Add("orderId", string(orderId))
parameters.Add("stateFilter", stateFilter)
orders, err := c.getOrders(account, parameters)
if err != nil {
return nil, err
}
if len(orders.Orders) == 0 {
return nil, OrderNotFound
}
return &orders.Orders[0], nil
}
func (c *Client) Orders(account Account, startTime time.Time, endTime time.Time, stateFilter string) (*Orders, error) {
parameters := url.Values{}
parameters.Add("startTime", startTime.Format(time.RFC3339))
parameters.Add("endTime", endTime.Format(time.RFC3339))
parameters.Add("stateFilter", stateFilter)
return c.getOrders(account, parameters)
}
func (c *Client) Activities(account Account, startTime time.Time, endTime time.Time) (*Activities, error) {
parameters := url.Values{}
parameters.Add("startTime", startTime.Format(time.RFC3339))
parameters.Add("endTime", endTime.Format(time.RFC3339))
u := fmt.Sprintf("accounts/%vp/activities?%v", account.Number, parameters.Encode())
fmt.Println(u)
var activities Activities
err := c.NewRequest("GET", u, nil, &activities)
if err != nil {
return nil, err
}
return &activities, nil
}