ccxt 4.4.40__py2.py3-none-any.whl → 4.4.42__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.
Files changed (173) hide show
  1. ccxt/__init__.py +1 -1
  2. ccxt/abstract/binance.py +3 -0
  3. ccxt/abstract/binancecoinm.py +3 -0
  4. ccxt/abstract/binanceus.py +3 -0
  5. ccxt/abstract/binanceusdm.py +3 -0
  6. ccxt/abstract/bitmart.py +2 -0
  7. ccxt/abstract/okx.py +5 -0
  8. ccxt/ace.py +1 -1
  9. ccxt/alpaca.py +0 -1
  10. ccxt/ascendex.py +0 -1
  11. ccxt/async_support/__init__.py +1 -1
  12. ccxt/async_support/ace.py +1 -1
  13. ccxt/async_support/alpaca.py +0 -1
  14. ccxt/async_support/ascendex.py +0 -1
  15. ccxt/async_support/base/exchange.py +24 -17
  16. ccxt/async_support/bigone.py +0 -1
  17. ccxt/async_support/binance.py +27 -24
  18. ccxt/async_support/bingx.py +5 -1
  19. ccxt/async_support/bitfinex.py +123 -1
  20. ccxt/async_support/bitget.py +1 -0
  21. ccxt/async_support/bitmart.py +243 -2
  22. ccxt/async_support/blofin.py +16 -7
  23. ccxt/async_support/bybit.py +8 -8
  24. ccxt/async_support/cex.py +1 -1
  25. ccxt/async_support/coinbase.py +8 -9
  26. ccxt/async_support/coinbaseexchange.py +5 -6
  27. ccxt/async_support/coinbaseinternational.py +7 -8
  28. ccxt/async_support/coincatch.py +0 -1
  29. ccxt/async_support/coincheck.py +0 -1
  30. ccxt/async_support/coinex.py +91 -6
  31. ccxt/async_support/coinlist.py +3 -4
  32. ccxt/async_support/coinmate.py +1 -3
  33. ccxt/async_support/coinmetro.py +4 -5
  34. ccxt/async_support/coinone.py +0 -1
  35. ccxt/async_support/coinsph.py +7 -8
  36. ccxt/async_support/cryptocom.py +3 -0
  37. ccxt/async_support/currencycom.py +3 -4
  38. ccxt/async_support/defx.py +6 -7
  39. ccxt/async_support/deribit.py +1 -3
  40. ccxt/async_support/digifinex.py +0 -1
  41. ccxt/async_support/ellipx.py +0 -2
  42. ccxt/async_support/exmo.py +61 -6
  43. ccxt/async_support/gate.py +2 -3
  44. ccxt/async_support/gemini.py +4 -5
  45. ccxt/async_support/hashkey.py +79 -67
  46. ccxt/async_support/hitbtc.py +47 -5
  47. ccxt/async_support/hollaex.py +4 -6
  48. ccxt/async_support/htx.py +2 -4
  49. ccxt/async_support/huobijp.py +0 -1
  50. ccxt/async_support/hyperliquid.py +60 -1
  51. ccxt/async_support/idex.py +8 -8
  52. ccxt/async_support/independentreserve.py +0 -1
  53. ccxt/async_support/indodax.py +0 -1
  54. ccxt/async_support/kraken.py +186 -28
  55. ccxt/async_support/krakenfutures.py +75 -3
  56. ccxt/async_support/kucoin.py +6 -4
  57. ccxt/async_support/kucoinfutures.py +10 -9
  58. ccxt/async_support/kuna.py +1 -3
  59. ccxt/async_support/latoken.py +1 -3
  60. ccxt/async_support/lbank.py +0 -1
  61. ccxt/async_support/luno.py +0 -1
  62. ccxt/async_support/lykke.py +0 -1
  63. ccxt/async_support/mercado.py +0 -1
  64. ccxt/async_support/mexc.py +6 -7
  65. ccxt/async_support/ndax.py +1 -1
  66. ccxt/async_support/novadax.py +4 -6
  67. ccxt/async_support/oceanex.py +0 -1
  68. ccxt/async_support/okcoin.py +1 -3
  69. ccxt/async_support/okx.py +7 -4
  70. ccxt/async_support/onetrading.py +1 -3
  71. ccxt/async_support/p2b.py +1 -1
  72. ccxt/async_support/paradex.py +5 -7
  73. ccxt/async_support/phemex.py +8 -10
  74. ccxt/async_support/poloniex.py +1 -3
  75. ccxt/async_support/poloniexfutures.py +6 -6
  76. ccxt/async_support/probit.py +0 -1
  77. ccxt/async_support/timex.py +0 -1
  78. ccxt/async_support/tokocrypto.py +11 -14
  79. ccxt/async_support/tradeogre.py +1 -1
  80. ccxt/async_support/upbit.py +0 -1
  81. ccxt/async_support/wavesexchange.py +4 -5
  82. ccxt/async_support/whitebit.py +8 -9
  83. ccxt/async_support/woo.py +98 -12
  84. ccxt/async_support/woofipro.py +96 -15
  85. ccxt/async_support/xt.py +6 -3
  86. ccxt/async_support/yobit.py +0 -1
  87. ccxt/async_support/zaif.py +0 -1
  88. ccxt/async_support/zonda.py +1 -2
  89. ccxt/base/exchange.py +39 -20
  90. ccxt/base/types.py +10 -0
  91. ccxt/bigone.py +0 -1
  92. ccxt/binance.py +27 -24
  93. ccxt/bingx.py +5 -1
  94. ccxt/bitfinex.py +123 -1
  95. ccxt/bitget.py +1 -0
  96. ccxt/bitmart.py +243 -2
  97. ccxt/blofin.py +16 -7
  98. ccxt/bybit.py +8 -8
  99. ccxt/cex.py +1 -1
  100. ccxt/coinbase.py +8 -9
  101. ccxt/coinbaseexchange.py +5 -6
  102. ccxt/coinbaseinternational.py +7 -8
  103. ccxt/coincatch.py +0 -1
  104. ccxt/coincheck.py +0 -1
  105. ccxt/coinex.py +91 -6
  106. ccxt/coinlist.py +3 -4
  107. ccxt/coinmate.py +1 -3
  108. ccxt/coinmetro.py +4 -5
  109. ccxt/coinone.py +0 -1
  110. ccxt/coinsph.py +7 -8
  111. ccxt/cryptocom.py +3 -0
  112. ccxt/currencycom.py +3 -4
  113. ccxt/defx.py +6 -7
  114. ccxt/deribit.py +1 -3
  115. ccxt/digifinex.py +0 -1
  116. ccxt/ellipx.py +0 -2
  117. ccxt/exmo.py +61 -6
  118. ccxt/gate.py +2 -3
  119. ccxt/gemini.py +4 -5
  120. ccxt/hashkey.py +79 -67
  121. ccxt/hitbtc.py +47 -5
  122. ccxt/hollaex.py +4 -6
  123. ccxt/htx.py +2 -4
  124. ccxt/huobijp.py +0 -1
  125. ccxt/hyperliquid.py +60 -1
  126. ccxt/idex.py +8 -8
  127. ccxt/independentreserve.py +0 -1
  128. ccxt/indodax.py +0 -1
  129. ccxt/kraken.py +186 -28
  130. ccxt/krakenfutures.py +75 -3
  131. ccxt/kucoin.py +6 -4
  132. ccxt/kucoinfutures.py +10 -9
  133. ccxt/kuna.py +1 -3
  134. ccxt/latoken.py +1 -3
  135. ccxt/lbank.py +0 -1
  136. ccxt/luno.py +0 -1
  137. ccxt/lykke.py +0 -1
  138. ccxt/mercado.py +0 -1
  139. ccxt/mexc.py +6 -7
  140. ccxt/ndax.py +1 -1
  141. ccxt/novadax.py +4 -6
  142. ccxt/oceanex.py +0 -1
  143. ccxt/okcoin.py +1 -3
  144. ccxt/okx.py +7 -4
  145. ccxt/onetrading.py +1 -3
  146. ccxt/p2b.py +1 -1
  147. ccxt/paradex.py +5 -7
  148. ccxt/phemex.py +8 -10
  149. ccxt/poloniex.py +1 -3
  150. ccxt/poloniexfutures.py +6 -6
  151. ccxt/pro/__init__.py +1 -1
  152. ccxt/probit.py +0 -1
  153. ccxt/timex.py +0 -1
  154. ccxt/tokocrypto.py +11 -14
  155. ccxt/tradeogre.py +1 -1
  156. ccxt/upbit.py +0 -1
  157. ccxt/wavesexchange.py +4 -5
  158. ccxt/whitebit.py +8 -9
  159. ccxt/woo.py +98 -12
  160. ccxt/woofipro.py +96 -15
  161. ccxt/xt.py +6 -3
  162. ccxt/yobit.py +0 -1
  163. ccxt/zaif.py +0 -1
  164. ccxt/zonda.py +1 -2
  165. {ccxt-4.4.40.dist-info → ccxt-4.4.42.dist-info}/METADATA +5 -5
  166. {ccxt-4.4.40.dist-info → ccxt-4.4.42.dist-info}/RECORD +169 -173
  167. ccxt/bitbay.py +0 -17
  168. ccxt/bitfinex2.py +0 -3624
  169. ccxt/hitbtc3.py +0 -16
  170. ccxt/pro/bitfinex2.py +0 -1086
  171. {ccxt-4.4.40.dist-info → ccxt-4.4.42.dist-info}/LICENSE.txt +0 -0
  172. {ccxt-4.4.40.dist-info → ccxt-4.4.42.dist-info}/WHEEL +0 -0
  173. {ccxt-4.4.40.dist-info → ccxt-4.4.42.dist-info}/top_level.txt +0 -0
@@ -1042,7 +1042,7 @@ class coinbaseexchange(Exchange, ImplicitAPI):
1042
1042
  side = self.safe_string(order, 'side')
1043
1043
  timeInForce = self.safe_string(order, 'time_in_force')
1044
1044
  postOnly = self.safe_value(order, 'post_only')
1045
- stopPrice = self.safe_number(order, 'stop_price')
1045
+ triggerPrice = self.safe_number(order, 'stop_price')
1046
1046
  clientOrderId = self.safe_string(order, 'client_oid')
1047
1047
  return self.safe_order({
1048
1048
  'id': id,
@@ -1058,8 +1058,7 @@ class coinbaseexchange(Exchange, ImplicitAPI):
1058
1058
  'postOnly': postOnly,
1059
1059
  'side': side,
1060
1060
  'price': price,
1061
- 'stopPrice': stopPrice,
1062
- 'triggerPrice': stopPrice,
1061
+ 'triggerPrice': triggerPrice,
1063
1062
  'cost': cost,
1064
1063
  'amount': amount,
1065
1064
  'filled': filled,
@@ -1224,9 +1223,9 @@ class coinbaseexchange(Exchange, ImplicitAPI):
1224
1223
  clientOrderId = self.safe_string_2(params, 'clientOrderId', 'client_oid')
1225
1224
  if clientOrderId is not None:
1226
1225
  request['client_oid'] = clientOrderId
1227
- stopPrice = self.safe_number_n(params, ['stopPrice', 'stop_price', 'triggerPrice'])
1228
- if stopPrice is not None:
1229
- request['stop_price'] = self.price_to_precision(symbol, stopPrice)
1226
+ triggerPrice = self.safe_number_n(params, ['stopPrice', 'stop_price', 'triggerPrice'])
1227
+ if triggerPrice is not None:
1228
+ request['stop_price'] = self.price_to_precision(symbol, triggerPrice)
1230
1229
  timeInForce = self.safe_string_2(params, 'timeInForce', 'time_in_force')
1231
1230
  if timeInForce is not None:
1232
1231
  request['time_in_force'] = timeInForce
@@ -1630,7 +1630,7 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1630
1630
  :param float amount: how much you want to trade in units of the base currency, quote currency for 'market' 'buy' orders
1631
1631
  :param float [price]: the price to fulfill the order, in units of the quote currency, ignored in market orders
1632
1632
  :param dict [params]: extra parameters specific to the exchange API endpoint
1633
- :param float [params.stopPrice]: price to trigger stop orders
1633
+ :param float [params.stopPrice]: alias for triggerPrice
1634
1634
  :param float [params.triggerPrice]: price to trigger stop orders
1635
1635
  :param float [params.stopLossPrice]: price to trigger stop-loss orders
1636
1636
  :param bool [params.postOnly]: True or False
@@ -1642,7 +1642,7 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1642
1642
  await self.load_markets()
1643
1643
  market = self.market(symbol)
1644
1644
  typeId = type.upper()
1645
- stopPrice = self.safe_number_n(params, ['triggerPrice', 'stopPrice', 'stop_price'])
1645
+ triggerPrice = self.safe_number_n(params, ['triggerPrice', 'stopPrice', 'stop_price'])
1646
1646
  clientOrderIdprefix = self.safe_string(self.options, 'brokerId', 'nfqkvdjp')
1647
1647
  clientOrderId = clientOrderIdprefix + '-' + self.uuid()
1648
1648
  clientOrderId = clientOrderId[0:17]
@@ -1652,12 +1652,12 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1652
1652
  'instrument': market['id'],
1653
1653
  'size': self.amount_to_precision(market['symbol'], amount),
1654
1654
  }
1655
- if stopPrice is not None:
1655
+ if triggerPrice is not None:
1656
1656
  if type == 'limit':
1657
1657
  typeId = 'STOP_LIMIT'
1658
1658
  else:
1659
1659
  typeId = 'STOP'
1660
- request['stop_price'] = stopPrice
1660
+ request['stop_price'] = triggerPrice
1661
1661
  request['type'] = typeId
1662
1662
  if type == 'limit':
1663
1663
  if price is None:
@@ -1751,7 +1751,6 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1751
1751
  'postOnly': None,
1752
1752
  'side': self.safe_string_lower(order, 'side'),
1753
1753
  'price': self.safe_string(order, 'price'),
1754
- 'stopPrice': self.safe_string(order, 'stop_price'),
1755
1754
  'triggerPrice': self.safe_string(order, 'stop_price'),
1756
1755
  'amount': self.safe_string(order, 'size'),
1757
1756
  'filled': self.safe_string(order, 'exec_qty'),
@@ -1885,9 +1884,9 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1885
1884
  request['size'] = self.amount_to_precision(symbol, amount)
1886
1885
  if price is not None:
1887
1886
  request['price'] = self.price_to_precision(symbol, price)
1888
- stopPrice = self.safe_number_n(params, ['stopPrice', 'stop_price', 'triggerPrice'])
1889
- if stopPrice is not None:
1890
- request['stop_price'] = stopPrice
1887
+ triggerPrice = self.safe_number_n(params, ['stopPrice', 'stop_price', 'triggerPrice'])
1888
+ if triggerPrice is not None:
1889
+ request['stop_price'] = triggerPrice
1891
1890
  clientOrderId = self.safe_string_2(params, 'client_order_id', 'clientOrderId')
1892
1891
  if clientOrderId is None:
1893
1892
  raise BadRequest(self.id + ' editOrder() requires a clientOrderId parameter')
@@ -3907,7 +3907,6 @@ class coincatch(Exchange, ImplicitAPI):
3907
3907
  'amount': amount,
3908
3908
  'filled': self.safe_string_2(order, 'fillQuantity', 'filledQty'),
3909
3909
  'remaining': None,
3910
- 'stopPrice': None,
3911
3910
  'triggerPrice': triggerPrice,
3912
3911
  'takeProfitPrice': takeProfitPrice,
3913
3912
  'stopLossPrice': stopLossPrice,
@@ -267,7 +267,6 @@ class coincheck(Exchange, ImplicitAPI):
267
267
  'status': status,
268
268
  'symbol': symbol,
269
269
  'price': price,
270
- 'stopPrice': None,
271
270
  'triggerPrice': None,
272
271
  'cost': None,
273
272
  'fee': None,
@@ -514,6 +514,92 @@ class coinex(Exchange, ImplicitAPI):
514
514
  # CSC, AE, BASE, AIPG, AKASH, POLKADOTASSETHUB ?, ALEO, STX, ALGO, ALPH, BLAST, AR, ARCH, ARDR, ARK, ARRR, MANTA, NTRN, LUNA, AURORA, AVAIL, ASC20, AVA, AYA, AZERO, BAN, BAND, BB, RUNES, BEAM, BELLSCOIN, BITCI, NEAR, AGORIC, BLOCX, BNC, BOBA, BRISE, KRC20, CANTO, CAPS, CCD, CELO, CFX, CHI, CKB, CLORE, CLV, CORE, CSPR, CTXC, DAG, DCR, DERO, DESO, DEFI, DGB, DNX, DOCK, DOGECHAIN, DYDX, DYMENSION, EGLD, ELA, ELF, ENJIN, EOSIO, ERG, ETN_SC, EVMOS, EWC, SGB, FACT, FB, FET, FIO, FIRO, NEO3, FLOW, FLARE, FLUX, LINEA, FREN, FSN, FB_BRC20, GLMR, GRIN, GRS, HACASH, HBAR, HERB, HIVE, MAPO, HMND, HNS, ZKSYNC, HTR, HUAHUA, MERLIN, ICP, ICX, INJ, IOST, IOTA, IOTX, IRIS, IRON, ONE, JOYSTREAM, KAI, KAR, KAS, KAVA, KCN, KDA, KLAY, KLY, KMD, KSM, KUB, KUJIRA, LAT, LBC, LUNC, LUKSO, MARS, METIS, MINA, MANTLE, MOB, MODE, MONA, MOVR, MTL, NEOX, NEXA, NIBI, NIMIQ, NMC, ONOMY, NRG, WAVES, NULS, OAS, OCTA, OLT, ONT, OORT, ORAI, OSMO, P3D, COMPOSABLE, PIVX, RON, POKT, POLYMESH, PRE_MARKET, PYI, QKC, QTUM, QUBIC, RSK, ROSE, ROUTE, RTM, THORCHAIN, RVN, RADIANT, SAGA, SALVIUM, SATOX, SC, SCP, _NULL, SCRT, SDN, RGBPP, SELF, SMH, SPACE, STARGAZE, STC, STEEM, STRATISEVM, STRD, STARKNET, SXP, SYS, TAIKO, TAO, TARA, TENET, THETA, TT, VENOM, VECHAIN, TOMO, VITE, VLX, VSYS, VTC, WAN, WAXP, WEMIX, XCH, XDC, XEC, XELIS, NEM, XHV, XLM, XNA, NANO, XPLA, XPR, XPRT, XRD, XTZ, XVG, XYM, ZANO, ZEC, ZEN, ZEPH, ZETA
515
515
  },
516
516
  },
517
+ 'features': {
518
+ 'spot': {
519
+ 'sandbox': False,
520
+ 'createOrder': {
521
+ 'marginMode': True,
522
+ 'triggerPrice': True,
523
+ 'triggerPriceType': None,
524
+ 'triggerDirection': False,
525
+ 'stopLossPrice': False, # todo
526
+ 'takeProfitPrice': False, # todo
527
+ 'attachedStopLossTakeProfit': None,
528
+ 'timeInForce': {
529
+ 'IOC': True,
530
+ 'FOK': True,
531
+ 'PO': True,
532
+ 'GTD': False,
533
+ },
534
+ 'hedged': False,
535
+ 'trailing': False,
536
+ # exchange-supported features
537
+ # 'marketBuyRequiresPrice': True,
538
+ # 'marketBuyByCost': True,
539
+ # 'selfTradePrevention': True,
540
+ # 'iceberg': True,
541
+ },
542
+ 'createOrders': {
543
+ 'max': 5,
544
+ },
545
+ 'fetchMyTrades': {
546
+ 'marginMode': True,
547
+ 'limit': 1000,
548
+ 'daysBack': None,
549
+ 'untilDays': 100000,
550
+ },
551
+ 'fetchOrder': {
552
+ 'marginMode': False,
553
+ 'trigger': False,
554
+ 'trailing': False,
555
+ },
556
+ 'fetchOpenOrders': {
557
+ 'marginMode': True,
558
+ 'limit': 1000,
559
+ 'trigger': True,
560
+ 'trailing': False,
561
+ },
562
+ 'fetchOrders': None,
563
+ 'fetchClosedOrders': {
564
+ 'marginMode': True,
565
+ 'limit': 1000,
566
+ 'daysBackClosed': None,
567
+ 'daysBackCanceled': None,
568
+ 'untilDays': None,
569
+ 'trigger': True,
570
+ 'trailing': False,
571
+ },
572
+ 'fetchOHLCV': {
573
+ 'limit': 1000,
574
+ },
575
+ },
576
+ 'forDerivatives': {
577
+ 'extends': 'spot',
578
+ 'createOrder': {
579
+ 'marginMode': True,
580
+ 'stopLossPrice': True,
581
+ 'takeProfitPrice': True,
582
+ },
583
+ 'fetchOpenOrders': {
584
+ 'marginMode': False,
585
+ },
586
+ 'fetchClosedOrders': {
587
+ 'marginMode': False,
588
+ },
589
+ },
590
+ 'swap': {
591
+ 'linear': {
592
+ 'extends': 'forDerivatives',
593
+ },
594
+ 'inverse': {
595
+ 'extends': 'forDerivatives',
596
+ },
597
+ },
598
+ 'future': {
599
+ 'linear': None,
600
+ 'inverse': None,
601
+ },
602
+ },
517
603
  'commonCurrencies': {
518
604
  'ACM': 'Actinium',
519
605
  },
@@ -1978,7 +2064,6 @@ class coinex(Exchange, ImplicitAPI):
1978
2064
  'reduceOnly': None,
1979
2065
  'side': side,
1980
2066
  'price': self.safe_string(order, 'price'),
1981
- 'stopPrice': self.safe_string(order, 'trigger_price'),
1982
2067
  'triggerPrice': self.safe_string(order, 'trigger_price'),
1983
2068
  'takeProfitPrice': self.safe_number(order, 'take_profit_price'),
1984
2069
  'stopLossPrice': self.safe_number(order, 'stop_loss_price'),
@@ -2018,7 +2103,7 @@ class coinex(Exchange, ImplicitAPI):
2018
2103
  market = self.market(symbol)
2019
2104
  swap = market['swap']
2020
2105
  clientOrderId = self.safe_string_2(params, 'client_id', 'clientOrderId')
2021
- stopPrice = self.safe_string_2(params, 'stopPrice', 'triggerPrice')
2106
+ triggerPrice = self.safe_string_2(params, 'stopPrice', 'triggerPrice')
2022
2107
  stopLossPrice = self.safe_string(params, 'stopLossPrice')
2023
2108
  takeProfitPrice = self.safe_string(params, 'takeProfitPrice')
2024
2109
  option = self.safe_string(params, 'option')
@@ -2063,8 +2148,8 @@ class coinex(Exchange, ImplicitAPI):
2063
2148
  request['take_profit_type'] = self.safe_string(params, 'stop_type', 'latest_price')
2064
2149
  else:
2065
2150
  request['amount'] = self.amount_to_precision(symbol, amount)
2066
- if stopPrice is not None:
2067
- request['trigger_price'] = self.price_to_precision(symbol, stopPrice)
2151
+ if triggerPrice is not None:
2152
+ request['trigger_price'] = self.price_to_precision(symbol, triggerPrice)
2068
2153
  request['trigger_price_type'] = self.safe_string(params, 'stop_type', 'latest_price')
2069
2154
  else:
2070
2155
  marginMode = None
@@ -2091,8 +2176,8 @@ class coinex(Exchange, ImplicitAPI):
2091
2176
  request['amount'] = self.cost_to_precision(symbol, amount)
2092
2177
  else:
2093
2178
  request['amount'] = self.amount_to_precision(symbol, amount)
2094
- if stopPrice is not None:
2095
- request['trigger_price'] = self.price_to_precision(symbol, stopPrice)
2179
+ if triggerPrice is not None:
2180
+ request['trigger_price'] = self.price_to_precision(symbol, triggerPrice)
2096
2181
  params = self.omit(params, ['reduceOnly', 'timeInForce', 'postOnly', 'stopPrice', 'triggerPrice', 'stopLossPrice', 'takeProfitPrice'])
2097
2182
  return self.extend(request, params)
2098
2183
 
@@ -1504,7 +1504,7 @@ class coinlist(Exchange, ImplicitAPI):
1504
1504
  elif type == 'limit':
1505
1505
  request['type'] = 'stop_limit'
1506
1506
  elif (type == 'stop_market') or (type == 'stop_limit') or (type == 'take_market') or (type == 'take_limit'):
1507
- raise ArgumentsRequired(self.id + ' createOrder() requires a stopPrice parameter for stop-loss and take-profit orders')
1507
+ raise ArgumentsRequired(self.id + ' createOrder() requires a triggerPrice parameter for stop-loss and take-profit orders')
1508
1508
  clientOrderId = self.safe_string_2(params, 'clientOrderId', 'client_id')
1509
1509
  if clientOrderId is not None:
1510
1510
  request['client_id'] = clientOrderId
@@ -1643,7 +1643,7 @@ class coinlist(Exchange, ImplicitAPI):
1643
1643
  type = self.parse_order_type(self.safe_string(order, 'type'))
1644
1644
  side = self.safe_string(order, 'side')
1645
1645
  price = self.safe_string(order, 'price')
1646
- stopPrice = self.safe_string(order, 'stop_price')
1646
+ triggerPrice = self.safe_string(order, 'stop_price')
1647
1647
  average = self.safe_string(order, 'average_fill_price') # from documentation
1648
1648
  amount = self.safe_string(order, 'size')
1649
1649
  filled = self.safe_string(order, 'size_filled')
@@ -1668,8 +1668,7 @@ class coinlist(Exchange, ImplicitAPI):
1668
1668
  'timeInForce': 'GTC',
1669
1669
  'side': side,
1670
1670
  'price': price,
1671
- 'stopPrice': stopPrice,
1672
- 'triggerPrice': stopPrice,
1671
+ 'triggerPrice': triggerPrice,
1673
1672
  'average': average,
1674
1673
  'amount': amount,
1675
1674
  'cost': None,
@@ -938,7 +938,6 @@ class coinmate(Exchange, ImplicitAPI):
938
938
  marketId = self.safe_string(order, 'currencyPair')
939
939
  symbol = self.safe_symbol(marketId, market, '_')
940
940
  clientOrderId = self.safe_string(order, 'clientOrderId')
941
- stopPrice = self.safe_number(order, 'stopPrice')
942
941
  return self.safe_order({
943
942
  'id': id,
944
943
  'clientOrderId': clientOrderId,
@@ -951,8 +950,7 @@ class coinmate(Exchange, ImplicitAPI):
951
950
  'postOnly': None,
952
951
  'side': side,
953
952
  'price': priceString,
954
- 'stopPrice': stopPrice,
955
- 'triggerPrice': stopPrice,
953
+ 'triggerPrice': self.safe_number(order, 'stopPrice'),
956
954
  'amount': amountString,
957
955
  'cost': None,
958
956
  'average': averageString,
@@ -1202,10 +1202,10 @@ class coinmetro(Exchange, ImplicitAPI):
1202
1202
  if timeInForce is not None:
1203
1203
  params = self.omit(params, 'timeInForce')
1204
1204
  request['timeInForce'] = self.encode_order_time_in_force(timeInForce)
1205
- stopPrice = self.safe_string_2(params, 'triggerPrice', 'stopPrice')
1206
- if stopPrice is not None:
1205
+ triggerPrice = self.safe_string_2(params, 'triggerPrice', 'stopPrice')
1206
+ if triggerPrice is not None:
1207
1207
  params = self.omit(params, ['triggerPrice'])
1208
- request['stopPrice'] = self.price_to_precision(symbol, stopPrice)
1208
+ request['stopPrice'] = self.price_to_precision(symbol, triggerPrice)
1209
1209
  userData = self.safe_value(params, 'userData', {})
1210
1210
  comment = self.safe_string_2(params, 'clientOrderId', 'comment')
1211
1211
  if comment is not None:
@@ -1706,7 +1706,6 @@ class coinmetro(Exchange, ImplicitAPI):
1706
1706
  }
1707
1707
  trades = self.safe_value(order, 'fills', [])
1708
1708
  userData = self.safe_value(order, 'userData', {})
1709
- triggerPrice = self.safe_string(order, 'stopPrice')
1710
1709
  clientOrderId = self.safe_string(userData, 'comment')
1711
1710
  takeProfitPrice = self.safe_string(userData, 'takeProfit')
1712
1711
  stopLossPrice = self.safe_string(userData, 'stopLoss')
@@ -1722,7 +1721,7 @@ class coinmetro(Exchange, ImplicitAPI):
1722
1721
  'timeInForce': self.parse_order_time_in_force(self.safe_integer(order, 'timeInForce')),
1723
1722
  'side': side,
1724
1723
  'price': price,
1725
- 'triggerPrice': triggerPrice,
1724
+ 'triggerPrice': self.safe_string(order, 'stopPrice'),
1726
1725
  'takeProfitPrice': takeProfitPrice,
1727
1726
  'stopLossPrice': stopLossPrice,
1728
1727
  'average': None,
@@ -915,7 +915,6 @@ class coinone(Exchange, ImplicitAPI):
915
915
  'postOnly': None,
916
916
  'side': side,
917
917
  'price': self.safe_string(order, 'price'),
918
- 'stopPrice': None,
919
918
  'triggerPrice': None,
920
919
  'cost': None,
921
920
  'average': self.safe_string(order, 'averageExecutedPrice'),
@@ -1146,10 +1146,10 @@ class coinsph(Exchange, ImplicitAPI):
1146
1146
  quoteAmount = self.cost_to_precision(symbol, amount)
1147
1147
  request['quoteOrderQty'] = quoteAmount
1148
1148
  if orderType == 'STOP_LOSS' or orderType == 'STOP_LOSS_LIMIT' or orderType == 'TAKE_PROFIT' or orderType == 'TAKE_PROFIT_LIMIT':
1149
- stopPrice = self.safe_string_2(params, 'triggerPrice', 'stopPrice')
1150
- if stopPrice is None:
1149
+ triggerPrice = self.safe_string_2(params, 'triggerPrice', 'stopPrice')
1150
+ if triggerPrice is None:
1151
1151
  raise InvalidOrder(self.id + ' createOrder() requires a triggerPrice or stopPrice param for stop_loss, take_profit, stop_loss_limit, and take_profit_limit orders')
1152
- request['stopPrice'] = self.price_to_precision(symbol, stopPrice)
1152
+ request['stopPrice'] = self.price_to_precision(symbol, triggerPrice)
1153
1153
  request['newOrderRespType'] = newOrderRespType
1154
1154
  params = self.omit(params, 'price', 'stopPrice', 'triggerPrice', 'quantity', 'quoteOrderQty')
1155
1155
  response = None
@@ -1374,9 +1374,9 @@ class coinsph(Exchange, ImplicitAPI):
1374
1374
  market = self.safe_market(marketId, market)
1375
1375
  timestamp = self.safe_integer_2(order, 'time', 'transactTime')
1376
1376
  trades = self.safe_value(order, 'fills', None)
1377
- stopPrice = self.safe_string(order, 'stopPrice')
1378
- if Precise.string_eq(stopPrice, '0'):
1379
- stopPrice = None
1377
+ triggerPrice = self.safe_string(order, 'stopPrice')
1378
+ if Precise.string_eq(triggerPrice, '0'):
1379
+ triggerPrice = None
1380
1380
  return self.safe_order({
1381
1381
  'id': id,
1382
1382
  'clientOrderId': self.safe_string(order, 'clientOrderId'),
@@ -1389,8 +1389,7 @@ class coinsph(Exchange, ImplicitAPI):
1389
1389
  'timeInForce': self.parse_order_time_in_force(self.safe_string(order, 'timeInForce')),
1390
1390
  'side': self.parse_order_side(self.safe_string(order, 'side')),
1391
1391
  'price': self.safe_string(order, 'price'),
1392
- 'stopPrice': stopPrice,
1393
- 'triggerPrice': stopPrice,
1392
+ 'triggerPrice': triggerPrice,
1394
1393
  'average': None,
1395
1394
  'amount': self.safe_string(order, 'origQty'),
1396
1395
  'cost': self.safe_string(order, 'cummulativeQuoteQty'),
@@ -507,6 +507,9 @@ class cryptocom(Exchange, ImplicitAPI):
507
507
  '40801': RequestTimeout,
508
508
  '42901': RateLimitExceeded,
509
509
  '43005': InvalidOrder, # Rejected POST_ONLY create-order request(normally happened when exec_inst contains POST_ONLY but time_in_force is NOT GOOD_TILL_CANCEL)
510
+ '43003': InvalidOrder, # FOK order has not been filled and cancelled
511
+ '43004': InvalidOrder, # IOC order has not been filled and cancelled
512
+ '43012': BadRequest, # Canceled due to Self Trade Prevention
510
513
  '50001': ExchangeError,
511
514
  '9010001': OnMaintenance, # {"code":9010001,"message":"SYSTEM_MAINTENANCE","details":"Crypto.com Exchange is currently under maintenance. Please refer to https://status.crypto.com for more details."}
512
515
  },
@@ -1198,7 +1198,6 @@ class currencycom(Exchange, ImplicitAPI):
1198
1198
  'timeInForce': timeInForce,
1199
1199
  'side': side,
1200
1200
  'price': price,
1201
- 'stopPrice': None,
1202
1201
  'triggerPrice': None,
1203
1202
  'amount': amount,
1204
1203
  'cost': None,
@@ -1296,11 +1295,11 @@ class currencycom(Exchange, ImplicitAPI):
1296
1295
  request['type'] = 'STOP'
1297
1296
  request['price'] = self.price_to_precision(symbol, price)
1298
1297
  elif type == 'market':
1299
- stopPrice = self.safe_value_2(params, 'triggerPrice', 'stopPrice')
1298
+ triggerPrice = self.safe_value_2(params, 'triggerPrice', 'stopPrice')
1300
1299
  params = self.omit(params, ['triggerPrice', 'stopPrice'])
1301
- if stopPrice is not None:
1300
+ if triggerPrice is not None:
1302
1301
  request['type'] = 'STOP'
1303
- request['price'] = self.price_to_precision(symbol, stopPrice)
1302
+ request['price'] = self.price_to_precision(symbol, triggerPrice)
1304
1303
  response = await self.privatePostV2Order(self.extend(request, params))
1305
1304
  #
1306
1305
  # limit
@@ -1157,7 +1157,7 @@ class defx(Exchange, ImplicitAPI):
1157
1157
  'type': orderType,
1158
1158
  }
1159
1159
  takeProfitPrice = self.safe_string(params, 'takeProfitPrice')
1160
- stopPrice = self.safe_string_2(params, 'stopPrice', 'triggerPrice')
1160
+ triggerPrice = self.safe_string_2(params, 'stopPrice', 'triggerPrice')
1161
1161
  isMarket = orderType == 'MARKET'
1162
1162
  isLimit = orderType == 'LIMIT'
1163
1163
  timeInForce = self.safe_string_upper(params, 'timeInForce')
@@ -1172,7 +1172,7 @@ class defx(Exchange, ImplicitAPI):
1172
1172
  clientOrderId = self.safe_string(params, 'clientOrderId')
1173
1173
  if clientOrderId is not None:
1174
1174
  request['newClientOrderId'] = clientOrderId
1175
- if stopPrice is not None or takeProfitPrice is not None:
1175
+ if triggerPrice is not None or takeProfitPrice is not None:
1176
1176
  request['workingType'] = 'MARK_PRICE'
1177
1177
  if takeProfitPrice is not None:
1178
1178
  request['stopPrice'] = self.price_to_precision(symbol, takeProfitPrice)
@@ -1181,7 +1181,7 @@ class defx(Exchange, ImplicitAPI):
1181
1181
  else:
1182
1182
  request['type'] = 'TAKE_PROFIT_LIMIT'
1183
1183
  else:
1184
- request['stopPrice'] = self.price_to_precision(symbol, stopPrice)
1184
+ request['stopPrice'] = self.price_to_precision(symbol, triggerPrice)
1185
1185
  if isMarket:
1186
1186
  request['type'] = 'STOP_MARKET'
1187
1187
  else:
@@ -1268,12 +1268,12 @@ class defx(Exchange, ImplicitAPI):
1268
1268
  average = self.omit_zero(self.safe_string(order, 'avgPrice'))
1269
1269
  timeInForce = self.safe_string_lower(order, 'timeInForce')
1270
1270
  takeProfitPrice: Str = None
1271
- stopPrice: Str = None
1271
+ triggerPrice: Str = None
1272
1272
  if orderType is not None:
1273
1273
  if orderType.find('take_profit') >= 0:
1274
1274
  takeProfitPrice = self.safe_string(order, 'stopPrice')
1275
1275
  else:
1276
- stopPrice = self.safe_string(order, 'stopPrice')
1276
+ triggerPrice = self.safe_string(order, 'stopPrice')
1277
1277
  timestamp = self.parse8601(self.safe_string(order, 'createdAt'))
1278
1278
  lastTradeTimestamp = self.parse8601(self.safe_string(order, 'updatedAt'))
1279
1279
  return self.safe_order({
@@ -1291,8 +1291,7 @@ class defx(Exchange, ImplicitAPI):
1291
1291
  'reduceOnly': self.safe_bool(order, 'reduceOnly'),
1292
1292
  'side': side,
1293
1293
  'price': price,
1294
- 'stopPrice': stopPrice,
1295
- 'triggerPrice': stopPrice,
1294
+ 'triggerPrice': triggerPrice,
1296
1295
  'takeProfitPrice': takeProfitPrice,
1297
1296
  'stopLossPrice': None,
1298
1297
  'average': average,
@@ -1767,7 +1767,6 @@ class deribit(Exchange, ImplicitAPI):
1767
1767
  # injected in createOrder
1768
1768
  trades = self.safe_value(order, 'trades')
1769
1769
  timeInForce = self.parse_time_in_force(self.safe_string(order, 'time_in_force'))
1770
- stopPrice = self.safe_value(order, 'stop_price')
1771
1770
  postOnly = self.safe_value(order, 'post_only')
1772
1771
  return self.safe_order({
1773
1772
  'info': order,
@@ -1782,8 +1781,7 @@ class deribit(Exchange, ImplicitAPI):
1782
1781
  'postOnly': postOnly,
1783
1782
  'side': side,
1784
1783
  'price': priceString,
1785
- 'stopPrice': stopPrice,
1786
- 'triggerPrice': stopPrice,
1784
+ 'triggerPrice': self.safe_value(order, 'stop_price'),
1787
1785
  'amount': amount,
1788
1786
  'cost': cost,
1789
1787
  'average': averageString,
@@ -2025,7 +2025,6 @@ class digifinex(Exchange, ImplicitAPI):
2025
2025
  'postOnly': None,
2026
2026
  'side': side,
2027
2027
  'price': self.safe_number(order, 'price'),
2028
- 'stopPrice': None,
2029
2028
  'triggerPrice': None,
2030
2029
  'amount': self.safe_number_2(order, 'amount', 'size'),
2031
2030
  'filled': self.safe_number_2(order, 'executed_amount', 'filled_qty'),
@@ -1264,7 +1264,6 @@ class ellipx(Exchange, ImplicitAPI):
1264
1264
  'postOnly': postOnly,
1265
1265
  'side': side,
1266
1266
  'price': price,
1267
- 'stopPrice': None,
1268
1267
  'triggerPrice': None,
1269
1268
  'average': None,
1270
1269
  'cost': cost,
@@ -1323,7 +1322,6 @@ class ellipx(Exchange, ImplicitAPI):
1323
1322
  'postOnly': None,
1324
1323
  'side': None,
1325
1324
  'price': None,
1326
- 'stopPrice': None,
1327
1325
  'triggerPrice': None,
1328
1326
  'average': None,
1329
1327
  'cost': None,
@@ -43,6 +43,9 @@ class exmo(Exchange, ImplicitAPI):
43
43
  'cancelOrder': True,
44
44
  'cancelOrders': False,
45
45
  'createDepositAddress': False,
46
+ 'createMarketBuyOrder': True,
47
+ 'createMarketBuyOrderWithCost': True,
48
+ 'createMarketOrderWithCost': True,
46
49
  'createOrder': True,
47
50
  'createStopLimitOrder': True,
48
51
  'createStopMarketOrder': True,
@@ -1352,6 +1355,52 @@ class exmo(Exchange, ImplicitAPI):
1352
1355
  result = self.array_concat(result, trades)
1353
1356
  return self.filter_by_since_limit(result, since, limit)
1354
1357
 
1358
+ async def create_market_order_with_cost(self, symbol: str, side: OrderSide, cost: float, params={}):
1359
+ """
1360
+ create a market order by providing the symbol, side and cost
1361
+
1362
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
1363
+
1364
+ :param str symbol: unified symbol of the market to create an order in
1365
+ :param str side: 'buy' or 'sell'
1366
+ :param float cost: how much you want to trade in units of the quote currency
1367
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1368
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1369
+ """
1370
+ await self.load_markets()
1371
+ params = self.extend(params, {'cost': cost})
1372
+ return await self.create_order(symbol, 'market', side, cost, None, params)
1373
+
1374
+ async def create_market_buy_order_with_cost(self, symbol: str, cost: float, params={}):
1375
+ """
1376
+ create a market buy order by providing the symbol and cost
1377
+
1378
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
1379
+
1380
+ :param str symbol: unified symbol of the market to create an order in
1381
+ :param float cost: how much you want to trade in units of the quote currency
1382
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1383
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1384
+ """
1385
+ await self.load_markets()
1386
+ params = self.extend(params, {'cost': cost})
1387
+ return await self.create_order(symbol, 'market', 'buy', cost, None, params)
1388
+
1389
+ async def create_market_sell_order_with_cost(self, symbol: str, cost: float, params={}):
1390
+ """
1391
+ create a market sell order by providing the symbol and cost
1392
+
1393
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
1394
+
1395
+ :param str symbol: unified symbol of the market to create an order in
1396
+ :param float cost: how much you want to trade in units of the quote currency
1397
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1398
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1399
+ """
1400
+ await self.load_markets()
1401
+ params = self.extend(params, {'cost': cost})
1402
+ return await self.create_order(symbol, 'market', 'sell', cost, None, params)
1403
+
1355
1404
  async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1356
1405
  """
1357
1406
  create a trade order
@@ -1366,9 +1415,10 @@ class exmo(Exchange, ImplicitAPI):
1366
1415
  :param float amount: how much of currency you want to trade in units of base currency
1367
1416
  :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1368
1417
  :param dict [params]: extra parameters specific to the exchange API endpoint
1369
- :param float [params.stopPrice]: the price at which a trigger order is triggered at
1418
+ :param float [params.triggerPrice]: the price at which a trigger order is triggered at
1370
1419
  :param str [params.timeInForce]: *spot only* 'fok', 'ioc' or 'post_only'
1371
1420
  :param boolean [params.postOnly]: *spot only* True for post only orders
1421
+ :param float [params.cost]: *spot only* *market orders only* the cost of the order in the quote currency for market orders
1372
1422
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1373
1423
  """
1374
1424
  await self.load_markets()
@@ -1379,11 +1429,12 @@ class exmo(Exchange, ImplicitAPI):
1379
1429
  if marginMode == 'cross':
1380
1430
  raise BadRequest(self.id + ' only supports isolated margin')
1381
1431
  isSpot = (marginMode != 'isolated')
1382
- triggerPrice = self.safe_number_n(params, ['triggerPrice', 'stopPrice', 'stop_price'])
1432
+ triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stopPrice', 'stop_price'])
1433
+ cost = self.safe_string(params, 'cost')
1383
1434
  request: dict = {
1384
1435
  'pair': market['id'],
1385
1436
  # 'leverage': 2,
1386
- 'quantity': self.amount_to_precision(market['symbol'], amount),
1437
+ # 'quantity': self.amount_to_precision(market['symbol'], amount),
1387
1438
  # spot - buy, sell, market_buy, market_sell, market_buy_total, market_sell_total
1388
1439
  # margin - limit_buy, limit_sell, market_buy, market_sell, stop_buy, stop_sell, stop_limit_buy, stop_limit_sell, trailing_stop_buy, trailing_stop_sell
1389
1440
  # 'stop_price': self.price_to_precision(symbol, stopPrice),
@@ -1392,6 +1443,10 @@ class exmo(Exchange, ImplicitAPI):
1392
1443
  # 'client_id': 123, # optional, must be a positive integer
1393
1444
  # 'comment': '', # up to 50 latin symbols, whitespaces, underscores
1394
1445
  }
1446
+ if cost is None:
1447
+ request['quantity'] = self.amount_to_precision(market['symbol'], amount)
1448
+ else:
1449
+ request['quantity'] = self.cost_to_precision(market['symbol'], cost)
1395
1450
  clientOrderId = self.safe_value_2(params, 'client_id', 'clientOrderId')
1396
1451
  if clientOrderId is not None:
1397
1452
  clientOrderId = self.safe_integer_2(params, 'client_id', 'clientOrderId')
@@ -1402,7 +1457,7 @@ class exmo(Exchange, ImplicitAPI):
1402
1457
  leverage = self.safe_number(params, 'leverage')
1403
1458
  if not isSpot and (leverage is None):
1404
1459
  raise ArgumentsRequired(self.id + ' createOrder requires an extra param params["leverage"] for margin orders')
1405
- params = self.omit(params, ['stopPrice', 'stop_price', 'triggerPrice', 'timeInForce', 'client_id', 'clientOrderId'])
1460
+ params = self.omit(params, ['stopPrice', 'stop_price', 'triggerPrice', 'timeInForce', 'client_id', 'clientOrderId', 'cost'])
1406
1461
  if price is not None:
1407
1462
  request['price'] = self.price_to_precision(market['symbol'], price)
1408
1463
  response = None
@@ -1423,7 +1478,8 @@ class exmo(Exchange, ImplicitAPI):
1423
1478
  if type == 'limit':
1424
1479
  request['type'] = side
1425
1480
  elif type == 'market':
1426
- request['type'] = 'market_' + side
1481
+ marketSuffix = '_total' if (cost is not None) else ''
1482
+ request['type'] = 'market_' + side + marketSuffix
1427
1483
  if isPostOnly:
1428
1484
  request['exec_type'] = 'post_only'
1429
1485
  elif timeInForce is not None:
@@ -1848,7 +1904,6 @@ class exmo(Exchange, ImplicitAPI):
1848
1904
  'postOnly': None,
1849
1905
  'side': side,
1850
1906
  'price': price,
1851
- 'stopPrice': triggerPrice,
1852
1907
  'triggerPrice': triggerPrice,
1853
1908
  'cost': cost,
1854
1909
  'amount': amount,