ccxt-ir 4.3.46.0.3__py2.py3-none-any.whl → 4.5.1__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 (529) hide show
  1. ccxt/__init__.py +39 -35
  2. ccxt/abantether.py +8 -8
  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 +8 -8
  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 +8 -8
  68. ccxt/async_support/afratether.py +10 -10
  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 +32 -38
  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 +32 -27
  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 +34 -30
  183. ccxt/async_support/sarmayex.py +9 -9
  184. ccxt/async_support/sarrafex.py +13 -13
  185. ccxt/async_support/tabdeal.py +15 -14
  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 +30 -36
  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 +29 -24
  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 +32 -28
  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 +13 -12
  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.3.dist-info → ccxt_ir-4.5.1.dist-info}/METADATA +225 -73
  435. ccxt_ir-4.5.1.dist-info/RECORD +743 -0
  436. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.1.dist-info}/WHEEL +1 -1
  437. ccxt/__test__.py +0 -7
  438. ccxt/abstract/ace.py +0 -15
  439. ccxt/abstract/bitbay.py +0 -53
  440. ccxt/abstract/bitcoincom.py +0 -115
  441. ccxt/abstract/bitfinex2.py +0 -139
  442. ccxt/abstract/bitpanda.py +0 -35
  443. ccxt/abstract/bl3p.py +0 -19
  444. ccxt/abstract/coinlist.py +0 -54
  445. ccxt/abstract/currencycom.py +0 -68
  446. ccxt/abstract/hitbtc3.py +0 -115
  447. ccxt/abstract/idex.py +0 -26
  448. ccxt/abstract/kuna.py +0 -182
  449. ccxt/abstract/lykke.py +0 -29
  450. ccxt/abstract/poloniexfutures.py +0 -48
  451. ccxt/abstract/wazirx.py +0 -30
  452. ccxt/ace.py +0 -1012
  453. ccxt/async_support/ace.py +0 -1012
  454. ccxt/async_support/base/ws/aiohttp_client.py +0 -125
  455. ccxt/async_support/base/ws/fast_client.py +0 -96
  456. ccxt/async_support/bitbay.py +0 -17
  457. ccxt/async_support/bitcoincom.py +0 -17
  458. ccxt/async_support/bitfinex2.py +0 -3552
  459. ccxt/async_support/bitpanda.py +0 -16
  460. ccxt/async_support/bl3p.py +0 -485
  461. ccxt/async_support/coinlist.py +0 -2243
  462. ccxt/async_support/currencycom.py +0 -1950
  463. ccxt/async_support/hitbtc3.py +0 -16
  464. ccxt/async_support/idex.py +0 -1766
  465. ccxt/async_support/kuna.py +0 -1841
  466. ccxt/async_support/lykke.py +0 -1270
  467. ccxt/async_support/poloniexfutures.py +0 -1717
  468. ccxt/async_support/wazirx.py +0 -1224
  469. ccxt/bitbay.py +0 -17
  470. ccxt/bitcoincom.py +0 -17
  471. ccxt/bitfinex2.py +0 -3552
  472. ccxt/bitpanda.py +0 -16
  473. ccxt/bl3p.py +0 -485
  474. ccxt/coinlist.py +0 -2243
  475. ccxt/currencycom.py +0 -1950
  476. ccxt/hitbtc3.py +0 -16
  477. ccxt/idex.py +0 -1766
  478. ccxt/kuna.py +0 -1841
  479. ccxt/lykke.py +0 -1270
  480. ccxt/poloniexfutures.py +0 -1717
  481. ccxt/pro/bitcoincom.py +0 -34
  482. ccxt/pro/bitfinex2.py +0 -1083
  483. ccxt/pro/bitpanda.py +0 -15
  484. ccxt/pro/currencycom.py +0 -536
  485. ccxt/pro/idex.py +0 -672
  486. ccxt/pro/poloniexfutures.py +0 -990
  487. ccxt/pro/wazirx.py +0 -749
  488. ccxt/test/base/__init__.py +0 -29
  489. ccxt/test/base/test_account.py +0 -26
  490. ccxt/test/base/test_balance.py +0 -56
  491. ccxt/test/base/test_borrow_interest.py +0 -35
  492. ccxt/test/base/test_borrow_rate.py +0 -32
  493. ccxt/test/base/test_calculate_fee.py +0 -51
  494. ccxt/test/base/test_crypto.py +0 -127
  495. ccxt/test/base/test_currency.py +0 -76
  496. ccxt/test/base/test_datetime.py +0 -109
  497. ccxt/test/base/test_decimal_to_precision.py +0 -392
  498. ccxt/test/base/test_deep_extend.py +0 -68
  499. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  500. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  501. ccxt/test/base/test_funding_rate_history.py +0 -29
  502. ccxt/test/base/test_last_price.py +0 -31
  503. ccxt/test/base/test_ledger_entry.py +0 -45
  504. ccxt/test/base/test_ledger_item.py +0 -48
  505. ccxt/test/base/test_leverage_tier.py +0 -33
  506. ccxt/test/base/test_liquidation.py +0 -50
  507. ccxt/test/base/test_margin_mode.py +0 -24
  508. ccxt/test/base/test_margin_modification.py +0 -35
  509. ccxt/test/base/test_market.py +0 -193
  510. ccxt/test/base/test_number.py +0 -411
  511. ccxt/test/base/test_ohlcv.py +0 -33
  512. ccxt/test/base/test_open_interest.py +0 -32
  513. ccxt/test/base/test_order.py +0 -64
  514. ccxt/test/base/test_order_book.py +0 -69
  515. ccxt/test/base/test_position.py +0 -60
  516. ccxt/test/base/test_shared_methods.py +0 -353
  517. ccxt/test/base/test_status.py +0 -24
  518. ccxt/test/base/test_throttle.py +0 -126
  519. ccxt/test/base/test_ticker.py +0 -92
  520. ccxt/test/base/test_trade.py +0 -47
  521. ccxt/test/base/test_trading_fee.py +0 -26
  522. ccxt/test/base/test_transaction.py +0 -39
  523. ccxt/test/test_async.py +0 -1649
  524. ccxt/test/test_sync.py +0 -1648
  525. ccxt/wazirx.py +0 -1224
  526. ccxt_ir-4.3.46.0.3.dist-info/RECORD +0 -773
  527. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  528. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.1.dist-info/licenses}/LICENSE.txt +0 -0
  529. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.1.dist-info}/top_level.txt +0 -0
@@ -1,411 +0,0 @@
1
- import os
2
- import sys
3
-
4
- root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
5
- sys.path.append(root)
6
-
7
- # ----------------------------------------------------------------------------
8
-
9
- # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
10
- # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
11
-
12
- # ----------------------------------------------------------------------------
13
-
14
- from ccxt.base.decimal_to_precision import decimal_to_precision # noqa F401
15
- from ccxt.base.decimal_to_precision import TRUNCATE # noqa F401
16
- from ccxt.base.decimal_to_precision import ROUND # noqa F401
17
- from ccxt.base.decimal_to_precision import DECIMAL_PLACES # noqa F401
18
- from ccxt.base.decimal_to_precision import SIGNIFICANT_DIGITS # noqa F401
19
- from ccxt.base.decimal_to_precision import TICK_SIZE # noqa F401
20
- from ccxt.base.decimal_to_precision import PAD_WITH_ZERO # noqa F401
21
- from ccxt.base.decimal_to_precision import NO_PADDING # noqa F401
22
- from ccxt.base.decimal_to_precision import number_to_string # noqa F401
23
- from ccxt.base.exchange import Exchange # noqa F401
24
- from ccxt.base.precise import Precise # noqa F401
25
-
26
- # eslint-disable-next-line import/newline-after-import
27
-
28
- # ----------------------------------------------------------------------------
29
- # number_to_string
30
-
31
- assert number_to_string(-7.8e-7) == '-0.00000078'
32
- assert number_to_string(7.8e-7) == '0.00000078'
33
- assert number_to_string(-17.805e-7) == '-0.0000017805'
34
- assert number_to_string(17.805e-7) == '0.0000017805'
35
- assert number_to_string(-7.0005e27) == '-7000500000000000000000000000'
36
- assert number_to_string(7.0005e27) == '7000500000000000000000000000'
37
- assert number_to_string(-7.9e27) == '-7900000000000000000000000000'
38
- assert number_to_string(7e27) == '7000000000000000000000000000'
39
- assert number_to_string(7.9e27) == '7900000000000000000000000000'
40
- assert number_to_string(-12.345) == '-12.345'
41
- assert number_to_string(12.345) == '12.345'
42
- assert number_to_string(0) == '0'
43
- assert number_to_string(7.35946e21) == '7359460000000000000000'
44
- assert number_to_string(0.00000001) == '0.00000001'
45
- assert number_to_string(1e-7) == '0.0000001'
46
- assert number_to_string(-1e-7) == '-0.0000001'
47
-
48
- # ----------------------------------------------------------------------------
49
- # testDecimalToPrecisionTruncationToNDigitsAfterDot
50
-
51
- assert decimal_to_precision('12.3456000', TRUNCATE, 100, DECIMAL_PLACES) == '12.3456'
52
- assert decimal_to_precision('12.3456', TRUNCATE, 100, DECIMAL_PLACES) == '12.3456'
53
- assert decimal_to_precision('12.3456', TRUNCATE, 4, DECIMAL_PLACES) == '12.3456'
54
- assert decimal_to_precision('12.3456', TRUNCATE, 3, DECIMAL_PLACES) == '12.345'
55
- assert decimal_to_precision('12.3456', TRUNCATE, 2, DECIMAL_PLACES) == '12.34'
56
- assert decimal_to_precision('12.3456', TRUNCATE, 1, DECIMAL_PLACES) == '12.3'
57
- assert decimal_to_precision('12.3456', TRUNCATE, 0, DECIMAL_PLACES) == '12'
58
- # ['12.3456', TRUNCATE, -1, DECIMAL_PLACES, '10'], # not yet supported
59
- # ['123.456', TRUNCATE, -2, DECIMAL_PLACES, '120'], # not yet supported
60
- # ['123.456', TRUNCATE, -3, DECIMAL_PLACES, '100'], # not yet supported
61
-
62
- assert decimal_to_precision('0.0000001', TRUNCATE, 8, DECIMAL_PLACES) == '0.0000001'
63
- assert decimal_to_precision('0.00000001', TRUNCATE, 8, DECIMAL_PLACES) == '0.00000001'
64
-
65
- assert decimal_to_precision('0.000000000', TRUNCATE, 9, DECIMAL_PLACES, PAD_WITH_ZERO) == '0.000000000'
66
- assert decimal_to_precision('0.000000001', TRUNCATE, 9, DECIMAL_PLACES, PAD_WITH_ZERO) == '0.000000001'
67
-
68
- assert decimal_to_precision('12.3456', TRUNCATE, -1, DECIMAL_PLACES) == '10'
69
- assert decimal_to_precision('123.456', TRUNCATE, -1, DECIMAL_PLACES) == '120'
70
- assert decimal_to_precision('123.456', TRUNCATE, -2, DECIMAL_PLACES) == '100'
71
- assert decimal_to_precision('9.99999', TRUNCATE, -1, DECIMAL_PLACES) == '0'
72
- assert decimal_to_precision('99.9999', TRUNCATE, -1, DECIMAL_PLACES) == '90'
73
- assert decimal_to_precision('99.9999', TRUNCATE, -2, DECIMAL_PLACES) == '0'
74
-
75
- assert decimal_to_precision('0', TRUNCATE, 0, DECIMAL_PLACES) == '0'
76
- assert decimal_to_precision('-0.9', TRUNCATE, 0, DECIMAL_PLACES) == '0'
77
-
78
- # ----------------------------------------------------------------------------
79
- # testDecimalToPrecisionTruncationToNSignificantDigits
80
-
81
- assert decimal_to_precision('0.000123456700', TRUNCATE, 100, SIGNIFICANT_DIGITS) == '0.0001234567'
82
- assert decimal_to_precision('0.0001234567', TRUNCATE, 100, SIGNIFICANT_DIGITS) == '0.0001234567'
83
- assert decimal_to_precision('0.0001234567', TRUNCATE, 7, SIGNIFICANT_DIGITS) == '0.0001234567'
84
-
85
- assert decimal_to_precision('0.000123456', TRUNCATE, 6, SIGNIFICANT_DIGITS) == '0.000123456'
86
- assert decimal_to_precision('0.000123456', TRUNCATE, 5, SIGNIFICANT_DIGITS) == '0.00012345'
87
- assert decimal_to_precision('0.000123456', TRUNCATE, 2, SIGNIFICANT_DIGITS) == '0.00012'
88
- assert decimal_to_precision('0.000123456', TRUNCATE, 1, SIGNIFICANT_DIGITS) == '0.0001'
89
-
90
- assert decimal_to_precision('123.0000987654', TRUNCATE, 10, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) == '123.0000987'
91
- assert decimal_to_precision('123.0000987654', TRUNCATE, 8, SIGNIFICANT_DIGITS) == '123.00009'
92
- assert decimal_to_precision('123.0000987654', TRUNCATE, 7, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) == '123.0000'
93
- assert decimal_to_precision('123.0000987654', TRUNCATE, 6, SIGNIFICANT_DIGITS) == '123'
94
- assert decimal_to_precision('123.0000987654', TRUNCATE, 5, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) == '123.00'
95
- assert decimal_to_precision('123.0000987654', TRUNCATE, 4, SIGNIFICANT_DIGITS) == '123'
96
- assert decimal_to_precision('123.0000987654', TRUNCATE, 4, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) == '123.0'
97
- assert decimal_to_precision('123.0000987654', TRUNCATE, 3, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) == '123'
98
- assert decimal_to_precision('123.0000987654', TRUNCATE, 2, SIGNIFICANT_DIGITS) == '120'
99
- assert decimal_to_precision('123.0000987654', TRUNCATE, 1, SIGNIFICANT_DIGITS) == '100'
100
- assert decimal_to_precision('123.0000987654', TRUNCATE, 1, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) == '100'
101
-
102
- assert decimal_to_precision('1234', TRUNCATE, 5, SIGNIFICANT_DIGITS) == '1234'
103
- assert decimal_to_precision('1234', TRUNCATE, 5, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) == '1234.0'
104
- assert decimal_to_precision('1234', TRUNCATE, 4, SIGNIFICANT_DIGITS) == '1234'
105
- assert decimal_to_precision('1234', TRUNCATE, 4, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) == '1234'
106
- assert decimal_to_precision('1234.69', TRUNCATE, 0, SIGNIFICANT_DIGITS) == '0'
107
- assert decimal_to_precision('1234.69', TRUNCATE, 0, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) == '0'
108
-
109
- # ----------------------------------------------------------------------------
110
- # testDecimalToPrecisionRoundingToNDigitsAfterDot
111
-
112
- assert decimal_to_precision('12.3456000', ROUND, 100, DECIMAL_PLACES) == '12.3456'
113
- assert decimal_to_precision('12.3456', ROUND, 100, DECIMAL_PLACES) == '12.3456'
114
- assert decimal_to_precision('12.3456', ROUND, 4, DECIMAL_PLACES) == '12.3456'
115
- assert decimal_to_precision('12.3456', ROUND, 3, DECIMAL_PLACES) == '12.346'
116
- assert decimal_to_precision('12.3456', ROUND, 2, DECIMAL_PLACES) == '12.35'
117
- assert decimal_to_precision('12.3456', ROUND, 1, DECIMAL_PLACES) == '12.3'
118
- assert decimal_to_precision('12.3456', ROUND, 0, DECIMAL_PLACES) == '12'
119
-
120
- # todo:
121
- # ['9.999', ROUND, 3, DECIMAL_PLACES, NO_PADDING, '9.999'],
122
- # ['9.999', ROUND, 2, DECIMAL_PLACES, NO_PADDING, '10'],
123
- # ['9.999', ROUND, 2, DECIMAL_PLACES, PAD_WITH_ZERO, '10.00'],
124
- # ['99.999', ROUND, 2, DECIMAL_PLACES, PAD_WITH_ZERO, '100.00'],
125
- # ['-99.999', ROUND, 2, DECIMAL_PLACES, PAD_WITH_ZERO, '-100.00'],
126
-
127
- # ['12.3456', ROUND, -1, DECIMAL_PLACES, NO_PADDING, '10'], # not yet supported
128
- # ['123.456', ROUND, -1, DECIMAL_PLACES, NO_PADDING, '120'], # not yet supported
129
- # ['123.456', ROUND, -2, DECIMAL_PLACES, NO_PADDING, '100'], # not yet supported
130
-
131
- # a problematic case in PHP
132
- assert decimal_to_precision('10000', ROUND, 6, DECIMAL_PLACES) == '10000'
133
- assert decimal_to_precision('0.00003186', ROUND, 8, DECIMAL_PLACES) == '0.00003186'
134
-
135
- assert decimal_to_precision('12.3456', ROUND, -1, DECIMAL_PLACES) == '10'
136
- assert decimal_to_precision('123.456', ROUND, -1, DECIMAL_PLACES) == '120'
137
- assert decimal_to_precision('123.456', ROUND, -2, DECIMAL_PLACES) == '100'
138
- assert decimal_to_precision('9.99999', ROUND, -1, DECIMAL_PLACES) == '10'
139
- assert decimal_to_precision('99.9999', ROUND, -1, DECIMAL_PLACES) == '100'
140
- assert decimal_to_precision('99.9999', ROUND, -2, DECIMAL_PLACES) == '100'
141
-
142
- assert decimal_to_precision('9.999', ROUND, 3, DECIMAL_PLACES) == '9.999'
143
- assert decimal_to_precision('9.999', ROUND, 2, DECIMAL_PLACES) == '10'
144
- assert decimal_to_precision('9.999', ROUND, 2, DECIMAL_PLACES, PAD_WITH_ZERO) == '10.00'
145
- assert decimal_to_precision('99.999', ROUND, 2, DECIMAL_PLACES, PAD_WITH_ZERO) == '100.00'
146
- assert decimal_to_precision('-99.999', ROUND, 2, DECIMAL_PLACES, PAD_WITH_ZERO) == '-100.00'
147
-
148
- # ----------------------------------------------------------------------------
149
- # testDecimalToPrecisionRoundingToNSignificantDigits
150
-
151
- assert decimal_to_precision('0.000123456700', ROUND, 100, SIGNIFICANT_DIGITS) == '0.0001234567'
152
- assert decimal_to_precision('0.0001234567', ROUND, 100, SIGNIFICANT_DIGITS) == '0.0001234567'
153
- assert decimal_to_precision('0.0001234567', ROUND, 7, SIGNIFICANT_DIGITS) == '0.0001234567'
154
-
155
- assert decimal_to_precision('0.000123456', ROUND, 6, SIGNIFICANT_DIGITS) == '0.000123456'
156
- assert decimal_to_precision('0.000123456', ROUND, 5, SIGNIFICANT_DIGITS) == '0.00012346'
157
- assert decimal_to_precision('0.000123456', ROUND, 4, SIGNIFICANT_DIGITS) == '0.0001235'
158
- assert decimal_to_precision('0.00012', ROUND, 2, SIGNIFICANT_DIGITS) == '0.00012'
159
- assert decimal_to_precision('0.0001', ROUND, 1, SIGNIFICANT_DIGITS) == '0.0001'
160
-
161
- assert decimal_to_precision('123.0000987654', ROUND, 7, SIGNIFICANT_DIGITS) == '123.0001'
162
- assert decimal_to_precision('123.0000987654', ROUND, 6, SIGNIFICANT_DIGITS) == '123'
163
-
164
- assert decimal_to_precision('0.00098765', ROUND, 2, SIGNIFICANT_DIGITS) == '0.00099'
165
- assert decimal_to_precision('0.00098765', ROUND, 2, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) == '0.00099'
166
-
167
- assert decimal_to_precision('0.00098765', ROUND, 1, SIGNIFICANT_DIGITS) == '0.001'
168
- assert decimal_to_precision('0.00098765', ROUND, 10, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) == '0.0009876500000'
169
-
170
- assert decimal_to_precision('0.098765', ROUND, 1, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) == '0.1'
171
-
172
- assert decimal_to_precision('0', ROUND, 0, SIGNIFICANT_DIGITS) == '0'
173
- assert decimal_to_precision('-0.123', ROUND, 0, SIGNIFICANT_DIGITS) == '0'
174
-
175
- assert decimal_to_precision('0.00000044', ROUND, 5, SIGNIFICANT_DIGITS) == '0.00000044'
176
-
177
- # ----------------------------------------------------------------------------
178
- # testDecimalToPrecisionRoundingToTickSize
179
-
180
- assert decimal_to_precision('0.000123456700', ROUND, 0.00012, TICK_SIZE) == '0.00012'
181
- assert decimal_to_precision('0.0001234567', ROUND, 0.00013, TICK_SIZE) == '0.00013'
182
- assert decimal_to_precision('0.0001234567', TRUNCATE, 0.00013, TICK_SIZE) == '0'
183
- assert decimal_to_precision('101.000123456700', ROUND, 100, TICK_SIZE) == '100'
184
- assert decimal_to_precision('0.000123456700', ROUND, 100, TICK_SIZE) == '0'
185
- assert decimal_to_precision('165', TRUNCATE, 110, TICK_SIZE) == '110'
186
- assert decimal_to_precision('3210', TRUNCATE, 1110, TICK_SIZE) == '2220'
187
- assert decimal_to_precision('165', ROUND, 110, TICK_SIZE) == '220'
188
- assert decimal_to_precision('0.000123456789', ROUND, 0.00000012, TICK_SIZE) == '0.00012348'
189
- assert decimal_to_precision('0.000123456789', TRUNCATE, 0.00000012, TICK_SIZE) == '0.00012336'
190
- assert decimal_to_precision('0.000273398', ROUND, 1e-7, TICK_SIZE) == '0.0002734'
191
-
192
- assert decimal_to_precision('0.00005714', TRUNCATE, 0.00000001, TICK_SIZE) == '0.00005714'
193
- # self line causes problems in JS, fix with Precise
194
- # assert decimal_to_precision('0.0000571495257361', TRUNCATE, 0.00000001, TICK_SIZE) == '0.00005714'
195
-
196
- assert decimal_to_precision('0.01', ROUND, 0.0001, TICK_SIZE, PAD_WITH_ZERO) == '0.0100'
197
- assert decimal_to_precision('0.01', TRUNCATE, 0.0001, TICK_SIZE, PAD_WITH_ZERO) == '0.0100'
198
-
199
- assert decimal_to_precision('-0.000123456789', ROUND, 0.00000012, TICK_SIZE) == '-0.00012348'
200
- assert decimal_to_precision('-0.000123456789', TRUNCATE, 0.00000012, TICK_SIZE) == '-0.00012336'
201
- assert decimal_to_precision('-165', TRUNCATE, 110, TICK_SIZE) == '-110'
202
- assert decimal_to_precision('-165', ROUND, 110, TICK_SIZE) == '-220'
203
- assert decimal_to_precision('-1650', TRUNCATE, 1100, TICK_SIZE) == '-1100'
204
- assert decimal_to_precision('-1650', ROUND, 1100, TICK_SIZE) == '-2200'
205
-
206
- assert decimal_to_precision('0.0006', TRUNCATE, 0.0001, TICK_SIZE) == '0.0006'
207
- assert decimal_to_precision('-0.0006', TRUNCATE, 0.0001, TICK_SIZE) == '-0.0006'
208
- assert decimal_to_precision('0.6', TRUNCATE, 0.2, TICK_SIZE) == '0.6'
209
- assert decimal_to_precision('-0.6', TRUNCATE, 0.2, TICK_SIZE) == '-0.6'
210
- assert decimal_to_precision('1.2', ROUND, 0.4, TICK_SIZE) == '1.2'
211
- assert decimal_to_precision('-1.2', ROUND, 0.4, TICK_SIZE) == '-1.2'
212
- assert decimal_to_precision('1.2', ROUND, 0.02, TICK_SIZE) == '1.2'
213
- assert decimal_to_precision('-1.2', ROUND, 0.02, TICK_SIZE) == '-1.2'
214
- assert decimal_to_precision('44', ROUND, 4.4, TICK_SIZE) == '44'
215
- assert decimal_to_precision('-44', ROUND, 4.4, TICK_SIZE) == '-44'
216
- assert decimal_to_precision('44.00000001', ROUND, 4.4, TICK_SIZE) == '44'
217
- assert decimal_to_precision('-44.00000001', ROUND, 4.4, TICK_SIZE) == '-44'
218
-
219
- # https://github.com/ccxt/ccxt/issues/6731
220
- assert decimal_to_precision('20', TRUNCATE, 0.00000001, TICK_SIZE) == '20'
221
-
222
- # ----------------------------------------------------------------------------
223
- # testDecimalToPrecisionNegativeNumbers
224
-
225
- assert decimal_to_precision('-0.123456', TRUNCATE, 5, DECIMAL_PLACES) == '-0.12345'
226
- assert decimal_to_precision('-0.123456', ROUND, 5, DECIMAL_PLACES) == '-0.12346'
227
-
228
- # ----------------------------------------------------------------------------
229
- # decimal_to_precision: without dot / trailing dot
230
-
231
- assert decimal_to_precision('123', TRUNCATE, 0) == '123'
232
-
233
- assert decimal_to_precision('123', TRUNCATE, 5, DECIMAL_PLACES) == '123'
234
- assert decimal_to_precision('123', TRUNCATE, 5, DECIMAL_PLACES, PAD_WITH_ZERO) == '123.00000'
235
-
236
- assert decimal_to_precision('123.', TRUNCATE, 0, DECIMAL_PLACES) == '123'
237
- assert decimal_to_precision('123.', TRUNCATE, 5, DECIMAL_PLACES, PAD_WITH_ZERO) == '123.00000'
238
-
239
- assert decimal_to_precision('0.', TRUNCATE, 0) == '0'
240
- assert decimal_to_precision('0.', TRUNCATE, 5, DECIMAL_PLACES, PAD_WITH_ZERO) == '0.00000'
241
-
242
- # ----------------------------------------------------------------------------
243
- # decimal_to_precision: rounding for equidistant digits
244
-
245
- assert decimal_to_precision('1.44', ROUND, 1, DECIMAL_PLACES) == '1.4'
246
- assert decimal_to_precision('1.45', ROUND, 1, DECIMAL_PLACES) == '1.5'
247
- assert decimal_to_precision('1.45', ROUND, 0, DECIMAL_PLACES) == '1' # not 2
248
-
249
- # ----------------------------------------------------------------------------
250
- # negative precision only implemented so far in python
251
- # pretty useless for decimal applications |x| < 5 == 0
252
- # NO_PADDING and PAD_WITH_ZERO are ignored
253
-
254
- assert decimal_to_precision('5', ROUND, -1, DECIMAL_PLACES) == '10'
255
- assert decimal_to_precision('4.999', ROUND, -1, DECIMAL_PLACES) == '0'
256
- assert decimal_to_precision('0.0431531423', ROUND, -1, DECIMAL_PLACES) == '0'
257
- assert decimal_to_precision('-69.3', ROUND, -1, DECIMAL_PLACES) == '-70'
258
- assert decimal_to_precision('5001', ROUND, -4, DECIMAL_PLACES) == '10000'
259
- assert decimal_to_precision('4999.999', ROUND, -4, DECIMAL_PLACES) == '0'
260
-
261
- assert decimal_to_precision('69.3', TRUNCATE, -2, DECIMAL_PLACES) == '0'
262
- assert decimal_to_precision('-69.3', TRUNCATE, -2, DECIMAL_PLACES) == '0'
263
- assert decimal_to_precision('69.3', TRUNCATE, -1, SIGNIFICANT_DIGITS) == '60'
264
- assert decimal_to_precision('-69.3', TRUNCATE, -1, SIGNIFICANT_DIGITS) == '-60'
265
- assert decimal_to_precision('69.3', TRUNCATE, -2, SIGNIFICANT_DIGITS) == '0'
266
- assert decimal_to_precision('1602000000000000000000', TRUNCATE, 3, SIGNIFICANT_DIGITS) == '1600000000000000000000'
267
-
268
- # ----------------------------------------------------------------------------
269
- # decimal_to_precision: stringified precision
270
- assert decimal_to_precision('-0.000123456789', ROUND, '0.00000012', TICK_SIZE) == '-0.00012348'
271
- assert decimal_to_precision('-0.000123456789', TRUNCATE, '0.00000012', TICK_SIZE) == '-0.00012336'
272
- assert decimal_to_precision('-165', TRUNCATE, '110', TICK_SIZE) == '-110'
273
- assert decimal_to_precision('-165', ROUND, '110', TICK_SIZE) == '-220'
274
-
275
- # ----------------------------------------------------------------------------
276
- # testDecimalToPrecisionErrorHandling(todo)
277
- #
278
- # throws(() =>
279
- # decimal_to_precision('123456.789', TRUNCATE, -2, DECIMAL_PLACES),
280
- # 'negative precision is not yet supported')
281
- #
282
- # throws(() =>
283
- # decimal_to_precision('foo'),
284
- # "invalid number(contains an illegal character 'f')")
285
- #
286
- # throws(() =>
287
- # decimal_to_precision('0.01', TRUNCATE, -1, TICK_SIZE),
288
- # "TICK_SIZE cant be used with negative numPrecisionDigits")
289
-
290
- # ----------------------------------------------------------------------------
291
-
292
- w = '-1.123e-6'
293
- x = '0.00000002'
294
- y = '69696900000'
295
- z = '0'
296
- a = '1e8'
297
-
298
- assert Precise.string_mul(x, y) == '1393.938'
299
- assert Precise.string_mul(y, x) == '1393.938'
300
- assert Precise.string_add(x, y) == '69696900000.00000002'
301
- assert Precise.string_add(y, x) == '69696900000.00000002'
302
- assert Precise.string_sub(x, y) == '-69696899999.99999998'
303
- assert Precise.string_sub(y, x) == '69696899999.99999998'
304
- assert Precise.string_div(x, y, 1) == '0'
305
- assert Precise.string_div(x, y) == '0'
306
- assert Precise.string_div(x, y, 19) == '0.0000000000000000002'
307
- assert Precise.string_div(x, y, 20) == '0.00000000000000000028'
308
- assert Precise.string_div(x, y, 21) == '0.000000000000000000286'
309
- assert Precise.string_div(x, y, 22) == '0.0000000000000000002869'
310
- assert Precise.string_div(y, x) == '3484845000000000000'
311
-
312
- assert Precise.string_mul(x, w) == '-0.00000000000002246'
313
- assert Precise.string_mul(w, x) == '-0.00000000000002246'
314
- assert Precise.string_add(x, w) == '-0.000001103'
315
- assert Precise.string_add(w, x) == '-0.000001103'
316
- assert Precise.string_sub(x, w) == '0.000001143'
317
- assert Precise.string_sub(w, x) == '-0.000001143'
318
- assert Precise.string_div(x, w) == '-0.017809439002671415'
319
- assert Precise.string_div(w, x) == '-56.15'
320
-
321
- assert Precise.string_mul(z, w) == '0'
322
- assert Precise.string_mul(z, x) == '0'
323
- assert Precise.string_mul(z, y) == '0'
324
- assert Precise.string_mul(w, z) == '0'
325
- assert Precise.string_mul(x, z) == '0'
326
- assert Precise.string_mul(y, z) == '0'
327
- assert Precise.string_add(z, w) == '-0.000001123'
328
- assert Precise.string_add(z, x) == '0.00000002'
329
- assert Precise.string_add(z, y) == '69696900000'
330
- assert Precise.string_add(w, z) == '-0.000001123'
331
- assert Precise.string_add(x, z) == '0.00000002'
332
- assert Precise.string_add(y, z) == '69696900000'
333
-
334
- assert Precise.string_mul(x, a) == '2'
335
- assert Precise.string_mul(a, x) == '2'
336
- assert Precise.string_mul(y, a) == '6969690000000000000'
337
- assert Precise.string_mul(a, y) == '6969690000000000000'
338
- assert Precise.string_div(y, a) == '696.969'
339
- assert Precise.string_div(y, a, -1) == '690'
340
- assert Precise.string_div(y, a, 0) == '696'
341
- assert Precise.string_div(y, a, 1) == '696.9'
342
- assert Precise.string_div(y, a, 2) == '696.96'
343
- assert Precise.string_div(a, y) == '0.001434784043479695'
344
-
345
- assert Precise.string_abs('0') == '0'
346
- assert Precise.string_abs('-0') == '0'
347
- assert Precise.string_abs('-500.1') == '500.1'
348
- assert Precise.string_abs('213') == '213'
349
-
350
- assert Precise.string_neg('0') == '0'
351
- assert Precise.string_neg('-0') == '0'
352
- assert Precise.string_neg('-500.1') == '500.1'
353
- assert Precise.string_neg('213') == '-213'
354
-
355
- assert Precise.string_mod('57.123', '10') == '7.123'
356
- assert Precise.string_mod('18', '6') == '0'
357
- assert Precise.string_mod('10.1', '0.5') == '0.1'
358
- assert Precise.string_mod('10000000', '5555') == '1000'
359
- assert Precise.string_mod('5550', '120') == '30'
360
-
361
- assert Precise.string_equals('1.0000', '1')
362
- assert Precise.string_equals('-0.0', '0')
363
- assert Precise.string_equals('-0.0', '0.0')
364
- assert Precise.string_equals('5.534000', '5.5340')
365
-
366
- assert Precise.string_min('1.0000', '2') == '1'
367
- assert Precise.string_min('2', '1.2345') == '1.2345'
368
- assert Precise.string_min('3.1415', '-2') == '-2'
369
- assert Precise.string_min('-3.1415', '-2') == '-3.1415'
370
- assert Precise.string_min('0.000', '-0.0') == '0'
371
-
372
- assert Precise.string_max('1.0000', '2') == '2'
373
- assert Precise.string_max('2', '1.2345') == '2'
374
- assert Precise.string_max('3.1415', '-2') == '3.1415'
375
- assert Precise.string_max('-3.1415', '-2') == '-2'
376
- assert Precise.string_max('0.000', '-0.0') == '0'
377
-
378
- assert not Precise.string_gt('1.0000', '2')
379
- assert Precise.string_gt('2', '1.2345')
380
- assert Precise.string_gt('3.1415', '-2')
381
- assert not Precise.string_gt('-3.1415', '-2')
382
- assert not Precise.string_gt('3.1415', '3.1415')
383
- assert Precise.string_gt('3.14150000000000000000001', '3.1415')
384
-
385
- assert not Precise.string_ge('1.0000', '2')
386
- assert Precise.string_ge('2', '1.2345')
387
- assert Precise.string_ge('3.1415', '-2')
388
- assert not Precise.string_ge('-3.1415', '-2')
389
- assert Precise.string_ge('3.1415', '3.1415')
390
- assert Precise.string_ge('3.14150000000000000000001', '3.1415')
391
-
392
- assert Precise.string_lt('1.0000', '2')
393
- assert not Precise.string_lt('2', '1.2345')
394
- assert not Precise.string_lt('3.1415', '-2')
395
- assert Precise.string_lt('-3.1415', '-2')
396
- assert not Precise.string_lt('3.1415', '3.1415')
397
- assert Precise.string_lt('3.1415', '3.14150000000000000000001')
398
-
399
- assert Precise.string_le('1.0000', '2')
400
- assert not Precise.string_le('2', '1.2345')
401
- assert not Precise.string_le('3.1415', '-2')
402
- assert Precise.string_le('-3.1415', '-2')
403
- assert Precise.string_le('3.1415', '3.1415')
404
- assert Precise.string_le('3.1415', '3.14150000000000000000001')
405
-
406
- # todo
407
- # $self->assertSame(0, Exchange::sum())
408
- # $self->assertSame(2, Exchange::sum(2))
409
- # $self->assertSame(432, Exchange::sum(2, 30, 400))
410
- # eslint-disable-next-line eol-last
411
- # $self->assertSame(439, Exchange::sum(2, null, [88], 30, '7', 400, null))
@@ -1,33 +0,0 @@
1
- import os
2
- import sys
3
-
4
- root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
5
- sys.path.append(root)
6
-
7
- # ----------------------------------------------------------------------------
8
-
9
- # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
10
- # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
11
-
12
- # ----------------------------------------------------------------------------
13
- # -*- coding: utf-8 -*-
14
-
15
- from ccxt.test.base import test_shared_methods # noqa E402
16
-
17
- def test_ohlcv(exchange, skipped_properties, method, entry, symbol, now):
18
- format = [1638230400000, exchange.parse_number('0.123'), exchange.parse_number('0.125'), exchange.parse_number('0.121'), exchange.parse_number('0.122'), exchange.parse_number('123.456')]
19
- empty_not_allowed_for = [0, 1, 2, 3, 4, 5]
20
- test_shared_methods.assert_structure(exchange, skipped_properties, method, entry, format, empty_not_allowed_for)
21
- test_shared_methods.assert_timestamp_and_datetime(exchange, skipped_properties, method, entry, now, 0)
22
- log_text = test_shared_methods.log_template(exchange, method, entry)
23
- #
24
- assert len(entry) >= 6, 'ohlcv array length should be >= 6;' + log_text
25
- if not ('roundTimestamp' in skipped_properties):
26
- test_shared_methods.assert_round_minute_timestamp(exchange, skipped_properties, method, entry, 0)
27
- high = exchange.safe_string(entry, 2)
28
- low = exchange.safe_string(entry, 3)
29
- test_shared_methods.assert_less_or_equal(exchange, skipped_properties, method, entry, '1', high)
30
- test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, '1', low)
31
- test_shared_methods.assert_less_or_equal(exchange, skipped_properties, method, entry, '4', high)
32
- test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, '4', low)
33
- assert (symbol is None) or (isinstance(symbol, str)), 'symbol ' + symbol + ' is incorrect' + log_text # todo: check with standard symbol check
@@ -1,32 +0,0 @@
1
- import os
2
- import sys
3
-
4
- root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
5
- sys.path.append(root)
6
-
7
- # ----------------------------------------------------------------------------
8
-
9
- # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
10
- # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
11
-
12
- # ----------------------------------------------------------------------------
13
- # -*- coding: utf-8 -*-
14
-
15
- from ccxt.test.base import test_shared_methods # noqa E402
16
-
17
- def test_open_interest(exchange, skipped_properties, method, entry):
18
- format = {
19
- 'symbol': 'BTC/USDT',
20
- 'openInterestAmount': exchange.parse_number('3544581864.598'),
21
- 'openInterestValue': exchange.parse_number('3544581864.598'),
22
- 'timestamp': 1649373600000,
23
- 'datetime': '2022-04-07T23:20:00.000Z',
24
- 'info': {},
25
- }
26
- empty_allowed_for = ['symbol', 'timestamp', 'openInterestAmount', 'openInterestValue', 'datetime']
27
- test_shared_methods.assert_structure(exchange, skipped_properties, method, entry, format, empty_allowed_for)
28
- test_shared_methods.assert_symbol(exchange, skipped_properties, method, entry, 'symbol')
29
- test_shared_methods.assert_timestamp_and_datetime(exchange, skipped_properties, method, entry)
30
- #
31
- test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'openInterestAmount', '0')
32
- test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'openInterestValue', '0')
@@ -1,64 +0,0 @@
1
- import os
2
- import sys
3
-
4
- root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
5
- sys.path.append(root)
6
-
7
- # ----------------------------------------------------------------------------
8
-
9
- # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
10
- # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
11
-
12
- # ----------------------------------------------------------------------------
13
- # -*- coding: utf-8 -*-
14
-
15
- from ccxt.test.base import test_shared_methods # noqa E402
16
- from ccxt.test.base.test_trade import test_trade # noqa E402
17
-
18
- def test_order(exchange, skipped_properties, method, entry, symbol, now):
19
- format = {
20
- 'info': {},
21
- 'id': '123',
22
- 'clientOrderId': '1234',
23
- 'timestamp': 1649373600000,
24
- 'datetime': '2022-04-07T23:20:00.000Z',
25
- 'lastTradeTimestamp': 1649373610000,
26
- 'symbol': 'XYZ/USDT',
27
- 'type': 'limit',
28
- 'timeInForce': 'GTC',
29
- 'postOnly': True,
30
- 'side': 'sell',
31
- 'price': exchange.parse_number('1.23456'),
32
- 'stopPrice': exchange.parse_number('1.1111'),
33
- 'amount': exchange.parse_number('1.23'),
34
- 'cost': exchange.parse_number('2.34'),
35
- 'average': exchange.parse_number('1.234'),
36
- 'filled': exchange.parse_number('1.23'),
37
- 'remaining': exchange.parse_number('0.123'),
38
- 'status': 'ok',
39
- 'fee': {},
40
- 'trades': [],
41
- }
42
- empty_allowed_for = ['clientOrderId', 'stopPrice', 'trades', 'timestamp', 'datetime', 'lastTradeTimestamp', 'average', 'type', 'timeInForce', 'postOnly', 'side', 'price', 'amount', 'cost', 'filled', 'remaining', 'status', 'fee'] # there are exchanges that return only order id, so we don't need to strictly requite all props to be set.
43
- test_shared_methods.assert_structure(exchange, skipped_properties, method, entry, format, empty_allowed_for)
44
- test_shared_methods.assert_timestamp_and_datetime(exchange, skipped_properties, method, entry, now)
45
- #
46
- test_shared_methods.assert_in_array(exchange, skipped_properties, method, entry, 'timeInForce', ['GTC', 'GTK', 'IOC', 'FOK', 'PO'])
47
- test_shared_methods.assert_in_array(exchange, skipped_properties, method, entry, 'status', ['open', 'closed', 'canceled'])
48
- test_shared_methods.assert_in_array(exchange, skipped_properties, method, entry, 'side', ['buy', 'sell'])
49
- test_shared_methods.assert_in_array(exchange, skipped_properties, method, entry, 'postOnly', [True, False])
50
- test_shared_methods.assert_symbol(exchange, skipped_properties, method, entry, 'symbol', symbol)
51
- test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'price', '0')
52
- test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'stopPrice', '0')
53
- test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'cost', '0')
54
- test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'average', '0')
55
- test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'filled', '0')
56
- test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'remaining', '0')
57
- test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'amount', '0')
58
- test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'amount', exchange.safe_string(entry, 'remaining'))
59
- test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'amount', exchange.safe_string(entry, 'filled'))
60
- if not ('trades' in skipped_properties):
61
- if entry['trades'] is not None:
62
- for i in range(0, len(entry['trades'])):
63
- test_trade(exchange, skipped_properties, method, entry['trades'][i], symbol, now)
64
- test_shared_methods.assert_fee_structure(exchange, skipped_properties, method, entry, 'fee')
@@ -1,69 +0,0 @@
1
- import os
2
- import sys
3
-
4
- root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
5
- sys.path.append(root)
6
-
7
- # ----------------------------------------------------------------------------
8
-
9
- # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
10
- # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
11
-
12
- # ----------------------------------------------------------------------------
13
- # -*- coding: utf-8 -*-
14
-
15
- from ccxt.base.precise import Precise # noqa E402
16
- from ccxt.test.base import test_shared_methods # noqa E402
17
-
18
- def test_order_book(exchange, skipped_properties, method, orderbook, symbol):
19
- format = {
20
- 'symbol': 'ETH/BTC',
21
- 'asks': [[exchange.parse_number('1.24'), exchange.parse_number('0.453')], [exchange.parse_number('1.25'), exchange.parse_number('0.157')]],
22
- 'bids': [[exchange.parse_number('1.23'), exchange.parse_number('0.123')], [exchange.parse_number('1.22'), exchange.parse_number('0.543')]],
23
- 'timestamp': 1504224000000,
24
- 'datetime': '2017-09-01T00:00:00',
25
- 'nonce': 134234234,
26
- }
27
- empty_allowed_for = ['nonce']
28
- # turn into copy: https://discord.com/channels/690203284119617602/921046068555313202/1220626834887282728
29
- orderbook = exchange.deep_extend({}, orderbook)
30
- test_shared_methods.assert_structure(exchange, skipped_properties, method, orderbook, format, empty_allowed_for)
31
- test_shared_methods.assert_timestamp_and_datetime(exchange, skipped_properties, method, orderbook)
32
- test_shared_methods.assert_symbol(exchange, skipped_properties, method, orderbook, 'symbol', symbol)
33
- log_text = test_shared_methods.log_template(exchange, method, orderbook)
34
- #
35
- if ('bid' in skipped_properties) or ('ask' in skipped_properties):
36
- return
37
- # todo: check non-emtpy arrays for bids/asks for toptier exchanges
38
- bids = orderbook['bids']
39
- bids_length = len(bids)
40
- for i in range(0, bids_length):
41
- current_bid_string = exchange.safe_string(bids[i], 0)
42
- if not ('compareToNextItem' in skipped_properties):
43
- next_i = i + 1
44
- if bids_length > next_i:
45
- next_bid_string = exchange.safe_string(bids[next_i], 0)
46
- assert Precise.string_gt(current_bid_string, next_bid_string), 'current bid should be > than the next one: ' + current_bid_string + '>' + next_bid_string + log_text
47
- if not ('compareToZero' in skipped_properties):
48
- # compare price & volume to zero
49
- test_shared_methods.assert_greater(exchange, skipped_properties, method, bids[i], 0, '0')
50
- test_shared_methods.assert_greater(exchange, skipped_properties, method, bids[i], 1, '0')
51
- asks = orderbook['asks']
52
- asks_length = len(asks)
53
- for i in range(0, asks_length):
54
- current_ask_string = exchange.safe_string(asks[i], 0)
55
- if not ('compareToNextItem' in skipped_properties):
56
- next_i = i + 1
57
- if asks_length > next_i:
58
- next_ask_string = exchange.safe_string(asks[next_i], 0)
59
- assert Precise.string_lt(current_ask_string, next_ask_string), 'current ask should be < than the next one: ' + current_ask_string + '<' + next_ask_string + log_text
60
- if not ('compareToZero' in skipped_properties):
61
- # compare price & volume to zero
62
- test_shared_methods.assert_greater(exchange, skipped_properties, method, asks[i], 0, '0')
63
- test_shared_methods.assert_greater(exchange, skipped_properties, method, asks[i], 1, '0')
64
- if not ('spread' in skipped_properties):
65
- if bids_length and asks_length:
66
- first_bid = exchange.safe_string(bids[0], 0)
67
- first_ask = exchange.safe_string(asks[0], 0)
68
- # check bid-ask spread
69
- assert Precise.string_lt(first_bid, first_ask), 'bids[0][0] (' + first_ask + ') should be < than asks[0][0] (' + first_ask + ')' + log_text