-
Notifications
You must be signed in to change notification settings - Fork 4
/
accounts.py
394 lines (324 loc) · 14.9 KB
/
accounts.py
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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
from polosdk.rest.request import Request
class Accounts:
"""
Accounts class handles all endpoints related to account.
Attributes:
_request (Request): Class used to handle REST requests.
"""
def __init__(self, api_key, api_secret, url=None):
"""
Args:
api_key (str, required): User api key used for authentication.
api_secret (str, required): User api secret used for authentication.
url (str, optional): Url for endpoints, default is set to PROD in Request class.
"""
self._request = Request(api_key, api_secret, url)
def get_accounts(self):
"""
Get a list of all accounts of a user.
Returns:
A list of json objects with account information:
{
'accountId': (str) Account ID,
'accountType': (str) Account type. Currently only SPOT is supported,
'accountState': (str) Account's state, e.g. NORMAL, LOCKED
}
Raises:
RequestError: An error occurred communicating with trade engine.
Example:
response = client.accounts().get_accounts()
print(response)
"""
return self._request('GET', '/accounts', True)
def get_balances(self, account_type=None):
"""
Get a list of all accounts of a user with each account’s id, type and balances (assets).
Args:
account_type (str, optional): The account type. e.g. SPOT. Default will show all account types if not
specified. Currently only SPOT is supported.
Returns:
A list of json objects with account information:
[
{
'accountId': (str) Account ID,
'accountType': (str) Account type. Currently only SPOT is supported,
'balances':
[
{
'currencyId': (str) Currency id,
'currency': (str) Currency name,
'available': (str) Available amount for the currency,
'hold': (str) Frozen amount for the currency
},
{...}
]
},
{...},
...
]
Raises:
RequestError: An error occurred communicating with trade engine.
Example:
response = client.accounts().get_balances()
print(response)
"""
params = {}
if account_type is not None:
params.update({'accountType': account_type})
return self._request('GET', '/accounts/balances', True, params=params)
def get_account_balances(self, account_id):
"""
Get the full details for a single account with its balances: free (available) and locked (hold) for each currency.
Args:
account_id (int): Account id, data from /accounts.
Returns:
A list of json objects with account information:
[
{
'accountId': (str) Account ID,
'accountType': (str) Account type. Currently only SPOT is supported,
'balances':
[
{
'currencyId': (str) Currency id,
'currency': (str) Currency name,
'available': (str) Available amount for the currency,
'hold': (str) Frozen amount for the currency
},
{...}
]
}
]
Raises:
RequestError: An error occurred communicating with trade engine.
Example:
response = client.accounts().get_account_balances(<accountId>)
print(response)
"""
return self._request('GET', f'/accounts/{account_id}/balances', True)
def get_fee_info(self):
"""
Get fee rate for an account.
Returns:
A list of json objects with account information:
{
'trxDiscount': (boolean) Discount exists if using TRX,
'makerRate': (str) Maker rate,
'takerRate': (str) Taker rate,
'volume30D': (str) 30 days volume in USDT
}
Raises:
RequestError: An error occurred communicating with trade engine.
Example:
response = client.accounts().get_fee_info()
print(response)
"""
return self._request('GET', '/feeinfo', True)
def transfer(self, currency, amount, from_account, to_account):
"""
Transfer amount of currency from an account to another account for a user.
Args:
currency (str, required): The currency to transfer, like USDT.
amount (str, required): The amount to transfer.
from_account (str, required): The account, from which the currency is transferred.
to_account (str, required): The account, to which the currency is transferred.
Returns:
Reference Transfer Id:
{
'transferId': (str) Transfer ID
}
Raises:
RequestError: An error occurred communicating with trade engine.
Example:
response = client.accounts().transfer('USDT', '10.5', 'SPOT', 'FUTURES')
print(response)
"""
body = {
'currency': currency,
'amount': amount,
'fromAccount': from_account,
'toAccount': to_account
}
return self._request('POST', '/accounts/transfer', True, body=body)
def get_transfers(self, begins_from=None, start_time=None, end_time=None, **kwargs):
"""
Get a list of transfer records of a user.
Args:
begins_from (int, optional): It is 'transferId'. The query begin at ‘from', and the default is 0.
start_time (int, optional): Transfers before start time will not be retrieved. (milliseconds since UNIX epoch)
end_time (int, optional): Transfers after end time will not be retrieved. (milliseconds since UNIX epoch)
Keyword Args:
limit (int, optional): The max number of records could be returned.
direction (str, optional): PRE, NEXT, default is NEXT.
currency (str, optional): The transferred currency, like USDT. Default is for all currencies, if not specified.
Returns:
List of json objects with account transfer information:
[
{
'id': (str) Transfer ID,
'fromAccount': (str) The account, from which the currency is transferred,
'toAccount': (str) The account, to which the currency is transferred,
'currency': (str) The transferred currency,
'amount': (str) The transferred amount,
'state': (str) The state of transfer operation. (SUCCESS),
'createTime': (int) The datetime of transfer operation
},
{...},
...
]
Raises:
RequestError: An error occurred communicating with trade engine.
Example:
response = client.accounts().get_transfers()
print(response)
"""
params = {}
params.update(kwargs)
if begins_from is not None:
params.update({'from': begins_from})
if start_time is not None:
params.update({'startTime': start_time})
if end_time is not None:
params.update({'endTime': end_time})
return self._request('GET', '/accounts/transfer', True, params=params)
def get_transfer(self, transfer_id):
"""
Get a transfer record of a user by id.
Args:
transfer_id (str, required): Transfer ID.
Returns:
Json object with account transfer information:
{
'id': (str) Transfer ID,
'fromAccount': (str) The account, from which the currency is transferred,
'toAccount': (str) The account, to which the currency is transferred,
'currency': (str) The transferred currency,
'amount': (str) The transferred amount,
'state': (str) The state of transfer operation. (SUCCESS),
'createTime': (int) The datetime of transfer operation
}
Raises:
RequestError: An error occurred communicating with trade engine.
Example:
response = client.accounts().get_transfer('501')
print(response)
"""
return self._request('GET', f'/accounts/transfer/{transfer_id}', True)
def get_activity(self, start_time=None, end_time=None, activity_type=None, begins_from=None, **kwargs):
"""
Get a list of activities such as airdrop, rebates, staking, credit/debit adjustments, and other (historical adjustments).
Args
start_time (int, optional): Trades filled before startTime will not be retrieved.(milliseconds since UNIX epoch)
end_time (int, optional): Trades filled after endTime will not be retrieved.(milliseconds since UNIX epoch)
activity_type (int, optional): Type of activity: ALL: 200, AIRDROP: 201, COMMISSION_REBATE: 202, STAKING: 203,
REFERAL_REBATE: 204, CREDIT_ADJUSTMENT: 104,
DEBIT_ADJUSTMENT: 105, OTHER: 199. Must use numeric code.
begins_from (int, optional): It is 'id'. The query begin at ‘from', and the default is 0.
Keyword Args:
limit (int, optional): The max number of records could be returned. Default is 100 and max is 1000.
direction (str, optional): PRE, NEXT, default is NEXT.
currency (str, optional): The transferred currency, like USDT. Default is for all currencies, if not specified.
Returns:
List of json objects with account activity information:
[
{
'id': (str) Activity ID,
'currency': (str) Currency like BTC, ETH etc,
'amount': (str) Amount of the activity (can be negative),
'state': (str) State of the activity (ex. SUCCESS),
'createTime': (int) Datetime of the activity,
'description': (str) Activity details,
'activityType': (int) type of activity
},
{...},
...
]
Raises:
RequestError: An error occurred communicating with trade engine.
Example:
response = client.accounts().get_activity()
print(response)
"""
params = {}
params.update(kwargs)
if start_time is not None:
params.update({'startTime': start_time})
if end_time is not None:
params.update({'endTime': end_time})
if activity_type is not None:
params.update({'activityType': activity_type})
if begins_from is not None:
params.update({'from': begins_from})
return self._request('GET', '/accounts/activity', True, params=params)
def get_margin(self, account_type='SPOT'):
"""
Get account margin information
Args:
account_type (str, optional): The account type. Currently only SPOT is supported.
Returns:
Json objects with account margin information:
{
'totalAccountValue': (str) The sum of the usd value of all balances plus unrealized pnl,
'totalMargin': (str) Collateral that can be used for margin,
'usedMargin': (str) Amount of margin that has been used,
'freeMargin': (str) Available free margin,
'maintenanceMargin': (str) Minimum amount needed to keep account in good standing; enters liquidation mode if total margin falls below this value,
'marginRatio': (str) Is calculated as total margin / maintenance Margin; account enters liquidation mode if this value < 100%,
'time': (int) Time the record was created
}
Raises:
RequestError: An error occurred communicating with trade engine.
Example:
response = client.accounts().get_margin()
print(response)
"""
params = {'accountType': account_type}
return self._request('GET', '/margin/accountMargin', True, params=params)
def get_borrow_status(self, **kwargs):
"""
Get borrow status of currencies.
Keyword Args:
currency (str, optional): Currency name.
Returns:
List of json objects with borrow status for currency:
{
'currency': (str) Currency name,
'available': (str) Amount of available currency,
'borrowed': (str) Borrowed amount,
'hold': (str) Frozen amount,
'maxAvailable': (str) Amount that can be withdrawn, including what's borrowable with margin,
'hourlyBorrowRate': (str) Borrow rate per hour,
'version': (str) Current version of the currency
}
Raises:
RequestError: An error occurred communicating with trade engine.
Example:
response = client.accounts().get_borrow_status()
print(response)
"""
params = {}
params.update(kwargs)
return self._request('GET', '/margin/borrowStatus', True, params=params)
def get_margin_max(self, symbol):
"""
Get maximum and available buy/sell amount for a given symbol.
Args:
symbol (str, required): Symbol name.
Returns:
Json objects with maximum and available buy/sell amount for a given symbol:
{
'symbol': (str) Symbol name,
'maxLeverage': (int) Max leverage for the symbol,
'availableBuy': (str) Available amount for the quote currency that can be bought,
'maxAvailableBuy': (str) Maximum amount in quote currency that can be bought including margin,
'availableSell': (str) Available amount for the base currency that can be sold,
'maxAvailableSell': (str) Maximum amount in base currency that can be sold including margin
}
Raises:
RequestError: An error occurred communicating with trade engine.
Example:
response = client.accounts().get_margin_max('BTC_USDT')
print(response)
"""
params = {'symbol': symbol}
return self._request('GET', '/margin/maxSize', True, params=params)