ccxt-ir 4.3.46.0.2__py2.py3-none-any.whl → 4.5.0__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 (528) hide show
  1. ccxt/__init__.py +39 -35
  2. ccxt/abantether.py +9 -9
  3. ccxt/abstract/alpaca.py +4 -0
  4. ccxt/abstract/apex.py +31 -0
  5. ccxt/abstract/bigone.py +1 -1
  6. ccxt/abstract/binance.py +106 -48
  7. ccxt/abstract/binancecoinm.py +106 -48
  8. ccxt/abstract/binanceus.py +141 -83
  9. ccxt/abstract/binanceusdm.py +106 -48
  10. ccxt/abstract/bingx.py +50 -1
  11. ccxt/abstract/bitbank.py +5 -0
  12. ccxt/abstract/bitfinex.py +136 -65
  13. ccxt/abstract/bitflyer.py +1 -0
  14. ccxt/abstract/bitget.py +67 -0
  15. ccxt/abstract/bitmart.py +19 -1
  16. ccxt/abstract/bitopro.py +1 -0
  17. ccxt/abstract/bitrue.py +68 -68
  18. ccxt/abstract/bitstamp.py +1 -0
  19. ccxt/abstract/blofin.py +30 -0
  20. ccxt/abstract/btcbox.py +2 -0
  21. ccxt/abstract/bybit.py +28 -13
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbaseexchange.py +1 -0
  24. ccxt/abstract/coinbaseinternational.py +1 -1
  25. ccxt/abstract/cryptocom.py +16 -0
  26. ccxt/abstract/cryptomus.py +20 -0
  27. ccxt/abstract/defx.py +69 -0
  28. ccxt/abstract/deribit.py +1 -0
  29. ccxt/abstract/derive.py +117 -0
  30. ccxt/abstract/digifinex.py +1 -0
  31. ccxt/abstract/ellipx.py +25 -0
  32. ccxt/abstract/foxbit.py +26 -0
  33. ccxt/abstract/gate.py +19 -0
  34. ccxt/abstract/gateio.py +19 -0
  35. ccxt/abstract/gemini.py +1 -0
  36. ccxt/abstract/hibachi.py +26 -0
  37. ccxt/abstract/hyperliquid.py +1 -1
  38. ccxt/abstract/independentreserve.py +6 -0
  39. ccxt/abstract/kraken.py +1 -0
  40. ccxt/abstract/krakenfutures.py +4 -0
  41. ccxt/abstract/kucoin.py +10 -0
  42. ccxt/abstract/kucoinfutures.py +18 -0
  43. ccxt/abstract/lbank.py +2 -1
  44. ccxt/abstract/luno.py +1 -0
  45. ccxt/abstract/mexc.py +2 -0
  46. ccxt/abstract/modetrade.py +119 -0
  47. ccxt/abstract/myokx.py +349 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +25 -0
  50. ccxt/abstract/okxus.py +349 -0
  51. ccxt/abstract/onetrading.py +0 -12
  52. ccxt/abstract/paradex.py +23 -0
  53. ccxt/abstract/phemex.py +2 -0
  54. ccxt/abstract/poloniex.py +36 -0
  55. ccxt/abstract/tradeogre.py +3 -1
  56. ccxt/abstract/upbit.py +51 -34
  57. ccxt/abstract/whitebit.py +16 -0
  58. ccxt/abstract/woo.py +64 -6
  59. ccxt/abstract/xt.py +10 -5
  60. ccxt/afratether.py +7 -7
  61. ccxt/alpaca.py +828 -51
  62. ccxt/apex.py +1875 -0
  63. ccxt/arzinja.py +7 -7
  64. ccxt/arzplus.py +9 -9
  65. ccxt/ascendex.py +501 -306
  66. ccxt/async_support/__init__.py +39 -35
  67. ccxt/async_support/abantether.py +10 -10
  68. ccxt/async_support/afratether.py +9 -9
  69. ccxt/async_support/alpaca.py +828 -51
  70. ccxt/async_support/apex.py +1875 -0
  71. ccxt/async_support/arzinja.py +10 -10
  72. ccxt/async_support/arzplus.py +12 -12
  73. ccxt/async_support/ascendex.py +502 -306
  74. ccxt/async_support/base/exchange.py +303 -89
  75. ccxt/async_support/base/ws/cache.py +9 -3
  76. ccxt/async_support/base/ws/client.py +173 -38
  77. ccxt/async_support/base/ws/future.py +25 -37
  78. ccxt/async_support/bequant.py +5 -3
  79. ccxt/async_support/bigone.py +279 -144
  80. ccxt/async_support/binance.py +2347 -1158
  81. ccxt/async_support/binancecoinm.py +9 -3
  82. ccxt/async_support/binanceus.py +17 -3
  83. ccxt/async_support/binanceusdm.py +9 -4
  84. ccxt/async_support/bingx.py +2962 -920
  85. ccxt/async_support/bit2c.py +147 -27
  86. ccxt/async_support/bitbank.py +151 -23
  87. ccxt/async_support/bitbns.py +104 -30
  88. ccxt/async_support/bitfinex.py +3291 -1113
  89. ccxt/async_support/bitflyer.py +202 -27
  90. ccxt/async_support/bitget.py +3683 -1538
  91. ccxt/async_support/bithumb.py +195 -38
  92. ccxt/async_support/bitimen.py +12 -12
  93. ccxt/async_support/bitir.py +38 -38
  94. ccxt/async_support/bitmart.py +1288 -350
  95. ccxt/async_support/bitmex.py +260 -75
  96. ccxt/async_support/bitopro.py +262 -62
  97. ccxt/async_support/bitpin.py +17 -16
  98. ccxt/async_support/bitrue.py +459 -290
  99. ccxt/async_support/bitso.py +199 -54
  100. ccxt/async_support/bitstamp.py +230 -96
  101. ccxt/async_support/bitteam.py +167 -25
  102. ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
  103. ccxt/async_support/bitvavo.py +213 -49
  104. ccxt/async_support/blockchaincom.py +160 -46
  105. ccxt/async_support/blofin.py +502 -120
  106. ccxt/async_support/btcalpha.py +169 -31
  107. ccxt/async_support/btcbox.py +292 -23
  108. ccxt/async_support/btcmarkets.py +211 -58
  109. ccxt/async_support/btcturk.py +161 -38
  110. ccxt/async_support/bybit.py +1775 -1030
  111. ccxt/async_support/cex.py +1440 -1303
  112. ccxt/async_support/coinbase.py +724 -212
  113. ccxt/async_support/coinbaseadvanced.py +2 -1
  114. ccxt/async_support/coinbaseexchange.py +388 -89
  115. ccxt/async_support/coinbaseinternational.py +412 -57
  116. ccxt/async_support/coincatch.py +177 -78
  117. ccxt/async_support/coincheck.py +135 -19
  118. ccxt/async_support/coinex.py +606 -232
  119. ccxt/async_support/coinmate.py +189 -63
  120. ccxt/async_support/coinmetro.py +195 -54
  121. ccxt/async_support/coinone.py +158 -51
  122. ccxt/async_support/coinsph.py +336 -61
  123. ccxt/async_support/coinspot.py +151 -52
  124. ccxt/async_support/cryptocom.py +661 -111
  125. ccxt/async_support/cryptomus.py +1137 -0
  126. ccxt/async_support/defx.py +2071 -0
  127. ccxt/async_support/delta.py +299 -99
  128. ccxt/async_support/deribit.py +348 -126
  129. ccxt/async_support/derive.py +2572 -0
  130. ccxt/async_support/digifinex.py +430 -214
  131. ccxt/async_support/ellipx.py +2029 -0
  132. ccxt/async_support/eterex.py +10 -10
  133. ccxt/async_support/excoino.py +31 -31
  134. ccxt/async_support/exir.py +14 -14
  135. ccxt/async_support/exmo.py +344 -131
  136. ccxt/async_support/exnovin.py +10 -10
  137. ccxt/async_support/farhadexchange.py +12 -12
  138. ccxt/async_support/fmfwio.py +2 -1
  139. ccxt/async_support/foxbit.py +1935 -0
  140. ccxt/async_support/gate.py +1351 -529
  141. ccxt/async_support/gateio.py +2 -1
  142. ccxt/async_support/gemini.py +144 -39
  143. ccxt/async_support/hashkey.py +152 -109
  144. ccxt/async_support/hibachi.py +2080 -0
  145. ccxt/async_support/hitbtc.py +395 -167
  146. ccxt/async_support/hitobit.py +12 -12
  147. ccxt/async_support/hollaex.py +307 -119
  148. ccxt/async_support/htx.py +851 -383
  149. ccxt/async_support/huobi.py +2 -1
  150. ccxt/async_support/hyperliquid.py +1848 -536
  151. ccxt/async_support/independentreserve.py +288 -15
  152. ccxt/async_support/indodax.py +190 -33
  153. ccxt/async_support/jibitex.py +12 -12
  154. ccxt/async_support/kraken.py +795 -351
  155. ccxt/async_support/krakenfutures.py +214 -62
  156. ccxt/async_support/kucoin.py +715 -396
  157. ccxt/async_support/kucoinfutures.py +652 -89
  158. ccxt/async_support/latoken.py +217 -113
  159. ccxt/async_support/lbank.py +425 -97
  160. ccxt/async_support/luno.py +382 -35
  161. ccxt/async_support/mercado.py +113 -6
  162. ccxt/async_support/mexc.py +874 -437
  163. ccxt/async_support/modetrade.py +2818 -0
  164. ccxt/async_support/myokx.py +54 -0
  165. ccxt/async_support/ndax.py +221 -64
  166. ccxt/async_support/nobitex.py +31 -37
  167. ccxt/async_support/novadax.py +190 -34
  168. ccxt/async_support/oceanex.py +217 -28
  169. ccxt/async_support/okcoin.py +253 -145
  170. ccxt/async_support/okexchange.py +11 -11
  171. ccxt/async_support/okx.py +1088 -351
  172. ccxt/async_support/okxus.py +54 -0
  173. ccxt/async_support/ompfinex.py +25 -24
  174. ccxt/async_support/onetrading.py +213 -392
  175. ccxt/async_support/oxfun.py +245 -166
  176. ccxt/async_support/p2b.py +151 -29
  177. ccxt/async_support/paradex.py +562 -49
  178. ccxt/async_support/paymium.py +82 -19
  179. ccxt/async_support/phemex.py +713 -172
  180. ccxt/async_support/poloniex.py +1602 -283
  181. ccxt/async_support/probit.py +224 -95
  182. ccxt/async_support/ramzinex.py +30 -27
  183. ccxt/async_support/sarmayex.py +9 -9
  184. ccxt/async_support/sarrafex.py +13 -13
  185. ccxt/async_support/tabdeal.py +14 -13
  186. ccxt/async_support/tetherland.py +9 -9
  187. ccxt/async_support/timex.py +210 -51
  188. ccxt/async_support/tokocrypto.py +167 -47
  189. ccxt/async_support/tradeogre.py +266 -31
  190. ccxt/async_support/twox.py +9 -9
  191. ccxt/async_support/ubitex.py +12 -12
  192. ccxt/async_support/upbit.py +568 -165
  193. ccxt/async_support/vertex.py +160 -32
  194. ccxt/async_support/wallex.py +12 -12
  195. ccxt/async_support/wavesexchange.py +165 -30
  196. ccxt/async_support/whitebit.py +975 -127
  197. ccxt/async_support/woo.py +1918 -1016
  198. ccxt/async_support/woofipro.py +433 -141
  199. ccxt/async_support/xt.py +649 -193
  200. ccxt/async_support/yobit.py +195 -70
  201. ccxt/async_support/zaif.py +91 -15
  202. ccxt/async_support/zonda.py +151 -36
  203. ccxt/base/decimal_to_precision.py +14 -10
  204. ccxt/base/errors.py +49 -18
  205. ccxt/base/exchange.py +1556 -450
  206. ccxt/base/precise.py +10 -0
  207. ccxt/base/types.py +114 -6
  208. ccxt/bequant.py +5 -3
  209. ccxt/bigone.py +279 -144
  210. ccxt/binance.py +2347 -1158
  211. ccxt/binancecoinm.py +9 -3
  212. ccxt/binanceus.py +17 -3
  213. ccxt/binanceusdm.py +9 -4
  214. ccxt/bingx.py +2962 -920
  215. ccxt/bit2c.py +147 -27
  216. ccxt/bitbank.py +151 -23
  217. ccxt/bitbns.py +104 -30
  218. ccxt/bitfinex.py +3290 -1113
  219. ccxt/bitflyer.py +202 -27
  220. ccxt/bitget.py +3683 -1538
  221. ccxt/bithumb.py +194 -38
  222. ccxt/bitimen.py +9 -9
  223. ccxt/bitir.py +35 -35
  224. ccxt/bitmart.py +1288 -350
  225. ccxt/bitmex.py +260 -75
  226. ccxt/bitopro.py +262 -62
  227. ccxt/bitpin.py +15 -14
  228. ccxt/bitrue.py +459 -290
  229. ccxt/bitso.py +199 -54
  230. ccxt/bitstamp.py +230 -96
  231. ccxt/bitteam.py +167 -25
  232. ccxt/{huobijp.py → bittrade.py} +158 -30
  233. ccxt/bitvavo.py +213 -49
  234. ccxt/blockchaincom.py +160 -46
  235. ccxt/blofin.py +502 -120
  236. ccxt/btcalpha.py +169 -31
  237. ccxt/btcbox.py +291 -23
  238. ccxt/btcmarkets.py +211 -58
  239. ccxt/btcturk.py +161 -38
  240. ccxt/bybit.py +1775 -1030
  241. ccxt/cex.py +1439 -1303
  242. ccxt/coinbase.py +724 -212
  243. ccxt/coinbaseadvanced.py +2 -1
  244. ccxt/coinbaseexchange.py +388 -89
  245. ccxt/coinbaseinternational.py +412 -57
  246. ccxt/coincatch.py +177 -78
  247. ccxt/coincheck.py +135 -19
  248. ccxt/coinex.py +606 -232
  249. ccxt/coinmate.py +189 -63
  250. ccxt/coinmetro.py +194 -54
  251. ccxt/coinone.py +158 -51
  252. ccxt/coinsph.py +336 -61
  253. ccxt/coinspot.py +151 -52
  254. ccxt/cryptocom.py +661 -111
  255. ccxt/cryptomus.py +1137 -0
  256. ccxt/defx.py +2070 -0
  257. ccxt/delta.py +299 -99
  258. ccxt/deribit.py +348 -126
  259. ccxt/derive.py +2571 -0
  260. ccxt/digifinex.py +430 -214
  261. ccxt/ellipx.py +2029 -0
  262. ccxt/eterex.py +7 -7
  263. ccxt/excoino.py +29 -29
  264. ccxt/exir.py +11 -11
  265. ccxt/exmo.py +343 -131
  266. ccxt/exnovin.py +8 -8
  267. ccxt/farhadexchange.py +10 -10
  268. ccxt/fmfwio.py +2 -1
  269. ccxt/foxbit.py +1935 -0
  270. ccxt/gate.py +1351 -529
  271. ccxt/gateio.py +2 -1
  272. ccxt/gemini.py +144 -39
  273. ccxt/hashkey.py +152 -109
  274. ccxt/hibachi.py +2079 -0
  275. ccxt/hitbtc.py +395 -167
  276. ccxt/hitobit.py +9 -9
  277. ccxt/hollaex.py +307 -119
  278. ccxt/htx.py +851 -383
  279. ccxt/huobi.py +2 -1
  280. ccxt/hyperliquid.py +1848 -536
  281. ccxt/independentreserve.py +287 -15
  282. ccxt/indodax.py +190 -33
  283. ccxt/jibitex.py +9 -9
  284. ccxt/kraken.py +794 -351
  285. ccxt/krakenfutures.py +214 -62
  286. ccxt/kucoin.py +715 -396
  287. ccxt/kucoinfutures.py +652 -89
  288. ccxt/latoken.py +217 -113
  289. ccxt/lbank.py +425 -97
  290. ccxt/luno.py +382 -35
  291. ccxt/mercado.py +113 -6
  292. ccxt/mexc.py +873 -437
  293. ccxt/modetrade.py +2818 -0
  294. ccxt/myokx.py +54 -0
  295. ccxt/ndax.py +221 -64
  296. ccxt/nobitex.py +29 -35
  297. ccxt/novadax.py +190 -34
  298. ccxt/oceanex.py +217 -28
  299. ccxt/okcoin.py +253 -145
  300. ccxt/okexchange.py +9 -9
  301. ccxt/okx.py +1088 -351
  302. ccxt/okxus.py +54 -0
  303. ccxt/ompfinex.py +22 -21
  304. ccxt/onetrading.py +213 -392
  305. ccxt/oxfun.py +245 -166
  306. ccxt/p2b.py +151 -29
  307. ccxt/paradex.py +562 -49
  308. ccxt/paymium.py +82 -19
  309. ccxt/phemex.py +712 -172
  310. ccxt/poloniex.py +1601 -283
  311. ccxt/pro/__init__.py +76 -17
  312. ccxt/pro/alpaca.py +21 -6
  313. ccxt/pro/apex.py +984 -0
  314. ccxt/pro/ascendex.py +58 -10
  315. ccxt/pro/bequant.py +6 -1
  316. ccxt/pro/binance.py +728 -156
  317. ccxt/pro/binancecoinm.py +6 -2
  318. ccxt/pro/binanceus.py +8 -4
  319. ccxt/pro/binanceusdm.py +7 -2
  320. ccxt/pro/bingx.py +333 -142
  321. ccxt/pro/bitfinex.py +727 -262
  322. ccxt/pro/bitget.py +570 -79
  323. ccxt/pro/bithumb.py +20 -6
  324. ccxt/pro/bitmart.py +216 -87
  325. ccxt/pro/bitmex.py +47 -9
  326. ccxt/pro/bitopro.py +26 -14
  327. ccxt/pro/bitrue.py +22 -22
  328. ccxt/pro/bitstamp.py +54 -21
  329. ccxt/pro/{huobijp.py → bittrade.py} +7 -6
  330. ccxt/pro/bitvavo.py +191 -67
  331. ccxt/pro/blockchaincom.py +21 -8
  332. ccxt/pro/blofin.py +9 -1
  333. ccxt/pro/bybit.py +632 -245
  334. ccxt/pro/cex.py +59 -24
  335. ccxt/pro/coinbase.py +102 -73
  336. ccxt/pro/coinbaseadvanced.py +2 -1
  337. ccxt/pro/coinbaseexchange.py +8 -8
  338. ccxt/pro/coinbaseinternational.py +181 -25
  339. ccxt/pro/coincatch.py +6 -7
  340. ccxt/pro/coincheck.py +11 -6
  341. ccxt/pro/coinex.py +967 -665
  342. ccxt/pro/coinone.py +16 -9
  343. ccxt/pro/cryptocom.py +448 -45
  344. ccxt/pro/defx.py +831 -0
  345. ccxt/pro/deribit.py +150 -14
  346. ccxt/pro/derive.py +704 -0
  347. ccxt/pro/exmo.py +239 -6
  348. ccxt/pro/gate.py +623 -65
  349. ccxt/pro/gateio.py +2 -1
  350. ccxt/pro/gemini.py +27 -11
  351. ccxt/pro/hashkey.py +2 -2
  352. ccxt/pro/hitbtc.py +196 -91
  353. ccxt/pro/hollaex.py +23 -7
  354. ccxt/pro/htx.py +51 -14
  355. ccxt/pro/huobi.py +2 -1
  356. ccxt/pro/hyperliquid.py +591 -27
  357. ccxt/pro/independentreserve.py +9 -6
  358. ccxt/pro/kraken.py +640 -320
  359. ccxt/pro/krakenfutures.py +62 -35
  360. ccxt/pro/kucoin.py +267 -46
  361. ccxt/pro/kucoinfutures.py +165 -21
  362. ccxt/pro/lbank.py +102 -21
  363. ccxt/pro/luno.py +12 -8
  364. ccxt/pro/mexc.py +877 -111
  365. ccxt/pro/modetrade.py +1271 -0
  366. ccxt/pro/myokx.py +38 -0
  367. ccxt/pro/ndax.py +15 -2
  368. ccxt/pro/okcoin.py +23 -4
  369. ccxt/pro/okx.py +573 -98
  370. ccxt/pro/okxus.py +38 -0
  371. ccxt/pro/onetrading.py +30 -13
  372. ccxt/pro/oxfun.py +131 -27
  373. ccxt/pro/p2b.py +88 -22
  374. ccxt/pro/paradex.py +3 -3
  375. ccxt/pro/phemex.py +75 -21
  376. ccxt/pro/poloniex.py +124 -41
  377. ccxt/pro/probit.py +87 -80
  378. ccxt/pro/tradeogre.py +272 -0
  379. ccxt/pro/upbit.py +152 -12
  380. ccxt/pro/vertex.py +8 -3
  381. ccxt/pro/whitebit.py +58 -5
  382. ccxt/pro/woo.py +228 -37
  383. ccxt/pro/woofipro.py +106 -18
  384. ccxt/pro/xt.py +111 -5
  385. ccxt/probit.py +224 -95
  386. ccxt/protobuf/__init__.py +0 -0
  387. ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
  388. ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
  389. ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
  390. ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
  391. ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
  392. ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
  393. ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
  394. ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
  395. ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
  396. ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
  397. ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
  398. ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
  399. ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
  400. ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
  401. ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
  402. ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
  403. ccxt/protobuf/mexc/__init__.py +0 -0
  404. ccxt/ramzinex.py +28 -25
  405. ccxt/sarmayex.py +7 -7
  406. ccxt/sarrafex.py +10 -10
  407. ccxt/static_dependencies/__init__.py +1 -1
  408. ccxt/static_dependencies/lark/py.typed +0 -0
  409. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  410. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  411. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  412. ccxt/tabdeal.py +12 -11
  413. ccxt/test/tests_async.py +261 -57
  414. ccxt/test/tests_helpers.py +1 -3
  415. ccxt/test/tests_init.py +4 -3
  416. ccxt/test/tests_sync.py +261 -57
  417. ccxt/tetherland.py +7 -7
  418. ccxt/timex.py +210 -51
  419. ccxt/tokocrypto.py +167 -47
  420. ccxt/tradeogre.py +266 -31
  421. ccxt/twox.py +7 -7
  422. ccxt/ubitex.py +9 -9
  423. ccxt/upbit.py +568 -165
  424. ccxt/vertex.py +160 -32
  425. ccxt/wallex.py +9 -9
  426. ccxt/wavesexchange.py +165 -30
  427. ccxt/whitebit.py +975 -127
  428. ccxt/woo.py +1917 -1016
  429. ccxt/woofipro.py +432 -141
  430. ccxt/xt.py +649 -193
  431. ccxt/yobit.py +194 -70
  432. ccxt/zaif.py +91 -15
  433. ccxt/zonda.py +151 -36
  434. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/METADATA +225 -73
  435. ccxt_ir-4.5.0.dist-info/RECORD +743 -0
  436. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
  437. ccxt/abstract/ace.py +0 -15
  438. ccxt/abstract/bitbay.py +0 -53
  439. ccxt/abstract/bitcoincom.py +0 -115
  440. ccxt/abstract/bitfinex2.py +0 -139
  441. ccxt/abstract/bitpanda.py +0 -35
  442. ccxt/abstract/bl3p.py +0 -19
  443. ccxt/abstract/coinlist.py +0 -54
  444. ccxt/abstract/currencycom.py +0 -68
  445. ccxt/abstract/hitbtc3.py +0 -115
  446. ccxt/abstract/idex.py +0 -26
  447. ccxt/abstract/kuna.py +0 -182
  448. ccxt/abstract/lykke.py +0 -29
  449. ccxt/abstract/poloniexfutures.py +0 -48
  450. ccxt/abstract/wazirx.py +0 -30
  451. ccxt/ace.py +0 -1012
  452. ccxt/async_support/ace.py +0 -1012
  453. ccxt/async_support/base/ws/aiohttp_client.py +0 -125
  454. ccxt/async_support/base/ws/fast_client.py +0 -96
  455. ccxt/async_support/bitbay.py +0 -17
  456. ccxt/async_support/bitcoincom.py +0 -17
  457. ccxt/async_support/bitfinex2.py +0 -3552
  458. ccxt/async_support/bitpanda.py +0 -16
  459. ccxt/async_support/bl3p.py +0 -485
  460. ccxt/async_support/coinlist.py +0 -2243
  461. ccxt/async_support/currencycom.py +0 -1950
  462. ccxt/async_support/hitbtc3.py +0 -16
  463. ccxt/async_support/idex.py +0 -1766
  464. ccxt/async_support/kuna.py +0 -1841
  465. ccxt/async_support/lykke.py +0 -1270
  466. ccxt/async_support/poloniexfutures.py +0 -1717
  467. ccxt/async_support/wazirx.py +0 -1224
  468. ccxt/bitbay.py +0 -17
  469. ccxt/bitcoincom.py +0 -17
  470. ccxt/bitfinex2.py +0 -3552
  471. ccxt/bitpanda.py +0 -16
  472. ccxt/bl3p.py +0 -485
  473. ccxt/coinlist.py +0 -2243
  474. ccxt/currencycom.py +0 -1950
  475. ccxt/hitbtc3.py +0 -16
  476. ccxt/idex.py +0 -1766
  477. ccxt/kuna.py +0 -1841
  478. ccxt/lykke.py +0 -1270
  479. ccxt/poloniexfutures.py +0 -1717
  480. ccxt/pro/bitcoincom.py +0 -34
  481. ccxt/pro/bitfinex2.py +0 -1083
  482. ccxt/pro/bitpanda.py +0 -15
  483. ccxt/pro/currencycom.py +0 -536
  484. ccxt/pro/idex.py +0 -672
  485. ccxt/pro/poloniexfutures.py +0 -990
  486. ccxt/pro/wazirx.py +0 -749
  487. ccxt/test/base/__init__.py +0 -29
  488. ccxt/test/base/test_account.py +0 -26
  489. ccxt/test/base/test_balance.py +0 -56
  490. ccxt/test/base/test_borrow_interest.py +0 -35
  491. ccxt/test/base/test_borrow_rate.py +0 -32
  492. ccxt/test/base/test_calculate_fee.py +0 -51
  493. ccxt/test/base/test_crypto.py +0 -127
  494. ccxt/test/base/test_currency.py +0 -76
  495. ccxt/test/base/test_datetime.py +0 -109
  496. ccxt/test/base/test_decimal_to_precision.py +0 -392
  497. ccxt/test/base/test_deep_extend.py +0 -68
  498. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  499. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  500. ccxt/test/base/test_funding_rate_history.py +0 -29
  501. ccxt/test/base/test_last_price.py +0 -31
  502. ccxt/test/base/test_ledger_entry.py +0 -45
  503. ccxt/test/base/test_ledger_item.py +0 -48
  504. ccxt/test/base/test_leverage_tier.py +0 -33
  505. ccxt/test/base/test_liquidation.py +0 -50
  506. ccxt/test/base/test_margin_mode.py +0 -24
  507. ccxt/test/base/test_margin_modification.py +0 -35
  508. ccxt/test/base/test_market.py +0 -193
  509. ccxt/test/base/test_number.py +0 -411
  510. ccxt/test/base/test_ohlcv.py +0 -33
  511. ccxt/test/base/test_open_interest.py +0 -32
  512. ccxt/test/base/test_order.py +0 -64
  513. ccxt/test/base/test_order_book.py +0 -69
  514. ccxt/test/base/test_position.py +0 -60
  515. ccxt/test/base/test_shared_methods.py +0 -353
  516. ccxt/test/base/test_status.py +0 -24
  517. ccxt/test/base/test_throttle.py +0 -126
  518. ccxt/test/base/test_ticker.py +0 -92
  519. ccxt/test/base/test_trade.py +0 -47
  520. ccxt/test/base/test_trading_fee.py +0 -26
  521. ccxt/test/base/test_transaction.py +0 -39
  522. ccxt/test/test_async.py +0 -1649
  523. ccxt/test/test_sync.py +0 -1648
  524. ccxt/wazirx.py +0 -1224
  525. ccxt_ir-4.3.46.0.2.dist-info/RECORD +0 -772
  526. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  527. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
  528. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
ccxt/pro/woo.py CHANGED
@@ -6,7 +6,7 @@
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide, ArrayCacheByTimestamp
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Int, Order, OrderBook, Position, Str, Strings, Ticker, Tickers, Trade
9
+ from ccxt.base.types import Any, Balances, Bool, Int, Order, OrderBook, Position, Str, Strings, Ticker, Tickers, Trade
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
@@ -16,7 +16,7 @@ from ccxt.base.precise import Precise
16
16
 
17
17
  class woo(ccxt.async_support.woo):
18
18
 
19
- def describe(self):
19
+ def describe(self) -> Any:
20
20
  return self.deep_extend(super(woo, self).describe(), {
21
21
  'has': {
22
22
  'ws': True,
@@ -27,20 +27,22 @@ class woo(ccxt.async_support.woo):
27
27
  'watchOrders': True,
28
28
  'watchTicker': True,
29
29
  'watchTickers': True,
30
+ 'watchBidsAsks': True,
30
31
  'watchTrades': True,
32
+ 'watchTradesForSymbols': False,
31
33
  'watchPositions': True,
32
34
  },
33
35
  'urls': {
34
36
  'api': {
35
37
  'ws': {
36
- 'public': 'wss://wss.woo.org/ws/stream',
37
- 'private': 'wss://wss.woo.network/v2/ws/private/stream',
38
+ 'public': 'wss://wss.woox.io/ws/stream',
39
+ 'private': 'wss://wss.woox.io/v2/ws/private/stream',
38
40
  },
39
41
  },
40
42
  'test': {
41
43
  'ws': {
42
- 'public': 'wss://wss.staging.woo.org/ws/stream',
43
- 'private': 'wss://wss.staging.woo.org/v2/ws/private/stream',
44
+ 'public': 'wss://wss.staging.woox.io/ws/stream',
45
+ 'private': 'wss://wss.staging.woox.io/v2/ws/private/stream',
44
46
  },
45
47
  },
46
48
  },
@@ -79,7 +81,8 @@ class woo(ccxt.async_support.woo):
79
81
  return newValue
80
82
 
81
83
  async def watch_public(self, messageHash, message):
82
- url = self.urls['api']['ws']['public'] + '/' + self.uid
84
+ urlUid = '/' + self.uid if (self.uid) else ''
85
+ url = self.urls['api']['ws']['public'] + urlUid
83
86
  requestId = self.request_id(url)
84
87
  subscribe: dict = {
85
88
  'id': requestId,
@@ -89,32 +92,50 @@ class woo(ccxt.async_support.woo):
89
92
 
90
93
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
91
94
  """
92
- :see: https://docs.woo.org/#orderbook
95
+
96
+ https://docs.woox.io/#orderbookupdate
97
+ https://docs.woox.io/#orderbook
98
+
93
99
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
94
100
  :param str symbol: unified symbol of the market to fetch the order book for
95
101
  :param int [limit]: the maximum amount of order book entries to return.
96
102
  :param dict [params]: extra parameters specific to the exchange API endpoint
103
+ :param str [params.method]: either(default) 'orderbook' or 'orderbookupdate', default is 'orderbook'
97
104
  :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
98
105
  """
99
106
  await self.load_markets()
100
- name = 'orderbook'
107
+ method = None
108
+ method, params = self.handle_option_and_params(params, 'watchOrderBook', 'method', 'orderbook')
101
109
  market = self.market(symbol)
102
- topic = market['id'] + '@' + name
110
+ topic = market['id'] + '@' + method
111
+ urlUid = '/' + self.uid if (self.uid) else ''
112
+ url = self.urls['api']['ws']['public'] + urlUid
113
+ requestId = self.request_id(url)
103
114
  request: dict = {
104
115
  'event': 'subscribe',
105
116
  'topic': topic,
117
+ 'id': requestId,
106
118
  }
107
- message = self.extend(request, params)
108
- orderbook = await self.watch_public(topic, message)
119
+ subscription: dict = {
120
+ 'id': str(requestId),
121
+ 'name': method,
122
+ 'symbol': symbol,
123
+ 'limit': limit,
124
+ 'params': params,
125
+ }
126
+ if method == 'orderbookupdate':
127
+ subscription['method'] = self.handle_order_book_subscription
128
+ orderbook = await self.watch(url, topic, self.extend(request, params), topic, subscription)
109
129
  return orderbook.limit()
110
130
 
111
131
  def handle_order_book(self, client: Client, message):
112
132
  #
113
133
  # {
114
- # "topic": "PERP_BTC_USDT@orderbook",
115
- # "ts": 1650121915308,
134
+ # "topic": "PERP_BTC_USDT@orderbookupdate",
135
+ # "ts": 1722500373999,
116
136
  # "data": {
117
137
  # "symbol": "PERP_BTC_USDT",
138
+ # "prevTs": 1722500373799,
118
139
  # "bids": [
119
140
  # [
120
141
  # 0.30891,
@@ -135,13 +156,89 @@ class woo(ccxt.async_support.woo):
135
156
  market = self.safe_market(marketId)
136
157
  symbol = market['symbol']
137
158
  topic = self.safe_string(message, 'topic')
138
- if not (symbol in self.orderbooks):
139
- self.orderbooks[symbol] = self.order_book({})
140
- orderbook = self.orderbooks[symbol]
159
+ method = self.safe_string(topic.split('@'), 1)
160
+ if method == 'orderbookupdate':
161
+ if not (symbol in self.orderbooks):
162
+ return
163
+ orderbook = self.orderbooks[symbol]
164
+ timestamp = self.safe_integer(orderbook, 'timestamp')
165
+ if timestamp is None:
166
+ orderbook.cache.append(message)
167
+ else:
168
+ try:
169
+ ts = self.safe_integer(message, 'ts')
170
+ if ts > timestamp:
171
+ self.handle_order_book_message(client, message, orderbook)
172
+ client.resolve(orderbook, topic)
173
+ except Exception as e:
174
+ del self.orderbooks[symbol]
175
+ del client.subscriptions[topic]
176
+ client.reject(e, topic)
177
+ else:
178
+ if not (symbol in self.orderbooks):
179
+ defaultLimit = self.safe_integer(self.options, 'watchOrderBookLimit', 1000)
180
+ subscription = client.subscriptions[topic]
181
+ limit = self.safe_integer(subscription, 'limit', defaultLimit)
182
+ self.orderbooks[symbol] = self.order_book({}, limit)
183
+ orderbook = self.orderbooks[symbol]
184
+ timestamp = self.safe_integer(message, 'ts')
185
+ snapshot = self.parse_order_book(data, symbol, timestamp, 'bids', 'asks')
186
+ orderbook.reset(snapshot)
187
+ client.resolve(orderbook, topic)
188
+
189
+ def handle_order_book_subscription(self, client: Client, message, subscription):
190
+ defaultLimit = self.safe_integer(self.options, 'watchOrderBookLimit', 1000)
191
+ limit = self.safe_integer(subscription, 'limit', defaultLimit)
192
+ symbol = self.safe_string(subscription, 'symbol') # watchOrderBook
193
+ if symbol in self.orderbooks:
194
+ del self.orderbooks[symbol]
195
+ self.orderbooks[symbol] = self.order_book({}, limit)
196
+ self.spawn(self.fetch_order_book_snapshot, client, message, subscription)
197
+
198
+ async def fetch_order_book_snapshot(self, client, message, subscription):
199
+ symbol = self.safe_string(subscription, 'symbol')
200
+ messageHash = self.safe_string(message, 'topic')
201
+ try:
202
+ defaultLimit = self.safe_integer(self.options, 'watchOrderBookLimit', 1000)
203
+ limit = self.safe_integer(subscription, 'limit', defaultLimit)
204
+ params = self.safe_value(subscription, 'params')
205
+ snapshot = await self.fetch_rest_order_book_safe(symbol, limit, params)
206
+ if self.safe_value(self.orderbooks, symbol) is None:
207
+ # if the orderbook is dropped before the snapshot is received
208
+ return
209
+ orderbook = self.orderbooks[symbol]
210
+ orderbook.reset(snapshot)
211
+ messages = orderbook.cache
212
+ for i in range(0, len(messages)):
213
+ messageItem = messages[i]
214
+ ts = self.safe_integer(messageItem, 'ts')
215
+ if ts < orderbook['timestamp']:
216
+ continue
217
+ else:
218
+ self.handle_order_book_message(client, messageItem, orderbook)
219
+ self.orderbooks[symbol] = orderbook
220
+ client.resolve(orderbook, messageHash)
221
+ except Exception as e:
222
+ del client.subscriptions[messageHash]
223
+ client.reject(e, messageHash)
224
+
225
+ def handle_order_book_message(self, client: Client, message, orderbook):
226
+ data = self.safe_dict(message, 'data')
227
+ self.handle_deltas(orderbook['asks'], self.safe_value(data, 'asks', []))
228
+ self.handle_deltas(orderbook['bids'], self.safe_value(data, 'bids', []))
141
229
  timestamp = self.safe_integer(message, 'ts')
142
- snapshot = self.parse_order_book(data, symbol, timestamp, 'bids', 'asks')
143
- orderbook.reset(snapshot)
144
- client.resolve(orderbook, topic)
230
+ orderbook['timestamp'] = timestamp
231
+ orderbook['datetime'] = self.iso8601(timestamp)
232
+ return orderbook
233
+
234
+ def handle_delta(self, bookside, delta):
235
+ price = self.safe_float_2(delta, 'price', 0)
236
+ amount = self.safe_float_2(delta, 'quantity', 1)
237
+ bookside.store(price, amount)
238
+
239
+ def handle_deltas(self, bookside, deltas):
240
+ for i in range(0, len(deltas)):
241
+ self.handle_delta(bookside, deltas[i])
145
242
 
146
243
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
147
244
  """
@@ -229,7 +326,9 @@ class woo(ccxt.async_support.woo):
229
326
 
230
327
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
231
328
  """
232
- :see: https://docs.woo.org/#24h-tickers
329
+
330
+ https://docs.woox.io/#24h-tickers
331
+
233
332
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
234
333
  :param str[] symbols: unified symbol of the market to fetch the ticker for
235
334
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -289,10 +388,81 @@ class woo(ccxt.async_support.woo):
289
388
  result.append(ticker)
290
389
  client.resolve(result, topic)
291
390
 
391
+ async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
392
+ """
393
+
394
+ https://docs.woox.io/#bbos
395
+
396
+ watches best bid & ask for symbols
397
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
398
+ :param dict [params]: extra parameters specific to the exchange API endpoint
399
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
400
+ """
401
+ await self.load_markets()
402
+ symbols = self.market_symbols(symbols, None, False)
403
+ name = 'bbos'
404
+ topic = name
405
+ request: dict = {
406
+ 'event': 'subscribe',
407
+ 'topic': topic,
408
+ }
409
+ message = self.extend(request, params)
410
+ tickers = await self.watch_public(topic, message)
411
+ if self.newUpdates:
412
+ return tickers
413
+ return self.filter_by_array(self.bidsasks, 'symbol', symbols)
414
+
415
+ def handle_bid_ask(self, client: Client, message):
416
+ #
417
+ # {
418
+ # "topic": "bbos",
419
+ # "ts": 1618822376000,
420
+ # "data": [
421
+ # {
422
+ # "symbol": "SPOT_FIL_USDT",
423
+ # "ask": 159.0318,
424
+ # "askSize": 370.43,
425
+ # "bid": 158.9158,
426
+ # "bidSize": 16
427
+ # }
428
+ # ]
429
+ # }
430
+ #
431
+ topic = self.safe_string(message, 'topic')
432
+ data = self.safe_list(message, 'data', [])
433
+ timestamp = self.safe_integer(message, 'ts')
434
+ result: dict = {}
435
+ for i in range(0, len(data)):
436
+ ticker = self.safe_dict(data, i)
437
+ ticker['ts'] = timestamp
438
+ parsedTicker = self.parse_ws_bid_ask(ticker)
439
+ symbol = parsedTicker['symbol']
440
+ self.bidsasks[symbol] = parsedTicker
441
+ result[symbol] = parsedTicker
442
+ client.resolve(result, topic)
443
+
444
+ def parse_ws_bid_ask(self, ticker, market=None):
445
+ marketId = self.safe_string(ticker, 'symbol')
446
+ market = self.safe_market(marketId, market)
447
+ symbol = self.safe_string(market, 'symbol')
448
+ timestamp = self.safe_integer(ticker, 'ts')
449
+ return self.safe_ticker({
450
+ 'symbol': symbol,
451
+ 'timestamp': timestamp,
452
+ 'datetime': self.iso8601(timestamp),
453
+ 'ask': self.safe_string(ticker, 'ask'),
454
+ 'askVolume': self.safe_string(ticker, 'askSize'),
455
+ 'bid': self.safe_string(ticker, 'bid'),
456
+ 'bidVolume': self.safe_string(ticker, 'bidSize'),
457
+ 'info': ticker,
458
+ }, market)
459
+
292
460
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
293
461
  """
294
462
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
295
- :see: https://docs.woo.org/#k-line
463
+
464
+ https://docs.woox.io/#k-line
465
+
296
466
  :param str symbol: unified symbol of the market to fetch OHLCV data for
297
467
  :param str timeframe: the length of time each candle represents
298
468
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -363,12 +533,14 @@ class woo(ccxt.async_support.woo):
363
533
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
364
534
  """
365
535
  watches information on multiple trades made in a market
366
- :see: https://docs.woo.org/#trade
536
+
537
+ https://docs.woox.io/#trade
538
+
367
539
  :param str symbol: unified market symbol of the market trades were made in
368
540
  :param int [since]: the earliest time in ms to fetch trades for
369
541
  :param int [limit]: the maximum number of trade structures to retrieve
370
542
  :param dict [params]: extra parameters specific to the exchange API endpoint
371
- :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
543
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
372
544
  """
373
545
  await self.load_markets()
374
546
  market = self.market(symbol)
@@ -456,7 +628,7 @@ class woo(ccxt.async_support.woo):
456
628
  marketId = self.safe_string(trade, 'symbol')
457
629
  market = self.safe_market(marketId, market)
458
630
  symbol = market['symbol']
459
- price = self.safe_string(trade, 'executedPrice', 'price')
631
+ price = self.safe_string_2(trade, 'executedPrice', 'price')
460
632
  amount = self.safe_string_2(trade, 'executedQuantity', 'size')
461
633
  cost = Precise.string_mul(price, amount)
462
634
  side = self.safe_string_lower(trade, 'side')
@@ -492,7 +664,7 @@ class woo(ccxt.async_support.woo):
492
664
  def check_required_uid(self, error=True):
493
665
  if not self.uid:
494
666
  if error:
495
- raise AuthenticationError(self.id + ' requires `uid` credential')
667
+ raise AuthenticationError(self.id + ' requires `uid` credential(woox calls it `application_id`)')
496
668
  else:
497
669
  return False
498
670
  return True
@@ -518,7 +690,7 @@ class woo(ccxt.async_support.woo):
518
690
  },
519
691
  }
520
692
  message = self.extend(request, params)
521
- self.watch(url, messageHash, message, messageHash)
693
+ self.watch(url, messageHash, message, messageHash, message)
522
694
  return await future
523
695
 
524
696
  async def watch_private(self, messageHash, message, params={}):
@@ -543,8 +715,10 @@ class woo(ccxt.async_support.woo):
543
715
 
544
716
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
545
717
  """
546
- :see: https://docs.woo.org/#executionreport
547
- :see: https://docs.woo.org/#algoexecutionreportv2
718
+
719
+ https://docs.woox.io/#executionreport
720
+ https://docs.woox.io/#algoexecutionreportv2
721
+
548
722
  watches information on multiple orders made by the user
549
723
  :param str symbol: unified market symbol of the market orders were made in
550
724
  :param int [since]: the earliest time in ms to fetch orders for
@@ -574,8 +748,10 @@ class woo(ccxt.async_support.woo):
574
748
 
575
749
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
576
750
  """
577
- :see: https://docs.woo.org/#executionreport
578
- :see: https://docs.woo.org/#algoexecutionreportv2
751
+
752
+ https://docs.woox.io/#executionreport
753
+ https://docs.woox.io/#algoexecutionreportv2
754
+
579
755
  watches information on multiple trades made by the user
580
756
  :param str symbol: unified market symbol of the market orders were made in
581
757
  :param int [since]: the earliest time in ms to fetch orders for
@@ -638,9 +814,10 @@ class woo(ccxt.async_support.woo):
638
814
  'cost': self.safe_string(order, 'totalFee'),
639
815
  'currency': self.safe_string(order, 'feeAsset'),
640
816
  }
817
+ priceString = self.safe_string(order, 'price')
641
818
  price = self.safe_number(order, 'price')
642
819
  avgPrice = self.safe_number(order, 'avgPrice')
643
- if (price == 0) and (avgPrice is not None):
820
+ if Precise.string_eq(priceString, '0') and (avgPrice is not None):
644
821
  price = avgPrice
645
822
  amount = self.safe_float(order, 'quantity')
646
823
  side = self.safe_string_lower(order, 'side')
@@ -671,7 +848,7 @@ class woo(ccxt.async_support.woo):
671
848
  'triggerPrice': None,
672
849
  'amount': amount,
673
850
  'cost': None,
674
- 'average': None,
851
+ 'average': avgPrice,
675
852
  'filled': filled,
676
853
  'remaining': remaining,
677
854
  'status': status,
@@ -796,9 +973,13 @@ class woo(ccxt.async_support.woo):
796
973
 
797
974
  async def watch_positions(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Position]:
798
975
  """
799
- :see: https://docs.woo.org/#position-push
976
+
977
+ https://docs.woox.io/#position-push
978
+
800
979
  watch all open positions
801
980
  :param str[]|None symbols: list of unified market symbols
981
+ @param since
982
+ @param limit
802
983
  :param dict params: extra parameters specific to the exchange API endpoint
803
984
  :returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
804
985
  """
@@ -815,7 +996,7 @@ class woo(ccxt.async_support.woo):
815
996
  client = self.client(url)
816
997
  self.set_positions_cache(client, symbols)
817
998
  fetchPositionsSnapshot = self.handle_option('watchPositions', 'fetchPositionsSnapshot', True)
818
- awaitPositionsSnapshot = self.safe_bool('watchPositions', 'awaitPositionsSnapshot', True)
999
+ awaitPositionsSnapshot = self.handle_option('watchPositions', 'awaitPositionsSnapshot', True)
819
1000
  if fetchPositionsSnapshot and awaitPositionsSnapshot and self.positions is None:
820
1001
  snapshot = await client.future('fetchPositionsSnapshot')
821
1002
  return self.filter_by_symbols_since_limit(snapshot, symbols, since, limit, True)
@@ -898,7 +1079,9 @@ class woo(ccxt.async_support.woo):
898
1079
 
899
1080
  async def watch_balance(self, params={}) -> Balances:
900
1081
  """
901
- :see: https://docs.woo.org/#balance
1082
+
1083
+ https://docs.woox.io/#balance
1084
+
902
1085
  watch balance and get the amount of funds available for trading or funds locked in orders
903
1086
  :param dict [params]: extra parameters specific to the exchange API endpoint
904
1087
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
@@ -963,7 +1146,7 @@ class woo(ccxt.async_support.woo):
963
1146
  self.balance = self.safe_balance(self.balance)
964
1147
  client.resolve(self.balance, 'balance')
965
1148
 
966
- def handle_error_message(self, client: Client, message):
1149
+ def handle_error_message(self, client: Client, message) -> Bool:
967
1150
  #
968
1151
  # {"id":"1","event":"subscribe","success":false,"ts":1710780997216,"errorMsg":"Auth is needed."}
969
1152
  #
@@ -996,6 +1179,7 @@ class woo(ccxt.async_support.woo):
996
1179
  'pong': self.handle_pong,
997
1180
  'subscribe': self.handle_subscribe,
998
1181
  'orderbook': self.handle_order_book,
1182
+ 'orderbookupdate': self.handle_order_book,
999
1183
  'ticker': self.handle_ticker,
1000
1184
  'tickers': self.handle_tickers,
1001
1185
  'kline': self.handle_ohlcv,
@@ -1005,6 +1189,7 @@ class woo(ccxt.async_support.woo):
1005
1189
  'trade': self.handle_trade,
1006
1190
  'balance': self.handle_balance,
1007
1191
  'position': self.handle_positions,
1192
+ 'bbos': self.handle_bid_ask,
1008
1193
  }
1009
1194
  event = self.safe_string(message, 'event')
1010
1195
  method = self.safe_value(methods, event)
@@ -1054,6 +1239,12 @@ class woo(ccxt.async_support.woo):
1054
1239
  # "ts": 1657117712212
1055
1240
  # }
1056
1241
  #
1242
+ id = self.safe_string(message, 'id')
1243
+ subscriptionsById = self.index_by(client.subscriptions, 'id')
1244
+ subscription = self.safe_value(subscriptionsById, id, {})
1245
+ method = self.safe_value(subscription, 'method')
1246
+ if method is not None:
1247
+ method(client, message, subscription)
1057
1248
  return message
1058
1249
 
1059
1250
  def handle_auth(self, client: Client, message):