ccxt 4.3.56__py2.py3-none-any.whl → 4.3.58__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.
- ccxt/__init__.py +1 -1
- ccxt/abstract/kucoin.py +1 -0
- ccxt/abstract/kucoinfutures.py +1 -0
- ccxt/alpaca.py +5 -1
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/alpaca.py +5 -1
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/base/ws/client.py +26 -5
- ccxt/async_support/bigone.py +19 -1
- ccxt/async_support/bingx.py +114 -26
- ccxt/async_support/bitget.py +56 -47
- ccxt/async_support/coinmate.py +28 -32
- ccxt/async_support/coinone.py +15 -19
- ccxt/async_support/gate.py +102 -4
- ccxt/async_support/htx.py +87 -26
- ccxt/async_support/huobijp.py +61 -2
- ccxt/async_support/kucoin.py +3 -0
- ccxt/async_support/latoken.py +5 -1
- ccxt/async_support/okx.py +2 -0
- ccxt/async_support/woo.py +2 -1
- ccxt/base/exchange.py +1 -1
- ccxt/bigone.py +19 -1
- ccxt/bingx.py +114 -26
- ccxt/bitget.py +56 -47
- ccxt/coinmate.py +28 -32
- ccxt/coinone.py +15 -19
- ccxt/gate.py +102 -4
- ccxt/htx.py +87 -26
- ccxt/huobijp.py +61 -2
- ccxt/kucoin.py +3 -0
- ccxt/latoken.py +5 -1
- ccxt/okx.py +2 -0
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/htx.py +1 -1
- ccxt/pro/okx.py +3 -3
- ccxt/woo.py +2 -1
- {ccxt-4.3.56.dist-info → ccxt-4.3.58.dist-info}/METADATA +4 -4
- {ccxt-4.3.56.dist-info → ccxt-4.3.58.dist-info}/RECORD +41 -41
- {ccxt-4.3.56.dist-info → ccxt-4.3.58.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.3.56.dist-info → ccxt-4.3.58.dist-info}/WHEEL +0 -0
- {ccxt-4.3.56.dist-info → ccxt-4.3.58.dist-info}/top_level.txt +0 -0
ccxt/bingx.py
CHANGED
@@ -674,6 +674,29 @@ class bingx(Exchange, ImplicitAPI):
|
|
674
674
|
markets = self.safe_list(response, 'data', [])
|
675
675
|
return self.parse_markets(markets)
|
676
676
|
|
677
|
+
def fetch_inverse_swap_markets(self, params):
|
678
|
+
response = self.cswapV1PublicGetMarketContracts(params)
|
679
|
+
#
|
680
|
+
# {
|
681
|
+
# "code": 0,
|
682
|
+
# "msg": "",
|
683
|
+
# "timestamp": 1720074487610,
|
684
|
+
# "data": [
|
685
|
+
# {
|
686
|
+
# "symbol": "BNB-USD",
|
687
|
+
# "pricePrecision": 2,
|
688
|
+
# "minTickSize": "10",
|
689
|
+
# "minTradeValue": "10",
|
690
|
+
# "minQty": "1.00000000",
|
691
|
+
# "status": 1,
|
692
|
+
# "timeOnline": 1713175200000
|
693
|
+
# },
|
694
|
+
# ]
|
695
|
+
# }
|
696
|
+
#
|
697
|
+
markets = self.safe_list(response, 'data', [])
|
698
|
+
return self.parse_markets(markets)
|
699
|
+
|
677
700
|
def parse_market(self, market: dict) -> Market:
|
678
701
|
id = self.safe_string(market, 'symbol')
|
679
702
|
symbolParts = id.split('-')
|
@@ -682,6 +705,14 @@ class bingx(Exchange, ImplicitAPI):
|
|
682
705
|
base = self.safe_currency_code(baseId)
|
683
706
|
quote = self.safe_currency_code(quoteId)
|
684
707
|
currency = self.safe_string(market, 'currency')
|
708
|
+
checkIsInverse = False
|
709
|
+
checkIsLinear = True
|
710
|
+
minTickSize = self.safe_number(market, 'minTickSize')
|
711
|
+
if minTickSize is not None:
|
712
|
+
# inverse swap market
|
713
|
+
currency = baseId
|
714
|
+
checkIsInverse = True
|
715
|
+
checkIsLinear = False
|
685
716
|
settle = self.safe_currency_code(currency)
|
686
717
|
pricePrecision = self.safe_number(market, 'tickSize')
|
687
718
|
if pricePrecision is None:
|
@@ -698,8 +729,11 @@ class bingx(Exchange, ImplicitAPI):
|
|
698
729
|
fees = self.safe_dict(self.fees, type, {})
|
699
730
|
contractSize = self.parse_number('1') if (swap) else None
|
700
731
|
isActive = self.safe_string(market, 'status') == '1'
|
701
|
-
isInverse = None if (spot) else
|
702
|
-
isLinear = None if (spot) else
|
732
|
+
isInverse = None if (spot) else checkIsInverse
|
733
|
+
isLinear = None if (spot) else checkIsLinear
|
734
|
+
timeOnline = self.safe_integer(market, 'timeOnline')
|
735
|
+
if timeOnline == 0:
|
736
|
+
timeOnline = None
|
703
737
|
return self.safe_market_structure({
|
704
738
|
'id': id,
|
705
739
|
'symbol': symbol,
|
@@ -741,15 +775,15 @@ class bingx(Exchange, ImplicitAPI):
|
|
741
775
|
'max': self.safe_number(market, 'maxQty'),
|
742
776
|
},
|
743
777
|
'price': {
|
744
|
-
'min':
|
778
|
+
'min': minTickSize,
|
745
779
|
'max': None,
|
746
780
|
},
|
747
781
|
'cost': {
|
748
|
-
'min': self.
|
782
|
+
'min': self.safe_number_n(market, ['minNotional', 'tradeMinUSDT', 'minTradeValue']),
|
749
783
|
'max': self.safe_number(market, 'maxNotional'),
|
750
784
|
},
|
751
785
|
},
|
752
|
-
'created':
|
786
|
+
'created': timeOnline,
|
753
787
|
'info': market,
|
754
788
|
})
|
755
789
|
|
@@ -758,16 +792,20 @@ class bingx(Exchange, ImplicitAPI):
|
|
758
792
|
retrieves data on all markets for bingx
|
759
793
|
:see: https://bingx-api.github.io/docs/#/spot/market-api.html#Query%20Symbols
|
760
794
|
:see: https://bingx-api.github.io/docs/#/swapV2/market-api.html#Contract%20Information
|
795
|
+
:see: https://bingx-api.github.io/docs/#/en-us/cswap/market-api.html#Contract%20Information
|
761
796
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
762
797
|
:returns dict[]: an array of objects representing market data
|
763
798
|
"""
|
764
799
|
requests = [self.fetch_swap_markets(params)]
|
765
800
|
isSandbox = self.safe_bool(self.options, 'sandboxMode', False)
|
766
801
|
if not isSandbox:
|
802
|
+
requests.append(self.fetch_inverse_swap_markets(params))
|
767
803
|
requests.append(self.fetch_spot_markets(params)) # sandbox is swap only
|
768
804
|
promises = requests
|
769
|
-
|
770
|
-
|
805
|
+
linearSwapMarkets = self.safe_list(promises, 0, [])
|
806
|
+
inverseSwapMarkets = self.safe_list(promises, 1, [])
|
807
|
+
spotMarkets = self.safe_list(promises, 2, [])
|
808
|
+
swapMarkets = self.array_concat(linearSwapMarkets, inverseSwapMarkets)
|
771
809
|
return self.array_concat(spotMarkets, swapMarkets)
|
772
810
|
|
773
811
|
def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
@@ -777,13 +815,14 @@ class bingx(Exchange, ImplicitAPI):
|
|
777
815
|
:see: https://bingx-api.github.io/docs/#/spot/market-api.html#Candlestick%20chart%20data
|
778
816
|
:see: https://bingx-api.github.io/docs/#/swapV2/market-api.html#%20K-Line%20Data
|
779
817
|
:see: https://bingx-api.github.io/docs/#/en-us/swapV2/market-api.html#K-Line%20Data%20-%20Mark%20Price
|
818
|
+
:see: https://bingx-api.github.io/docs/#/en-us/cswap/market-api.html#Get%20K-line%20Data
|
780
819
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
781
820
|
:param str timeframe: the length of time each candle represents
|
782
821
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
783
822
|
:param int [limit]: the maximum amount of candles to fetch
|
784
823
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
785
824
|
:param int [params.until]: timestamp in ms of the latest candle to fetch
|
786
|
-
:param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [
|
825
|
+
:param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
|
787
826
|
:returns int[][]: A list of candles ordered, open, high, low, close, volume
|
788
827
|
"""
|
789
828
|
self.load_markets()
|
@@ -808,12 +847,15 @@ class bingx(Exchange, ImplicitAPI):
|
|
808
847
|
if market['spot']:
|
809
848
|
response = self.spotV1PublicGetMarketKline(self.extend(request, params))
|
810
849
|
else:
|
811
|
-
|
812
|
-
|
813
|
-
if price == 'mark':
|
814
|
-
response = self.swapV1PrivateGetMarketMarkPriceKlines(self.extend(request, params))
|
850
|
+
if market['inverse']:
|
851
|
+
response = self.cswapV1PublicGetMarketKlines(self.extend(request, params))
|
815
852
|
else:
|
816
|
-
|
853
|
+
price = self.safe_string(params, 'price')
|
854
|
+
params = self.omit(params, 'price')
|
855
|
+
if price == 'mark':
|
856
|
+
response = self.swapV1PrivateGetMarketMarkPriceKlines(self.extend(request, params))
|
857
|
+
else:
|
858
|
+
response = self.swapV3PublicGetQuoteKlines(self.extend(request, params))
|
817
859
|
#
|
818
860
|
# {
|
819
861
|
# "code": 0,
|
@@ -1106,6 +1148,7 @@ class bingx(Exchange, ImplicitAPI):
|
|
1106
1148
|
fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
1107
1149
|
:see: https://bingx-api.github.io/docs/#/spot/market-api.html#Query%20depth%20information
|
1108
1150
|
:see: https://bingx-api.github.io/docs/#/swapV2/market-api.html#Get%20Market%20Depth
|
1151
|
+
:see: https://bingx-api.github.io/docs/#/en-us/cswap/market-api.html#Query%20Depth%20Data
|
1109
1152
|
:param str symbol: unified symbol of the market to fetch the order book for
|
1110
1153
|
:param int [limit]: the maximum amount of order book entries to return
|
1111
1154
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1124,7 +1167,10 @@ class bingx(Exchange, ImplicitAPI):
|
|
1124
1167
|
if marketType == 'spot':
|
1125
1168
|
response = self.spotV1PublicGetMarketDepth(self.extend(request, params))
|
1126
1169
|
else:
|
1127
|
-
|
1170
|
+
if market['inverse']:
|
1171
|
+
response = self.cswapV1PublicGetMarketDepth(self.extend(request, params))
|
1172
|
+
else:
|
1173
|
+
response = self.swapV2PublicGetQuoteDepth(self.extend(request, params))
|
1128
1174
|
#
|
1129
1175
|
# spot
|
1130
1176
|
#
|
@@ -1190,6 +1236,7 @@ class bingx(Exchange, ImplicitAPI):
|
|
1190
1236
|
"""
|
1191
1237
|
fetch the current funding rate
|
1192
1238
|
:see: https://bingx-api.github.io/docs/#/swapV2/market-api.html#Current%20Funding%20Rate
|
1239
|
+
:see: https://bingx-api.github.io/docs/#/en-us/cswap/market-api.html#Price%20&%20Current%20Funding%20Rate
|
1193
1240
|
:param str symbol: unified market symbol
|
1194
1241
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1195
1242
|
:returns dict: a `funding rate structure <https://docs.ccxt.com/#/?id=funding-rate-structure>`
|
@@ -1199,7 +1246,11 @@ class bingx(Exchange, ImplicitAPI):
|
|
1199
1246
|
request: dict = {
|
1200
1247
|
'symbol': market['id'],
|
1201
1248
|
}
|
1202
|
-
response =
|
1249
|
+
response = None
|
1250
|
+
if market['inverse']:
|
1251
|
+
response = self.cswapV1PublicGetMarketPremiumIndex(self.extend(request, params))
|
1252
|
+
else:
|
1253
|
+
response = self.swapV2PublicGetQuotePremiumIndex(self.extend(request, params))
|
1203
1254
|
#
|
1204
1255
|
# {
|
1205
1256
|
# "code":0,
|
@@ -1337,9 +1388,10 @@ class bingx(Exchange, ImplicitAPI):
|
|
1337
1388
|
|
1338
1389
|
def fetch_open_interest(self, symbol: str, params={}):
|
1339
1390
|
"""
|
1340
|
-
|
1391
|
+
retrieves the open interest of a trading pair
|
1341
1392
|
:see: https://bingx-api.github.io/docs/#/swapV2/market-api.html#Get%20Swap%20Open%20Positions
|
1342
|
-
:
|
1393
|
+
:see: https://bingx-api.github.io/docs/#/en-us/cswap/market-api.html#Get%20Swap%20Open%20Positions
|
1394
|
+
:param str symbol: unified CCXT market symbol
|
1343
1395
|
:param dict [params]: exchange specific parameters
|
1344
1396
|
:returns dict} an open interest structure{@link https://docs.ccxt.com/#/?id=open-interest-structure:
|
1345
1397
|
"""
|
@@ -1348,7 +1400,13 @@ class bingx(Exchange, ImplicitAPI):
|
|
1348
1400
|
request: dict = {
|
1349
1401
|
'symbol': market['id'],
|
1350
1402
|
}
|
1351
|
-
response =
|
1403
|
+
response = None
|
1404
|
+
if market['inverse']:
|
1405
|
+
response = self.cswapV1PublicGetMarketOpenInterest(self.extend(request, params))
|
1406
|
+
else:
|
1407
|
+
response = self.swapV2PublicGetQuoteOpenInterest(self.extend(request, params))
|
1408
|
+
#
|
1409
|
+
# linear swap
|
1352
1410
|
#
|
1353
1411
|
# {
|
1354
1412
|
# "code": 0,
|
@@ -1360,18 +1418,48 @@ class bingx(Exchange, ImplicitAPI):
|
|
1360
1418
|
# }
|
1361
1419
|
# }
|
1362
1420
|
#
|
1363
|
-
|
1364
|
-
|
1421
|
+
# inverse swap
|
1422
|
+
#
|
1423
|
+
# {
|
1424
|
+
# "code": 0,
|
1425
|
+
# "msg": "",
|
1426
|
+
# "timestamp": 1720328247986,
|
1427
|
+
# "data": [
|
1428
|
+
# {
|
1429
|
+
# "symbol": "BTC-USD",
|
1430
|
+
# "openInterest": "749.1160",
|
1431
|
+
# "timestamp": 1720310400000
|
1432
|
+
# }
|
1433
|
+
# ]
|
1434
|
+
# }
|
1435
|
+
#
|
1436
|
+
result: dict = {}
|
1437
|
+
if market['inverse']:
|
1438
|
+
data = self.safe_list(response, 'data', [])
|
1439
|
+
result = self.safe_dict(data, 0, {})
|
1440
|
+
else:
|
1441
|
+
result = self.safe_dict(response, 'data', {})
|
1442
|
+
return self.parse_open_interest(result, market)
|
1365
1443
|
|
1366
1444
|
def parse_open_interest(self, interest, market: Market = None):
|
1367
1445
|
#
|
1368
|
-
#
|
1369
|
-
#
|
1370
|
-
#
|
1371
|
-
#
|
1372
|
-
#
|
1446
|
+
# linear swap
|
1447
|
+
#
|
1448
|
+
# {
|
1449
|
+
# "openInterest": "3289641547.10",
|
1450
|
+
# "symbol": "BTC-USDT",
|
1451
|
+
# "time": 1672026617364
|
1452
|
+
# }
|
1453
|
+
#
|
1454
|
+
# inverse swap
|
1455
|
+
#
|
1456
|
+
# {
|
1457
|
+
# "symbol": "BTC-USD",
|
1458
|
+
# "openInterest": "749.1160",
|
1459
|
+
# "timestamp": 1720310400000
|
1460
|
+
# }
|
1373
1461
|
#
|
1374
|
-
timestamp = self.
|
1462
|
+
timestamp = self.safe_integer_2(interest, 'time', 'timestamp')
|
1375
1463
|
id = self.safe_string(interest, 'symbol')
|
1376
1464
|
symbol = self.safe_symbol(id, market, '-', 'swap')
|
1377
1465
|
openInterest = self.safe_number(interest, 'openInterest')
|
ccxt/bitget.py
CHANGED
@@ -4691,6 +4691,22 @@ class bitget(Exchange, ImplicitAPI):
|
|
4691
4691
|
response = self.privateMarginPostMarginV1CrossOrderBatchCancelOrder(self.extend(request, params))
|
4692
4692
|
else:
|
4693
4693
|
response = self.privateMarginPostMarginV1IsolatedOrderBatchCancelOrder(self.extend(request, params))
|
4694
|
+
#
|
4695
|
+
# {
|
4696
|
+
# "code": "00000",
|
4697
|
+
# "msg": "success",
|
4698
|
+
# "requestTime": 1700717155622,
|
4699
|
+
# "data": {
|
4700
|
+
# "resultList": [
|
4701
|
+
# {
|
4702
|
+
# "orderId": "1111453253721796609",
|
4703
|
+
# "clientOid": "2ae7fc8a4ff949b6b60d770ca3950e2d"
|
4704
|
+
# },
|
4705
|
+
# ],
|
4706
|
+
# "failure": []
|
4707
|
+
# }
|
4708
|
+
# }
|
4709
|
+
#
|
4694
4710
|
else:
|
4695
4711
|
if stop:
|
4696
4712
|
stopRequest: dict = {
|
@@ -4699,6 +4715,27 @@ class bitget(Exchange, ImplicitAPI):
|
|
4699
4715
|
response = self.privateSpotPostV2SpotTradeBatchCancelPlanOrder(self.extend(stopRequest, params))
|
4700
4716
|
else:
|
4701
4717
|
response = self.privateSpotPostV2SpotTradeCancelSymbolOrder(self.extend(request, params))
|
4718
|
+
#
|
4719
|
+
# {
|
4720
|
+
# "code": "00000",
|
4721
|
+
# "msg": "success",
|
4722
|
+
# "requestTime": 1700716953996,
|
4723
|
+
# "data": {
|
4724
|
+
# "symbol": "BTCUSDT"
|
4725
|
+
# }
|
4726
|
+
# }
|
4727
|
+
#
|
4728
|
+
timestamp = self.safe_integer(response, 'requestTime')
|
4729
|
+
responseData = self.safe_dict(response, 'data')
|
4730
|
+
marketId = self.safe_string(responseData, 'symbol')
|
4731
|
+
return [
|
4732
|
+
self.safe_order({
|
4733
|
+
'info': response,
|
4734
|
+
'symbol': self.safe_symbol(marketId, None, None, 'spot'),
|
4735
|
+
'timestamp': timestamp,
|
4736
|
+
'datetime': self.iso8601(timestamp),
|
4737
|
+
}),
|
4738
|
+
]
|
4702
4739
|
else:
|
4703
4740
|
productType = None
|
4704
4741
|
productType, params = self.handle_product_type_and_params(market, params)
|
@@ -4707,53 +4744,25 @@ class bitget(Exchange, ImplicitAPI):
|
|
4707
4744
|
response = self.privateMixPostV2MixOrderCancelPlanOrder(self.extend(request, params))
|
4708
4745
|
else:
|
4709
4746
|
response = self.privateMixPostV2MixOrderBatchCancelOrders(self.extend(request, params))
|
4710
|
-
|
4711
|
-
|
4712
|
-
|
4713
|
-
|
4714
|
-
|
4715
|
-
|
4716
|
-
|
4717
|
-
|
4718
|
-
|
4719
|
-
|
4720
|
-
|
4721
|
-
|
4722
|
-
|
4723
|
-
|
4724
|
-
|
4725
|
-
|
4726
|
-
|
4727
|
-
|
4728
|
-
|
4729
|
-
# "successList": [
|
4730
|
-
# {
|
4731
|
-
# "orderId": "1024598257429823488",
|
4732
|
-
# "clientOid": "876493ce-c287-4bfc-9f4a-8b1905881313"
|
4733
|
-
# },
|
4734
|
-
# ],
|
4735
|
-
# "failureList": []
|
4736
|
-
# }
|
4737
|
-
# }
|
4738
|
-
#
|
4739
|
-
# spot margin
|
4740
|
-
#
|
4741
|
-
# {
|
4742
|
-
# "code": "00000",
|
4743
|
-
# "msg": "success",
|
4744
|
-
# "requestTime": 1700717155622,
|
4745
|
-
# "data": {
|
4746
|
-
# "resultList": [
|
4747
|
-
# {
|
4748
|
-
# "orderId": "1111453253721796609",
|
4749
|
-
# "clientOid": "2ae7fc8a4ff949b6b60d770ca3950e2d"
|
4750
|
-
# },
|
4751
|
-
# ],
|
4752
|
-
# "failure": []
|
4753
|
-
# }
|
4754
|
-
# }
|
4755
|
-
#
|
4756
|
-
return response
|
4747
|
+
# {
|
4748
|
+
# "code": "00000",
|
4749
|
+
# "msg": "success",
|
4750
|
+
# "requestTime": "1680008815965",
|
4751
|
+
# "data": {
|
4752
|
+
# "successList": [
|
4753
|
+
# {
|
4754
|
+
# "orderId": "1024598257429823488",
|
4755
|
+
# "clientOid": "876493ce-c287-4bfc-9f4a-8b1905881313"
|
4756
|
+
# },
|
4757
|
+
# ],
|
4758
|
+
# "failureList": []
|
4759
|
+
# }
|
4760
|
+
# }
|
4761
|
+
data = self.safe_dict(response, 'data')
|
4762
|
+
resultList = self.safe_list_2(data, 'resultList', 'successList')
|
4763
|
+
failureList = self.safe_list_2(data, 'failure', 'failureList')
|
4764
|
+
responseList = self.array_concat(resultList, failureList)
|
4765
|
+
return self.parse_orders(responseList)
|
4757
4766
|
|
4758
4767
|
def fetch_order(self, id: str, symbol: Str = None, params={}):
|
4759
4768
|
"""
|
ccxt/coinmate.py
CHANGED
@@ -26,7 +26,7 @@ class coinmate(Exchange, ImplicitAPI):
|
|
26
26
|
'id': 'coinmate',
|
27
27
|
'name': 'CoinMate',
|
28
28
|
'countries': ['GB', 'CZ', 'EU'], # UK, Czech Republic
|
29
|
-
'rateLimit':
|
29
|
+
'rateLimit': 600,
|
30
30
|
'has': {
|
31
31
|
'CORS': True,
|
32
32
|
'spot': True,
|
@@ -175,28 +175,28 @@ class coinmate(Exchange, ImplicitAPI):
|
|
175
175
|
'trading': {
|
176
176
|
'tierBased': True,
|
177
177
|
'percentage': True,
|
178
|
-
'
|
179
|
-
'
|
178
|
+
'taker': self.parse_number('0.006'),
|
179
|
+
'maker': self.parse_number('0.004'),
|
180
180
|
'tiers': {
|
181
181
|
'taker': [
|
182
|
-
[self.parse_number('0'), self.parse_number('0.
|
183
|
-
[self.parse_number('10000'), self.parse_number('0.
|
184
|
-
[self.parse_number('100000'), self.parse_number('0.
|
185
|
-
[self.parse_number('250000'), self.parse_number('0.
|
186
|
-
[self.parse_number('500000'), self.parse_number('0.
|
187
|
-
[self.parse_number('1000000'), self.parse_number('0.
|
188
|
-
[self.parse_number('3000000'), self.parse_number('0.
|
189
|
-
[self.parse_number('15000000'), self.parse_number('0.
|
182
|
+
[self.parse_number('0'), self.parse_number('0.006')],
|
183
|
+
[self.parse_number('10000'), self.parse_number('0.003')],
|
184
|
+
[self.parse_number('100000'), self.parse_number('0.0023')],
|
185
|
+
[self.parse_number('250000'), self.parse_number('0.0021')],
|
186
|
+
[self.parse_number('500000'), self.parse_number('0.0018')],
|
187
|
+
[self.parse_number('1000000'), self.parse_number('0.0015')],
|
188
|
+
[self.parse_number('3000000'), self.parse_number('0.0012')],
|
189
|
+
[self.parse_number('15000000'), self.parse_number('0.001')],
|
190
190
|
],
|
191
191
|
'maker': [
|
192
|
-
[self.parse_number('0'), self.parse_number('0.
|
193
|
-
[self.parse_number('10000'), self.parse_number('0.
|
194
|
-
[self.parse_number('100000'), self.parse_number('0.
|
195
|
-
[self.parse_number('250000'), self.parse_number('0.
|
192
|
+
[self.parse_number('0'), self.parse_number('0.004')],
|
193
|
+
[self.parse_number('10000'), self.parse_number('0.002')],
|
194
|
+
[self.parse_number('100000'), self.parse_number('0.0012')],
|
195
|
+
[self.parse_number('250000'), self.parse_number('0.0009')],
|
196
196
|
[self.parse_number('500000'), self.parse_number('0.0005')],
|
197
197
|
[self.parse_number('1000000'), self.parse_number('0.0003')],
|
198
198
|
[self.parse_number('3000000'), self.parse_number('0.0002')],
|
199
|
-
[self.parse_number('15000000'), self.parse_number('0')],
|
199
|
+
[self.parse_number('15000000'), self.parse_number('-0.0004')],
|
200
200
|
],
|
201
201
|
},
|
202
202
|
},
|
@@ -1048,20 +1048,16 @@ class coinmate(Exchange, ImplicitAPI):
|
|
1048
1048
|
return {'url': url, 'method': method, 'body': body, 'headers': headers}
|
1049
1049
|
|
1050
1050
|
def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
|
1051
|
-
if response is
|
1052
|
-
|
1053
|
-
|
1054
|
-
|
1055
|
-
|
1056
|
-
|
1057
|
-
|
1058
|
-
|
1059
|
-
|
1060
|
-
|
1061
|
-
|
1062
|
-
|
1063
|
-
self.throw_exactly_matched_exception(self.exceptions['exact'], body, feedback)
|
1064
|
-
self.throw_broadly_matched_exception(self.exceptions['broad'], body, feedback)
|
1065
|
-
raise ExchangeError(feedback) # unknown message
|
1066
|
-
raise ExchangeError(self.id + ' ' + body)
|
1051
|
+
if response is None:
|
1052
|
+
return None # fallback to default error handler
|
1053
|
+
#
|
1054
|
+
# {"error":true,"errorMessage":"Api internal error","data":null}
|
1055
|
+
# {"error":true,"errorMessage":"Access denied.","data":null}
|
1056
|
+
#
|
1057
|
+
errorMessage = self.safe_string(response, 'errorMessage')
|
1058
|
+
if errorMessage is not None:
|
1059
|
+
feedback = self.id + ' ' + body
|
1060
|
+
self.throw_exactly_matched_exception(self.exceptions['exact'], errorMessage, feedback)
|
1061
|
+
self.throw_broadly_matched_exception(self.exceptions['broad'], errorMessage, feedback)
|
1062
|
+
raise ExchangeError(feedback) # unknown message
|
1067
1063
|
return None
|
ccxt/coinone.py
CHANGED
@@ -25,8 +25,7 @@ class coinone(Exchange, ImplicitAPI):
|
|
25
25
|
'id': 'coinone',
|
26
26
|
'name': 'CoinOne',
|
27
27
|
'countries': ['KR'], # Korea
|
28
|
-
|
29
|
-
'rateLimit': 667,
|
28
|
+
'rateLimit': 50,
|
30
29
|
'version': 'v2',
|
31
30
|
'pro': False,
|
32
31
|
'has': {
|
@@ -198,10 +197,10 @@ class coinone(Exchange, ImplicitAPI):
|
|
198
197
|
},
|
199
198
|
'precisionMode': TICK_SIZE,
|
200
199
|
'exceptions': {
|
201
|
-
'
|
202
|
-
'
|
203
|
-
'108': BadSymbol,
|
204
|
-
'
|
200
|
+
'104': OrderNotFound,
|
201
|
+
'107': BadRequest,
|
202
|
+
'108': BadSymbol,
|
203
|
+
'405': OnMaintenance,
|
205
204
|
},
|
206
205
|
'commonCurrencies': {
|
207
206
|
'SOC': 'Soda Coin',
|
@@ -1111,17 +1110,14 @@ class coinone(Exchange, ImplicitAPI):
|
|
1111
1110
|
|
1112
1111
|
def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
|
1113
1112
|
if response is None:
|
1114
|
-
return None
|
1115
|
-
|
1116
|
-
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1123
|
-
|
1124
|
-
raise ExchangeError(feedback)
|
1125
|
-
else:
|
1126
|
-
raise ExchangeError(self.id + ' ' + body)
|
1113
|
+
return None # fallback to default error handler
|
1114
|
+
#
|
1115
|
+
# {"result":"error","error_code":"107","error_msg":"Parameter value is wrong"}
|
1116
|
+
# {"result":"error","error_code":"108","error_msg":"Unknown CryptoCurrency"}
|
1117
|
+
#
|
1118
|
+
errorCode = self.safe_string(response, 'error_code')
|
1119
|
+
if errorCode is not None and errorCode != '0':
|
1120
|
+
feedback = self.id + ' ' + body
|
1121
|
+
self.throw_exactly_matched_exception(self.exceptions, errorCode, feedback)
|
1122
|
+
raise ExchangeError(feedback) # unknown message
|
1127
1123
|
return None
|