ccxt 4.3.28__py2.py3-none-any.whl → 4.3.29__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ccxt might be problematic. Click here for more details.

@@ -6,7 +6,7 @@
6
6
  from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.bitmart import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Currencies, Currency, Int, IsolatedBorrowRate, IsolatedBorrowRates, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry, TransferEntries
9
+ from ccxt.base.types import Balances, Currencies, Currency, Int, IsolatedBorrowRate, IsolatedBorrowRates, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry, TransferEntries
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -59,6 +59,7 @@ class bitmart(Exchange, ImplicitAPI):
59
59
  'createMarketOrderWithCost': False,
60
60
  'createMarketSellOrderWithCost': False,
61
61
  'createOrder': True,
62
+ 'createOrders': True,
62
63
  'createPostOnlyOrder': True,
63
64
  'createStopLimitOrder': False,
64
65
  'createStopMarketOrder': False,
@@ -243,6 +244,7 @@ class bitmart(Exchange, ImplicitAPI):
243
244
  'spot/v4/query/trades': 5, # 12 times/2 sec = 6/s => 30/6 = 5
244
245
  'spot/v4/query/order-trades': 5, # 12 times/2 sec = 6/s => 30/6 = 5
245
246
  'spot/v4/cancel_orders': 3,
247
+ 'spot/v4/batch_orders': 3,
246
248
  # newer endpoint
247
249
  'spot/v3/cancel_order': 1,
248
250
  'spot/v2/batch_orders': 1,
@@ -2292,6 +2294,68 @@ class bitmart(Exchange, ImplicitAPI):
2292
2294
  order['price'] = price
2293
2295
  return order
2294
2296
 
2297
+ async def create_orders(self, orders: List[OrderRequest], params={}):
2298
+ """
2299
+ create a list of trade orders
2300
+ :see: https://developer-pro.bitmart.com/en/spot/#new-batch-order-v4-signed
2301
+ :param Array orders: list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
2302
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2303
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
2304
+ """
2305
+ await self.load_markets()
2306
+ ordersRequests = []
2307
+ symbol = None
2308
+ market = None
2309
+ for i in range(0, len(orders)):
2310
+ rawOrder = orders[i]
2311
+ marketId = self.safe_string(rawOrder, 'symbol')
2312
+ market = self.market(marketId)
2313
+ if not market['spot']:
2314
+ raise NotSupported(self.id + ' createOrders() supports spot orders only')
2315
+ if symbol is None:
2316
+ symbol = marketId
2317
+ else:
2318
+ if symbol != marketId:
2319
+ raise BadRequest(self.id + ' createOrders() requires all orders to have the same symbol')
2320
+ type = self.safe_string(rawOrder, 'type')
2321
+ side = self.safe_string(rawOrder, 'side')
2322
+ amount = self.safe_value(rawOrder, 'amount')
2323
+ price = self.safe_value(rawOrder, 'price')
2324
+ orderParams = self.safe_dict(rawOrder, 'params', {})
2325
+ orderRequest = self.create_spot_order_request(marketId, type, side, amount, price, orderParams)
2326
+ orderRequest = self.omit(orderRequest, ['symbol']) # not needed because it goes in the outter object
2327
+ ordersRequests.append(orderRequest)
2328
+ request = {
2329
+ 'symbol': market['id'],
2330
+ 'orderParams': ordersRequests,
2331
+ }
2332
+ response = await self.privatePostSpotV4BatchOrders(request)
2333
+ #
2334
+ # {
2335
+ # "message": "OK",
2336
+ # "code": 1000,
2337
+ # "trace": "5fc697fb817a4b5396284786a9b2609a.263.17022620476480263",
2338
+ # "data": {
2339
+ # "code": 0,
2340
+ # "msg": "success",
2341
+ # "data": {
2342
+ # "orderIds": [
2343
+ # "212751308355553320"
2344
+ # ]
2345
+ # }
2346
+ # }
2347
+ # }
2348
+ #
2349
+ data = self.safe_dict(response, 'data', {})
2350
+ innderData = self.safe_dict(data, 'data', {})
2351
+ orderIds = self.safe_list(innderData, 'orderIds', [])
2352
+ parsedOrders = []
2353
+ for i in range(0, len(orderIds)):
2354
+ orderId = orderIds[i]
2355
+ order = self.safe_order({'id': orderId}, market)
2356
+ parsedOrders.append(order)
2357
+ return parsedOrders
2358
+
2295
2359
  def create_swap_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
2296
2360
  """
2297
2361
  * @ignore
@@ -447,6 +447,7 @@ class kucoin(Exchange, ImplicitAPI):
447
447
  'The withdrawal amount is below the minimum requirement.': ExchangeError, # {"code":"400100","msg":"The withdrawal amount is below the minimum requirement."}
448
448
  'Unsuccessful! Exceeded the max. funds out-transfer limit': InsufficientFunds, # {"code":"200000","msg":"Unsuccessful! Exceeded the max. funds out-transfer limit"}
449
449
  'The amount increment is invalid.': BadRequest,
450
+ 'The quantity is below the minimum requirement.': InvalidOrder, # {"msg":"The quantity is below the minimum requirement.","code":"400100"}
450
451
  '400': BadRequest,
451
452
  '401': AuthenticationError,
452
453
  '403': NotSupported,
@@ -1388,7 +1388,7 @@ class whitebit(Exchange, ImplicitAPI):
1388
1388
  balance = response[id]
1389
1389
  if isinstance(balance, dict) and balance is not None:
1390
1390
  account = self.account()
1391
- account['free'] = self.safe_string(balance, 'available')
1391
+ account['free'] = self.safe_string_2(balance, 'available', 'main_balance')
1392
1392
  account['used'] = self.safe_string(balance, 'freeze')
1393
1393
  account['total'] = self.safe_string(balance, 'main_balance')
1394
1394
  result[code] = account
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.28'
7
+ __version__ = '4.3.29'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/bingx.py CHANGED
@@ -32,8 +32,7 @@ class bingx(Exchange, ImplicitAPI):
32
32
  'id': 'bingx',
33
33
  'name': 'BingX',
34
34
  'countries': ['US'], # North America, Canada, the EU, Hong Kong and Taiwan
35
- # cheapest is 60 requests a minute = 1 requests per second on average =>( 1000ms / 1) = 1000 ms between requests on average
36
- 'rateLimit': 1000,
35
+ 'rateLimit': 100,
37
36
  'version': 'v1',
38
37
  'certified': True,
39
38
  'pro': True,
@@ -146,44 +145,54 @@ class bingx(Exchange, ImplicitAPI):
146
145
  'v1': {
147
146
  'public': {
148
147
  'get': {
149
- 'server/time': 3,
150
- 'common/symbols': 3,
151
- 'market/trades': 3,
152
- 'market/depth': 3,
153
- 'market/kline': 3,
148
+ 'server/time': 1,
149
+ 'common/symbols': 1,
150
+ 'market/trades': 1,
151
+ 'market/depth': 1,
152
+ 'market/kline': 1,
154
153
  'ticker/24hr': 1,
154
+ 'ticker/price': 1,
155
+ 'ticker/bookTicker': 1,
155
156
  },
156
157
  },
157
158
  'private': {
158
159
  'get': {
159
- 'trade/query': 3,
160
- 'trade/openOrders': 3,
161
- 'trade/historyOrders': 3,
162
- 'trade/myTrades': 3,
163
- 'user/commissionRate': 3,
164
- 'account/balance': 3,
160
+ 'trade/query': 1,
161
+ 'trade/openOrders': 1,
162
+ 'trade/historyOrders': 1,
163
+ 'trade/myTrades': 2,
164
+ 'user/commissionRate': 5,
165
+ 'account/balance': 2,
165
166
  },
166
167
  'post': {
167
- 'trade/order': 3,
168
- 'trade/cancel': 3,
169
- 'trade/batchOrders': 3,
170
- 'trade/order/cancelReplace': 3,
171
- 'trade/cancelOrders': 3,
172
- 'trade/cancelOpenOrders': 3,
173
- 'trade/cancelAllAfter': 1,
168
+ 'trade/order': 2,
169
+ 'trade/cancel': 2,
170
+ 'trade/batchOrders': 5,
171
+ 'trade/order/cancelReplace': 5,
172
+ 'trade/cancelOrders': 5,
173
+ 'trade/cancelOpenOrders': 5,
174
+ 'trade/cancelAllAfter': 5,
175
+ },
176
+ },
177
+ },
178
+ 'v2': {
179
+ 'public': {
180
+ 'get': {
181
+ 'market/depth': 1,
182
+ 'market/kline': 1,
174
183
  },
175
184
  },
176
185
  },
177
186
  'v3': {
178
187
  'private': {
179
188
  'get': {
180
- 'get/asset/transfer': 3,
181
- 'asset/transfer': 3,
182
- 'capital/deposit/hisrec': 3,
183
- 'capital/withdraw/history': 3,
189
+ 'get/asset/transfer': 1,
190
+ 'asset/transfer': 1,
191
+ 'capital/deposit/hisrec': 1,
192
+ 'capital/withdraw/history': 1,
184
193
  },
185
194
  'post': {
186
- 'post/asset/transfer': 3,
195
+ 'post/asset/transfer': 5,
187
196
  },
188
197
  },
189
198
  },
@@ -193,26 +202,27 @@ class bingx(Exchange, ImplicitAPI):
193
202
  'public': {
194
203
  'get': {
195
204
  'ticker/price': 1,
205
+ 'market/historicalTrades': 1,
196
206
  },
197
207
  },
198
208
  'private': {
199
209
  'get': {
200
- 'positionSide/dual': 1,
210
+ 'positionSide/dual': 5,
201
211
  'market/markPriceKlines': 1,
202
- 'trade/batchCancelReplace': 1,
203
- 'trade/fullOrder': 1,
212
+ 'trade/batchCancelReplace': 5,
213
+ 'trade/fullOrder': 2,
204
214
  },
205
215
  'post': {
206
- 'trade/cancelReplace': 1,
207
- 'positionSide/dual': 1,
208
- 'trade/closePosition': 1,
216
+ 'trade/cancelReplace': 2,
217
+ 'positionSide/dual': 5,
218
+ 'trade/closePosition': 2,
209
219
  },
210
220
  },
211
221
  },
212
222
  'v2': {
213
223
  'public': {
214
224
  'get': {
215
- 'server/time': 3,
225
+ 'server/time': 1,
216
226
  'quote/contracts': 1,
217
227
  'quote/price': 1,
218
228
  'quote/depth': 1,
@@ -227,35 +237,35 @@ class bingx(Exchange, ImplicitAPI):
227
237
  },
228
238
  'private': {
229
239
  'get': {
230
- 'user/balance': 3,
231
- 'user/positions': 3,
232
- 'user/income': 3,
233
- 'trade/openOrders': 3,
234
- 'trade/openOrder': 3,
235
- 'trade/order': 3,
236
- 'trade/marginType': 3,
237
- 'trade/leverage': 3,
238
- 'trade/forceOrders': 3,
239
- 'trade/allOrders': 3,
240
- 'trade/allFillOrders': 3,
241
- 'user/income/export': 3,
242
- 'user/commissionRate': 3,
243
- 'quote/bookTicker': 3,
240
+ 'user/balance': 2,
241
+ 'user/positions': 2,
242
+ 'user/income': 2,
243
+ 'trade/openOrders': 2,
244
+ 'trade/openOrder': 2,
245
+ 'trade/order': 2,
246
+ 'trade/marginType': 5,
247
+ 'trade/leverage': 2,
248
+ 'trade/forceOrders': 1,
249
+ 'trade/allOrders': 2,
250
+ 'trade/allFillOrders': 2,
251
+ 'user/income/export': 2,
252
+ 'user/commissionRate': 2,
253
+ 'quote/bookTicker': 1,
244
254
  },
245
255
  'post': {
246
- 'trade/order': 3,
247
- 'trade/batchOrders': 3,
248
- 'trade/closeAllPositions': 3,
249
- 'trade/cancelAllAfter': 3,
250
- 'trade/marginType': 3,
251
- 'trade/leverage': 3,
252
- 'trade/positionMargin': 3,
253
- 'trade/order/test': 3,
256
+ 'trade/order': 2,
257
+ 'trade/batchOrders': 2,
258
+ 'trade/closeAllPositions': 2,
259
+ 'trade/cancelAllAfter': 5,
260
+ 'trade/marginType': 5,
261
+ 'trade/leverage': 5,
262
+ 'trade/positionMargin': 5,
263
+ 'trade/order/test': 2,
254
264
  },
255
265
  'delete': {
256
- 'trade/order': 3,
257
- 'trade/batchOrders': 3,
258
- 'trade/allOpenOrders': 3,
266
+ 'trade/order': 2,
267
+ 'trade/batchOrders': 2,
268
+ 'trade/allOpenOrders': 2,
259
269
  },
260
270
  },
261
271
  },
@@ -271,9 +281,9 @@ class bingx(Exchange, ImplicitAPI):
271
281
  'v1': {
272
282
  'private': {
273
283
  'get': {
274
- 'allPosition': 3,
275
- 'allOrders': 3,
276
- 'balance': 3,
284
+ 'allPosition': 2,
285
+ 'allOrders': 2,
286
+ 'balance': 2,
277
287
  },
278
288
  },
279
289
  },
@@ -282,18 +292,19 @@ class bingx(Exchange, ImplicitAPI):
282
292
  'v1': {
283
293
  'private': {
284
294
  'get': {
285
- 'capital/config/getall': 3,
286
- 'capital/deposit/address': 1,
295
+ 'capital/config/getall': 5,
296
+ 'capital/deposit/address': 5,
287
297
  'capital/innerTransfer/records': 1,
288
- 'capital/subAccount/deposit/address': 1,
289
- 'capital/deposit/subHisrec': 1,
298
+ 'capital/subAccount/deposit/address': 5,
299
+ 'capital/deposit/subHisrec': 2,
290
300
  'capital/subAccount/innerTransfer/records': 1,
301
+ 'capital/deposit/riskRecords': 5,
291
302
  },
292
303
  'post': {
293
- 'capital/withdraw/apply': 3,
294
- 'capital/innerTransfer/apply': 3,
295
- 'capital/subAccountInnerTransfer/apply': 3,
296
- 'capital/deposit/createSubAddress': 1,
304
+ 'capital/withdraw/apply': 5,
305
+ 'capital/innerTransfer/apply': 5,
306
+ 'capital/subAccountInnerTransfer/apply': 2,
307
+ 'capital/deposit/createSubAddress': 2,
297
308
  },
298
309
  },
299
310
  },
@@ -302,15 +313,15 @@ class bingx(Exchange, ImplicitAPI):
302
313
  'v1': {
303
314
  'private': {
304
315
  'get': {
305
- 'list': 3,
306
- 'assets': 3,
316
+ 'list': 10,
317
+ 'assets': 2,
307
318
  },
308
319
  'post': {
309
- 'create': 3,
310
- 'apiKey/create': 3,
311
- 'apiKey/edit': 3,
312
- 'apiKey/del': 3,
313
- 'updateStatus': 3,
320
+ 'create': 10,
321
+ 'apiKey/create': 2,
322
+ 'apiKey/edit': 2,
323
+ 'apiKey/del': 2,
324
+ 'updateStatus': 10,
314
325
  },
315
326
  },
316
327
  },
@@ -320,10 +331,10 @@ class bingx(Exchange, ImplicitAPI):
320
331
  'private': {
321
332
  'get': {
322
333
  'uid': 1,
323
- 'apiKey/query': 1,
334
+ 'apiKey/query': 2,
324
335
  },
325
336
  'post': {
326
- 'innerTransfer/authorizeSubAccount': 3,
337
+ 'innerTransfer/authorizeSubAccount': 1,
327
338
  },
328
339
  },
329
340
  },
@@ -332,10 +343,13 @@ class bingx(Exchange, ImplicitAPI):
332
343
  'auth': {
333
344
  'private': {
334
345
  'post': {
335
- 'userDataStream': 1,
346
+ 'userDataStream': 2,
336
347
  },
337
348
  'put': {
338
- 'userDataStream': 1,
349
+ 'userDataStream': 2,
350
+ },
351
+ 'delete': {
352
+ 'userDataStream': 2,
339
353
  },
340
354
  },
341
355
  },
@@ -344,12 +358,12 @@ class bingx(Exchange, ImplicitAPI):
344
358
  'v1': {
345
359
  'private': {
346
360
  'get': {
347
- 'swap/trace/currentTrack': 1,
361
+ 'swap/trace/currentTrack': 2,
348
362
  },
349
363
  'post': {
350
- 'swap/trace/closeTrackOrder': 1,
351
- 'swap/trace/setTPSL': 1,
352
- 'spot/trader/sellOrder': 1,
364
+ 'swap/trace/closeTrackOrder': 2,
365
+ 'swap/trace/setTPSL': 2,
366
+ 'spot/trader/sellOrder': 10,
353
367
  },
354
368
  },
355
369
  },
ccxt/bitmart.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.bitmart import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Currencies, Currency, Int, IsolatedBorrowRate, IsolatedBorrowRates, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry, TransferEntries
9
+ from ccxt.base.types import Balances, Currencies, Currency, Int, IsolatedBorrowRate, IsolatedBorrowRates, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry, TransferEntries
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -59,6 +59,7 @@ class bitmart(Exchange, ImplicitAPI):
59
59
  'createMarketOrderWithCost': False,
60
60
  'createMarketSellOrderWithCost': False,
61
61
  'createOrder': True,
62
+ 'createOrders': True,
62
63
  'createPostOnlyOrder': True,
63
64
  'createStopLimitOrder': False,
64
65
  'createStopMarketOrder': False,
@@ -243,6 +244,7 @@ class bitmart(Exchange, ImplicitAPI):
243
244
  'spot/v4/query/trades': 5, # 12 times/2 sec = 6/s => 30/6 = 5
244
245
  'spot/v4/query/order-trades': 5, # 12 times/2 sec = 6/s => 30/6 = 5
245
246
  'spot/v4/cancel_orders': 3,
247
+ 'spot/v4/batch_orders': 3,
246
248
  # newer endpoint
247
249
  'spot/v3/cancel_order': 1,
248
250
  'spot/v2/batch_orders': 1,
@@ -2292,6 +2294,68 @@ class bitmart(Exchange, ImplicitAPI):
2292
2294
  order['price'] = price
2293
2295
  return order
2294
2296
 
2297
+ def create_orders(self, orders: List[OrderRequest], params={}):
2298
+ """
2299
+ create a list of trade orders
2300
+ :see: https://developer-pro.bitmart.com/en/spot/#new-batch-order-v4-signed
2301
+ :param Array orders: list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
2302
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2303
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
2304
+ """
2305
+ self.load_markets()
2306
+ ordersRequests = []
2307
+ symbol = None
2308
+ market = None
2309
+ for i in range(0, len(orders)):
2310
+ rawOrder = orders[i]
2311
+ marketId = self.safe_string(rawOrder, 'symbol')
2312
+ market = self.market(marketId)
2313
+ if not market['spot']:
2314
+ raise NotSupported(self.id + ' createOrders() supports spot orders only')
2315
+ if symbol is None:
2316
+ symbol = marketId
2317
+ else:
2318
+ if symbol != marketId:
2319
+ raise BadRequest(self.id + ' createOrders() requires all orders to have the same symbol')
2320
+ type = self.safe_string(rawOrder, 'type')
2321
+ side = self.safe_string(rawOrder, 'side')
2322
+ amount = self.safe_value(rawOrder, 'amount')
2323
+ price = self.safe_value(rawOrder, 'price')
2324
+ orderParams = self.safe_dict(rawOrder, 'params', {})
2325
+ orderRequest = self.create_spot_order_request(marketId, type, side, amount, price, orderParams)
2326
+ orderRequest = self.omit(orderRequest, ['symbol']) # not needed because it goes in the outter object
2327
+ ordersRequests.append(orderRequest)
2328
+ request = {
2329
+ 'symbol': market['id'],
2330
+ 'orderParams': ordersRequests,
2331
+ }
2332
+ response = self.privatePostSpotV4BatchOrders(request)
2333
+ #
2334
+ # {
2335
+ # "message": "OK",
2336
+ # "code": 1000,
2337
+ # "trace": "5fc697fb817a4b5396284786a9b2609a.263.17022620476480263",
2338
+ # "data": {
2339
+ # "code": 0,
2340
+ # "msg": "success",
2341
+ # "data": {
2342
+ # "orderIds": [
2343
+ # "212751308355553320"
2344
+ # ]
2345
+ # }
2346
+ # }
2347
+ # }
2348
+ #
2349
+ data = self.safe_dict(response, 'data', {})
2350
+ innderData = self.safe_dict(data, 'data', {})
2351
+ orderIds = self.safe_list(innderData, 'orderIds', [])
2352
+ parsedOrders = []
2353
+ for i in range(0, len(orderIds)):
2354
+ orderId = orderIds[i]
2355
+ order = self.safe_order({'id': orderId}, market)
2356
+ parsedOrders.append(order)
2357
+ return parsedOrders
2358
+
2295
2359
  def create_swap_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
2296
2360
  """
2297
2361
  * @ignore
ccxt/kucoin.py CHANGED
@@ -446,6 +446,7 @@ class kucoin(Exchange, ImplicitAPI):
446
446
  'The withdrawal amount is below the minimum requirement.': ExchangeError, # {"code":"400100","msg":"The withdrawal amount is below the minimum requirement."}
447
447
  'Unsuccessful! Exceeded the max. funds out-transfer limit': InsufficientFunds, # {"code":"200000","msg":"Unsuccessful! Exceeded the max. funds out-transfer limit"}
448
448
  'The amount increment is invalid.': BadRequest,
449
+ 'The quantity is below the minimum requirement.': InvalidOrder, # {"msg":"The quantity is below the minimum requirement.","code":"400100"}
449
450
  '400': BadRequest,
450
451
  '401': AuthenticationError,
451
452
  '403': NotSupported,
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.28'
7
+ __version__ = '4.3.29'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/bitfinex.py CHANGED
@@ -311,7 +311,7 @@ class bitfinex(ccxt.async_support.bitfinex):
311
311
  size = -delta2Value if (delta2Value < 0) else delta2Value
312
312
  side = 'asks' if (delta2Value < 0) else 'bids'
313
313
  bookside = orderbook[side]
314
- bookside.store(price, size, id)
314
+ bookside.storeArray([price, size, id])
315
315
  else:
316
316
  deltas = message[1]
317
317
  for i in range(0, len(deltas)):
@@ -320,7 +320,7 @@ class bitfinex(ccxt.async_support.bitfinex):
320
320
  size = -delta2 if (delta2 < 0) else delta2
321
321
  side = 'asks' if (delta2 < 0) else 'bids'
322
322
  countedBookSide = orderbook[side]
323
- countedBookSide.store(delta[0], size, delta[1])
323
+ countedBookSide.storeArray([delta[0], size, delta[1]])
324
324
  client.resolve(orderbook, messageHash)
325
325
  else:
326
326
  orderbook = self.orderbooks[symbol]
@@ -333,13 +333,13 @@ class bitfinex(ccxt.async_support.bitfinex):
333
333
  bookside = orderbook[side]
334
334
  # price = 0 means that you have to remove the order from your book
335
335
  amount = size if Precise.string_gt(price, '0') else '0'
336
- bookside.store(self.parse_number(price), self.parse_number(amount), id)
336
+ bookside.storeArray([self.parse_number(price), self.parse_number(amount), id])
337
337
  else:
338
338
  message3Value = message[3]
339
339
  size = -message3Value if (message3Value < 0) else message3Value
340
340
  side = 'asks' if (message3Value < 0) else 'bids'
341
341
  countedBookSide = orderbook[side]
342
- countedBookSide.store(message[1], size, message[2])
342
+ countedBookSide.storeArray([message[1], size, message[2]])
343
343
  client.resolve(orderbook, messageHash)
344
344
 
345
345
  def handle_heartbeat(self, client: Client, message):
ccxt/pro/bitfinex2.py CHANGED
@@ -597,7 +597,7 @@ class bitfinex2(ccxt.async_support.bitfinex2):
597
597
  # price = 0 means that you have to remove the order from your book
598
598
  amount = size if Precise.string_gt(price, '0') else '0'
599
599
  idString = self.safe_string(deltas, 0)
600
- bookside.store(self.parse_number(price), self.parse_number(amount), idString)
600
+ bookside.storeArray([self.parse_number(price), self.parse_number(amount), idString])
601
601
  else:
602
602
  amount = self.safe_string(deltas, 2)
603
603
  counter = self.safe_string(deltas, 1)
@@ -605,7 +605,7 @@ class bitfinex2(ccxt.async_support.bitfinex2):
605
605
  size = Precise.string_neg(amount) if Precise.string_lt(amount, '0') else amount
606
606
  side = 'asks' if Precise.string_lt(amount, '0') else 'bids'
607
607
  bookside = orderbookItem[side]
608
- bookside.store(self.parse_number(price), self.parse_number(size), self.parse_number(counter))
608
+ bookside.storeArray([self.parse_number(price), self.parse_number(size), self.parse_number(counter)])
609
609
  client.resolve(orderbook, messageHash)
610
610
 
611
611
  def handle_checksum(self, client: Client, message, subscription):
ccxt/pro/bitmex.py CHANGED
@@ -1376,7 +1376,7 @@ class bitmex(ccxt.async_support.bitmex):
1376
1376
  data = self.safe_value(message, 'data', [])
1377
1377
  # if it's an initial snapshot
1378
1378
  if action == 'partial':
1379
- filter = self.safe_value(message, 'filter', {})
1379
+ filter = self.safe_dict(message, 'filter', {})
1380
1380
  marketId = self.safe_value(filter, 'symbol')
1381
1381
  market = self.safe_market(marketId)
1382
1382
  symbol = market['symbol']
@@ -1395,7 +1395,7 @@ class bitmex(ccxt.async_support.bitmex):
1395
1395
  side = self.safe_string(data[i], 'side')
1396
1396
  side = 'bids' if (side == 'Buy') else 'asks'
1397
1397
  bookside = orderbook[side]
1398
- bookside.store(price, size, id)
1398
+ bookside.storeArray([price, size, id])
1399
1399
  datetime = self.safe_string(data[i], 'timestamp')
1400
1400
  orderbook['timestamp'] = self.parse8601(datetime)
1401
1401
  orderbook['datetime'] = datetime
@@ -1417,7 +1417,7 @@ class bitmex(ccxt.async_support.bitmex):
1417
1417
  side = self.safe_string(data[i], 'side')
1418
1418
  side = 'bids' if (side == 'Buy') else 'asks'
1419
1419
  bookside = orderbook[side]
1420
- bookside.store(price, size, id)
1420
+ bookside.storeArray([price, size, id])
1421
1421
  datetime = self.safe_string(data[i], 'timestamp')
1422
1422
  orderbook['timestamp'] = self.parse8601(datetime)
1423
1423
  orderbook['datetime'] = datetime
ccxt/pro/blockchaincom.py CHANGED
@@ -669,8 +669,8 @@ class blockchaincom(ccxt.async_support.blockchaincom):
669
669
  snapshot = self.parse_order_book(message, symbol, timestamp, 'bids', 'asks', 'px', 'qty', 'num')
670
670
  orderbook.reset(snapshot)
671
671
  elif event == 'updated':
672
- asks = self.safe_value(message, 'asks', [])
673
- bids = self.safe_value(message, 'bids', [])
672
+ asks = self.safe_list(message, 'asks', [])
673
+ bids = self.safe_list(message, 'bids', [])
674
674
  self.handle_deltas(orderbook['asks'], asks)
675
675
  self.handle_deltas(orderbook['bids'], bids)
676
676
  orderbook['timestamp'] = timestamp