Qubx 1.2.3.dev3__tar.gz → 1.2.3.dev5__tar.gz

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 (310) hide show
  1. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/PKG-INFO +2 -2
  2. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/pyproject.toml +1 -1
  3. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/_version.py +2 -2
  4. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/binance/exchange.py +11 -68
  5. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/ta/indicators.pxd +2 -1
  6. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/ta/indicators.pyx +23 -9
  7. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/.gitignore +0 -0
  8. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/LICENSE +0 -0
  9. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/README.md +0 -0
  10. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/scripts/build.py +0 -0
  11. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/__init__.py +0 -0
  12. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/_nb_magic.py +0 -0
  13. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/__init__.py +0 -0
  14. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/account.py +0 -0
  15. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/broker.py +0 -0
  16. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/data.py +0 -0
  17. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/iteratedstream.py +0 -0
  18. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/management.py +0 -0
  19. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/ome.py +0 -0
  20. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/optimization.py +0 -0
  21. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/runner.py +0 -0
  22. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/sentinels.py +0 -0
  23. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/simulated_data.py +0 -0
  24. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/simulated_exchange.py +0 -0
  25. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/simulator.py +0 -0
  26. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/transfers.py +0 -0
  27. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/utils.py +0 -0
  28. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/__init__.py +0 -0
  29. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/commands.py +0 -0
  30. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/deploy.py +0 -0
  31. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/misc.py +0 -0
  32. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/release.py +0 -0
  33. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/resolver.py +0 -0
  34. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/s3.py +0 -0
  35. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/theme.py +0 -0
  36. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/tui.py +0 -0
  37. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/user_config.py +0 -0
  38. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/config.py +0 -0
  39. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/__init__.py +0 -0
  40. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/__init__.py +0 -0
  41. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/account.py +0 -0
  42. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/adapters/__init__.py +0 -0
  43. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/adapters/polling_adapter.py +0 -0
  44. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/broker.py +0 -0
  45. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/connection_manager.py +0 -0
  46. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/data.py +0 -0
  47. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exceptions.py +0 -0
  48. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchange_manager.py +0 -0
  49. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/__init__.py +0 -0
  50. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/base.py +0 -0
  51. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/binance/broker.py +0 -0
  52. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex.py +0 -0
  53. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex_account.py +0 -0
  54. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/gateio/__init__.py +0 -0
  55. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/gateio/gateio.py +0 -0
  56. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/hyperliquid/__init__.py +0 -0
  57. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/hyperliquid/account.py +0 -0
  58. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/hyperliquid/broker.py +0 -0
  59. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/hyperliquid/hyperliquid.py +0 -0
  60. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/kraken/kraken.py +0 -0
  61. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/okx/__init__.py +0 -0
  62. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/okx/account.py +0 -0
  63. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/okx/broker.py +0 -0
  64. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/okx/okx.py +0 -0
  65. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/factory.py +0 -0
  66. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/__init__.py +0 -0
  67. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/base.py +0 -0
  68. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/factory.py +0 -0
  69. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/funding_rate.py +0 -0
  70. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/liquidation.py +0 -0
  71. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/ohlc.py +0 -0
  72. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/open_interest.py +0 -0
  73. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/orderbook.py +0 -0
  74. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/quote.py +0 -0
  75. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/trade.py +0 -0
  76. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/rate_limits.py +0 -0
  77. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/subscription_config.py +0 -0
  78. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/subscription_manager.py +0 -0
  79. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/subscription_orchestrator.py +0 -0
  80. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/utils.py +0 -0
  81. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/warmup_service.py +0 -0
  82. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/registry.py +0 -0
  83. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/tardis/data.py +0 -0
  84. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/tardis/utils.py +0 -0
  85. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/__init__.py +0 -0
  86. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/builtin.py +0 -0
  87. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/decorator.py +0 -0
  88. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/executor.py +0 -0
  89. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/interfaces.py +0 -0
  90. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/server.py +0 -0
  91. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/types.py +0 -0
  92. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/__init__.py +0 -0
  93. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/account.py +0 -0
  94. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/basics.py +0 -0
  95. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/context.py +0 -0
  96. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/detectors/__init__.py +0 -0
  97. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/detectors/delisting.py +0 -0
  98. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/detectors/stale.py +0 -0
  99. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/errors.py +0 -0
  100. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/exceptions.py +0 -0
  101. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/helpers.py +0 -0
  102. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/initializer.py +0 -0
  103. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/interfaces.py +0 -0
  104. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/loggers.py +0 -0
  105. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/lookups.py +0 -0
  106. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/metrics.py +0 -0
  107. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/__init__.py +0 -0
  108. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/market.py +0 -0
  109. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/processing.py +0 -0
  110. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/subscription.py +0 -0
  111. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/trading.py +0 -0
  112. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/universe.py +0 -0
  113. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/utils.py +0 -0
  114. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/series.pxd +0 -0
  115. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/series.pyi +0 -0
  116. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/series.pyx +0 -0
  117. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/utils.pyi +0 -0
  118. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/utils.pyx +0 -0
  119. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/__init__.py +0 -0
  120. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/cache.py +0 -0
  121. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/containers.py +0 -0
  122. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/guards.py +0 -0
  123. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/registry.py +0 -0
  124. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storage.py +0 -0
  125. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/ccxt.py +0 -0
  126. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/csv.py +0 -0
  127. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/handy.py +0 -0
  128. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/multi.py +0 -0
  129. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/questdb.py +0 -0
  130. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/stub.py +0 -0
  131. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/utils.py +0 -0
  132. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/transformers.py +0 -0
  133. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/__init__.py +0 -0
  134. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/base.py +0 -0
  135. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/composite.py +0 -0
  136. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/csv.py +0 -0
  137. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/indicator.py +0 -0
  138. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/inmemory.py +0 -0
  139. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/prometheus.py +0 -0
  140. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/questdb.py +0 -0
  141. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/__init__.py +0 -0
  142. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/composite.py +0 -0
  143. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/formatters/__init__.py +0 -0
  144. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/formatters/base.py +0 -0
  145. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/formatters/incremental.py +0 -0
  146. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/formatters/slack.py +0 -0
  147. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/formatters/target_position.py +0 -0
  148. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/redis_streams.py +0 -0
  149. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/slack.py +0 -0
  150. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/gathering/simplest.py +0 -0
  151. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/health/__init__.py +0 -0
  152. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/health/base.py +0 -0
  153. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/health/dummy.py +0 -0
  154. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/loggers/__init__.py +0 -0
  155. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/loggers/csv.py +0 -0
  156. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/loggers/factory.py +0 -0
  157. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/loggers/inmemory.py +0 -0
  158. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/loggers/mongo.py +0 -0
  159. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/loggers/postgres.py +0 -0
  160. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/notifications/__init__.py +0 -0
  161. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/notifications/composite.py +0 -0
  162. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/notifications/slack.py +0 -0
  163. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/notifications/throttler.py +0 -0
  164. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/pandaz/__init__.py +0 -0
  165. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/pandaz/stats.py +0 -0
  166. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/pandaz/ta.py +0 -0
  167. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/pandaz/utils.py +0 -0
  168. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/plugins/__init__.py +0 -0
  169. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/plugins/loader.py +0 -0
  170. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/__init__.py +0 -0
  171. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/backend.py +0 -0
  172. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/config.py +0 -0
  173. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/engine.py +0 -0
  174. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/ip_resolver.py +0 -0
  175. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/manager.py +0 -0
  176. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/pools.py +0 -0
  177. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/redis_backend.py +0 -0
  178. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/_build.py +0 -0
  179. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/crypto-fees.ini +0 -0
  180. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/hyperliquid-spot.json +0 -0
  181. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/hyperliquid.f-perpetual.json +0 -0
  182. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-binance-spot.json +0 -0
  183. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-binance.cm-future.json +0 -0
  184. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-binance.cm-perpetual.json +0 -0
  185. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-binance.um-future.json +0 -0
  186. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-binance.um-perpetual.json +0 -0
  187. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-bitfinex.f-perpetual.json +0 -0
  188. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-kraken-spot.json +0 -0
  189. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-kraken.f-future.json +0 -0
  190. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-kraken.f-perpetual.json +0 -0
  191. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restarts/__init__.py +0 -0
  192. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restarts/state_resolvers.py +0 -0
  193. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restarts/time_finders.py +0 -0
  194. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/__init__.py +0 -0
  195. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/balance.py +0 -0
  196. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/factory.py +0 -0
  197. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/interfaces.py +0 -0
  198. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/position.py +0 -0
  199. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/signal.py +0 -0
  200. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/state.py +0 -0
  201. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/utils.py +0 -0
  202. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/state/__init__.py +0 -0
  203. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/state/dummy.py +0 -0
  204. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/state/redis.py +0 -0
  205. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/ta/__init__.py +0 -0
  206. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/ta/indicators.pyi +0 -0
  207. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/__init__.py +0 -0
  208. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/base.py +0 -0
  209. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/accounts.toml.j2 +0 -0
  210. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/config.yml.j2 +0 -0
  211. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/jlive.sh.j2 +0 -0
  212. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/jpaper.sh.j2 +0 -0
  213. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/pyproject.toml.j2 +0 -0
  214. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/src/{{ strategy_name }}/__init__.py.j2 +0 -0
  215. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/src/{{ strategy_name }}/strategy.py.j2 +0 -0
  216. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/template.yml +0 -0
  217. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.claude/skills/qubx-cli/SKILL.md +0 -0
  218. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.claude/skills/qubx-indicators/SKILL.md +0 -0
  219. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.claude/skills/simulation-explorer/SKILL.md +0 -0
  220. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.claude/skills/strategy-release/SKILL.md +0 -0
  221. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.github/workflows/ci.yml.j2 +0 -0
  222. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.gitignore.j2 +0 -0
  223. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.python-version +0 -0
  224. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.vscode/launch.json +0 -0
  225. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.vscode/settings.json +0 -0
  226. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.vscode/tasks.json +0 -0
  227. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/CLAUDE.md.j2 +0 -0
  228. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/README.md.j2 +0 -0
  229. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/configs/.gitkeep +0 -0
  230. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/justfile.j2 +0 -0
  231. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/pyproject.toml.j2 +0 -0
  232. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/research/.gitkeep +0 -0
  233. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/src/{{ strategy_name }}/__init__.py.j2 +0 -0
  234. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/src/{{ strategy_name }}/cli.py.j2 +0 -0
  235. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/src/{{ strategy_name }}/strategy.py.j2 +0 -0
  236. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/template.yml +0 -0
  237. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/tests/test_strategy.py.j2 +0 -0
  238. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/__init__.py.j2 +0 -0
  239. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/accounts.toml.j2 +0 -0
  240. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/config.yml.j2 +0 -0
  241. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/jlive.sh.j2 +0 -0
  242. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/jpaper.sh.j2 +0 -0
  243. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/strategy.py.j2 +0 -0
  244. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/template.yml +0 -0
  245. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/trackers/__init__.py +0 -0
  246. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/trackers/advanced.py +0 -0
  247. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/trackers/composite.py +0 -0
  248. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/trackers/rebalancers.py +0 -0
  249. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/trackers/riskctrl.py +0 -0
  250. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/trackers/sizers.py +0 -0
  251. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/__init__.py +0 -0
  252. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/_pyxreloader.py +0 -0
  253. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/charting/lookinglass.py +0 -0
  254. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/charting/mpl_helpers.py +0 -0
  255. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/charting/orderbook.py +0 -0
  256. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/collections.py +0 -0
  257. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/hft/__init__.py +0 -0
  258. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/hft/numba_utils.py +0 -0
  259. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/hft/orderbook.pyi +0 -0
  260. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/hft/orderbook.pyx +0 -0
  261. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/marketdata/binance.py +0 -0
  262. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/marketdata/ccxt.py +0 -0
  263. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/marketdata/dukas.py +0 -0
  264. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/misc.py +0 -0
  265. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/nonce.py +0 -0
  266. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/ntp.py +0 -0
  267. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/numbers_utils.py +0 -0
  268. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/orderbook.py +0 -0
  269. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/plotting/__init__.py +0 -0
  270. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/plotting/dashboard.py +0 -0
  271. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/plotting/data.py +0 -0
  272. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/plotting/interfaces.py +0 -0
  273. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/plotting/renderers/__init__.py +0 -0
  274. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/plotting/renderers/plotly.py +0 -0
  275. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/questdb.py +0 -0
  276. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/rate_limiter.py +0 -0
  277. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/results.py +0 -0
  278. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/ringbuffer.pxd +0 -0
  279. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/ringbuffer.pyi +0 -0
  280. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/ringbuffer.pyx +0 -0
  281. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/__init__.py +0 -0
  282. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/_jupyter_runner.pyt +0 -0
  283. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/accounts.py +0 -0
  284. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/configs.py +0 -0
  285. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/factory.py +0 -0
  286. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/kernel_service.py +0 -0
  287. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/runner.py +0 -0
  288. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/__init__.py +0 -0
  289. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/app.py +0 -0
  290. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/handlers.py +0 -0
  291. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/init_code.py +0 -0
  292. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/kernel.py +0 -0
  293. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/styles.tcss +0 -0
  294. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/__init__.py +0 -0
  295. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/account_summary.py +0 -0
  296. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/command_input.py +0 -0
  297. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/debug_log.py +0 -0
  298. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/orders_table.py +0 -0
  299. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/positions_table.py +0 -0
  300. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/quotes_table.py +0 -0
  301. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/repl_output.py +0 -0
  302. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/s3.py +0 -0
  303. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/slack.py +0 -0
  304. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/throttler.py +0 -0
  305. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/time.py +0 -0
  306. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/websocket_manager.py +0 -0
  307. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/tests/strategies/macd_crossover/src/macd_crossover/indicators/macd.py +0 -0
  308. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/tests/strategies/macd_crossover/src/macd_crossover/models/macd_crossover.py +0 -0
  309. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/tests/strategies/macd_crossover/src/macd_crossover/models/utils.py +0 -0
  310. {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/tests/strategies/obi_trader/src/obi_trader/models/obi_trader.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Qubx
3
- Version: 1.2.3.dev3
3
+ Version: 1.2.3.dev5
4
4
  Summary: Qubx - Quantitative Trading Framework
5
5
  Project-URL: homepage, https://xlydian.com
6
6
  Project-URL: repository, https://github.com/xLydianSoftware/Qubx
@@ -58,7 +58,7 @@ Requires-Dist: python-binance<2,>=1.0.19; extra == 'binance'
58
58
  Provides-Extra: bitfinex
59
59
  Requires-Dist: qubx-bitfinex-api<4,>=3.0.7; extra == 'bitfinex'
60
60
  Provides-Extra: connectors
61
- Requires-Dist: ccxt<5,>=4.2.68; extra == 'connectors'
61
+ Requires-Dist: ccxt<5,>=4.5.46; extra == 'connectors'
62
62
  Provides-Extra: jupyter
63
63
  Requires-Dist: jupyter-console<7,>=6.6.3; extra == 'jupyter'
64
64
  Requires-Dist: jupyter<2,>=1.1.1; extra == 'jupyter'
@@ -81,7 +81,7 @@ qubx = "qubx.cli.commands:main"
81
81
  # ============================================================
82
82
  [project.optional-dependencies]
83
83
  # Exchange connectors (ccxt-based)
84
- connectors = ["ccxt>=4.2.68,<5"]
84
+ connectors = ["ccxt>=4.5.46,<5"]
85
85
  # Binance-specific (historical data utilities)
86
86
  binance = ["python-binance>=1.0.19,<2"]
87
87
  # Bitfinex-specific (custom API client)
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.2.3.dev3'
22
- __version_tuple__ = version_tuple = (1, 2, 3, 'dev3')
21
+ __version__ = version = '1.2.3.dev5'
22
+ __version_tuple__ = version_tuple = (1, 2, 3, 'dev5')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -4,7 +4,7 @@ import ccxt.pro as cxp
4
4
  import pandas as pd
5
5
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheByTimestamp
6
6
  from ccxt.async_support.base.ws.client import Client
7
- from ccxt.base.errors import ArgumentsRequired, BadRequest, InsufficientFunds, NotSupported
7
+ from ccxt.base.errors import BadRequest, InsufficientFunds
8
8
  from ccxt.base.precise import Precise
9
9
  from ccxt.base.types import (
10
10
  Any,
@@ -52,76 +52,19 @@ class BinanceQV(CcxtFuturePatchMixin, cxp.binance):
52
52
 
53
53
  async def un_watch_bids_asks(self, symbols: Strings = None, params: dict = {}) -> Any:
54
54
  """
55
- unwatches best bid & ask for symbols
56
-
57
- https://developers.binance.com/docs/binance-spot-api-docs/web-socket-api#symbol-order-book-ticker
58
- https://developers.binance.com/docs/derivatives/usds-margined-futures/websocket-market-streams/All-Book-Tickers-Stream
59
- https://developers.binance.com/docs/derivatives/coin-margined-futures/websocket-market-streams/All-Book-Tickers-Stream
60
-
61
- :param str[] symbols: unified symbol of the market to fetch the ticker for
62
- :param dict [params]: extra parameters specific to the exchange API endpoint
63
- :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
55
+ Unsubscribes from the bookTicker stream for the given symbols.
56
+
57
+ Upstream ccxt ships un_watch_bids_asks as a NotSupported stub, but the
58
+ companion watch_multi_ticker_helper has a working isUnsubscribe branch
59
+ that mirrors the subscribe path exactly (URL, sub-hashes, request body).
60
+ Delegating keeps us aligned with upstream's 2026-04 USDⓈ-M URL split
61
+ (/public/ws) and avoids duplicating internals that have already been
62
+ refactored once (get_message_hash was removed in ccxt 4.5.20).
64
63
  """
65
64
  await self.load_markets()
66
- methodName = "watchBidsAsks"
67
- channelName = "bookTicker"
68
65
  symbols = self.market_symbols(symbols, None, True, False, True)
69
- firstMarket = None
70
- marketType = None
71
- symbolsDefined = symbols is not None
72
- if symbolsDefined:
73
- firstMarket = self.market(symbols[0])
74
- marketType, params = self.handle_market_type_and_params(methodName, firstMarket, params)
75
- subType = None
76
- subType, params = self.handle_sub_type_and_params(methodName, firstMarket, params)
77
- rawMarketType = None
78
- if self.isLinear(marketType, subType):
79
- rawMarketType = "future"
80
- elif self.isInverse(marketType, subType):
81
- rawMarketType = "delivery"
82
- elif marketType == "spot":
83
- rawMarketType = marketType
84
- else:
85
- raise NotSupported(str(self.id) + " " + methodName + "() does not support options markets")
86
- isBidAsk = True
87
- subscriptionArgs = []
88
- subMessageHashes = []
89
- messageHashes = []
90
- if symbolsDefined:
91
- for i in range(0, len(symbols)):
92
- symbol = symbols[i]
93
- market = self.market(symbol)
94
- subscriptionArgs.append(market["lowercaseId"] + "@" + channelName)
95
- subMessageHashes.append(self.get_message_hash(channelName, market["symbol"], isBidAsk))
96
- messageHashes.append("unsubscribe:bidsasks:" + symbol)
97
- else:
98
- if marketType == "spot":
99
- raise ArgumentsRequired(
100
- str(self.id) + " " + methodName + "() requires symbols for this channel for spot markets"
101
- )
102
- subscriptionArgs.append("!" + channelName)
103
- subMessageHashes.append(self.get_message_hash(channelName, None, isBidAsk))
104
- messageHashes.append("unsubscribe:bidsasks")
105
- streamHash = channelName
106
- if symbolsDefined:
107
- streamHash = channelName + "::" + ",".join(symbols)
108
- url = self.urls["api"]["ws"][rawMarketType] + "/" + self.stream(rawMarketType, streamHash)
109
- requestId = self.request_id(url)
110
- request: dict = {
111
- "method": "UNSUBSCRIBE",
112
- "params": subscriptionArgs,
113
- "id": requestId,
114
- }
115
- subscription: dict = {
116
- "unsubscribe": True,
117
- "id": str(requestId),
118
- "subMessageHashes": subMessageHashes,
119
- "messageHashes": subMessageHashes,
120
- "symbols": symbols,
121
- "topic": "bidsasks",
122
- }
123
- return await self.watch_multiple(
124
- url, subMessageHashes, self.extend(request, params), subMessageHashes, subscription
66
+ return await self.watch_multi_ticker_helper(
67
+ "watchBidsAsks", "bookTicker", symbols, params, isUnsubscribe=True
125
68
  )
126
69
 
127
70
  def parse_ohlcv(self, ohlcv, market=None):
@@ -198,7 +198,8 @@ cdef class Rsi(Indicator):
198
198
  cdef object down_moves
199
199
  cdef object smooth_up
200
200
  cdef object smooth_down
201
- cdef double prev_value
201
+ cdef double prev_value # - close of the previous COMPLETED bar (reference for diff)
202
+ cdef double last_value # - current bar's working value (updates on every tick)
202
203
 
203
204
  cpdef double calculate(self, long long time, double value, short new_item_started)
204
205
 
@@ -1264,6 +1264,7 @@ cdef class Rsi(Indicator):
1264
1264
  def __init__(self, str name, TimeSeries series, int period, str smoother="ema"):
1265
1265
  self.period = period
1266
1266
  self.prev_value = np.nan
1267
+ self.last_value = np.nan
1267
1268
 
1268
1269
  # - create internal series for up and down moves
1269
1270
  self.up_moves = TimeSeries("up_moves", series.timeframe, series.max_series_length)
@@ -1278,20 +1279,33 @@ cdef class Rsi(Indicator):
1278
1279
  cpdef double calculate(self, long long time, double value, short new_item_started):
1279
1280
  cdef double diff, up_move, down_move, smooth_u, smooth_d
1280
1281
 
1281
- # - for the first value, store it and return NaN
1282
- if np.isnan(self.prev_value):
1283
- self.prev_value = value
1282
+ # - very first tick ever: initialize working value, emit 0 up/down moves,
1283
+ # - keep prev_value = NaN so no diff is computed until the first bar finalizes
1284
+ if np.isnan(self.last_value):
1285
+ self.last_value = value
1284
1286
  self.up_moves.update(time, 0.0)
1285
1287
  self.down_moves.update(time, 0.0)
1286
1288
  return np.nan
1287
1289
 
1288
- # - calculate price change
1290
+ # - on new bar: the previously tracked working value (last_value) has just
1291
+ # - been finalized as the previous bar's close — promote it to prev_value
1292
+ # - so diff is measured against the true previous-bar close, not against
1293
+ # - any intrabar tick we may have seen earlier.
1289
1294
  if new_item_started:
1290
- diff = value - self.prev_value
1291
- self.prev_value = value
1292
- else:
1293
- # - when updating the same bar, calculate diff from previous closed bar
1294
- diff = value - self.prev_value
1295
+ self.prev_value = self.last_value
1296
+
1297
+ # - track current working value for the bar (updates on every tick)
1298
+ self.last_value = value
1299
+
1300
+ # - still in the first bar (no finalized prev close yet): emit 0 moves
1301
+ # - and NaN — matches the single-call init path from batch replay
1302
+ if np.isnan(self.prev_value):
1303
+ self.up_moves.update(time, 0.0)
1304
+ self.down_moves.update(time, 0.0)
1305
+ return np.nan
1306
+
1307
+ # - diff is always against the previous COMPLETED bar's close
1308
+ diff = value - self.prev_value
1295
1309
 
1296
1310
  # - calculate up and down moves
1297
1311
  if diff > 0:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes