Qubx 0.6.77__tar.gz → 0.6.78__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.

Potentially problematic release.


This version of Qubx might be problematic. Click here for more details.

Files changed (215) hide show
  1. {qubx-0.6.77 → qubx-0.6.78}/PKG-INFO +1 -1
  2. {qubx-0.6.77 → qubx-0.6.78}/pyproject.toml +1 -1
  3. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/cli/release.py +23 -6
  4. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/account.py +10 -0
  5. {qubx-0.6.77 → qubx-0.6.78}/LICENSE +0 -0
  6. {qubx-0.6.77 → qubx-0.6.78}/README.md +0 -0
  7. {qubx-0.6.77 → qubx-0.6.78}/build.py +0 -0
  8. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/__init__.py +0 -0
  9. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/_nb_magic.py +0 -0
  10. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/backtester/__init__.py +0 -0
  11. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/backtester/account.py +0 -0
  12. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/backtester/broker.py +0 -0
  13. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/backtester/data.py +0 -0
  14. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/backtester/management.py +0 -0
  15. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/backtester/ome.py +0 -0
  16. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/backtester/optimization.py +0 -0
  17. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/backtester/runner.py +0 -0
  18. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/backtester/sentinels.py +0 -0
  19. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/backtester/simulated_data.py +0 -0
  20. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/backtester/simulated_exchange.py +0 -0
  21. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/backtester/simulator.py +0 -0
  22. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/backtester/utils.py +0 -0
  23. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/cli/__init__.py +0 -0
  24. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/cli/commands.py +0 -0
  25. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/cli/deploy.py +0 -0
  26. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/cli/misc.py +0 -0
  27. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/cli/tui.py +0 -0
  28. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/__init__.py +0 -0
  29. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/account.py +0 -0
  30. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/adapters/__init__.py +0 -0
  31. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/adapters/polling_adapter.py +0 -0
  32. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/broker.py +0 -0
  33. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/connection_manager.py +0 -0
  34. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/data.py +0 -0
  35. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/exceptions.py +0 -0
  36. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/exchange_manager.py +0 -0
  37. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/exchanges/__init__.py +0 -0
  38. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/exchanges/base.py +0 -0
  39. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/exchanges/binance/broker.py +0 -0
  40. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/exchanges/binance/exchange.py +0 -0
  41. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex.py +0 -0
  42. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex_account.py +0 -0
  43. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/exchanges/hyperliquid/__init__.py +0 -0
  44. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/exchanges/hyperliquid/broker.py +0 -0
  45. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/exchanges/hyperliquid/hyperliquid.py +0 -0
  46. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/exchanges/kraken/kraken.py +0 -0
  47. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/factory.py +0 -0
  48. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/handlers/__init__.py +0 -0
  49. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/handlers/base.py +0 -0
  50. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/handlers/factory.py +0 -0
  51. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/handlers/funding_rate.py +0 -0
  52. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/handlers/liquidation.py +0 -0
  53. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/handlers/ohlc.py +0 -0
  54. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/handlers/open_interest.py +0 -0
  55. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/handlers/orderbook.py +0 -0
  56. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/handlers/quote.py +0 -0
  57. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/handlers/trade.py +0 -0
  58. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/reader.py +0 -0
  59. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/subscription_config.py +0 -0
  60. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/subscription_manager.py +0 -0
  61. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/subscription_orchestrator.py +0 -0
  62. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/utils.py +0 -0
  63. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/ccxt/warmup_service.py +0 -0
  64. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/tardis/data.py +0 -0
  65. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/connectors/tardis/utils.py +0 -0
  66. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/__init__.py +0 -0
  67. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/basics.py +0 -0
  68. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/context.py +0 -0
  69. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/deque.py +0 -0
  70. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/errors.py +0 -0
  71. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/exceptions.py +0 -0
  72. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/helpers.py +0 -0
  73. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/initializer.py +0 -0
  74. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/interfaces.py +0 -0
  75. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/loggers.py +0 -0
  76. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/lookups.py +0 -0
  77. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/metrics.py +0 -0
  78. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/mixins/__init__.py +0 -0
  79. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/mixins/market.py +0 -0
  80. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/mixins/processing.py +0 -0
  81. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/mixins/subscription.py +0 -0
  82. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/mixins/trading.py +0 -0
  83. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/mixins/universe.py +0 -0
  84. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/mixins/utils.py +0 -0
  85. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/series.pxd +0 -0
  86. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/series.pyi +0 -0
  87. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/series.pyx +0 -0
  88. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/stale_data_detector.py +0 -0
  89. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/utils.pyi +0 -0
  90. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/core/utils.pyx +0 -0
  91. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/data/__init__.py +0 -0
  92. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/data/composite.py +0 -0
  93. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/data/helpers.py +0 -0
  94. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/data/hft.py +0 -0
  95. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/data/readers.py +0 -0
  96. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/data/registry.py +0 -0
  97. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/data/tardis.py +0 -0
  98. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/emitters/__init__.py +0 -0
  99. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/emitters/base.py +0 -0
  100. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/emitters/composite.py +0 -0
  101. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/emitters/csv.py +0 -0
  102. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/emitters/indicator.py +0 -0
  103. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/emitters/inmemory.py +0 -0
  104. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/emitters/prometheus.py +0 -0
  105. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/emitters/questdb.py +0 -0
  106. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/exporters/__init__.py +0 -0
  107. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/exporters/composite.py +0 -0
  108. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/exporters/formatters/__init__.py +0 -0
  109. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/exporters/formatters/base.py +0 -0
  110. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/exporters/formatters/incremental.py +0 -0
  111. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/exporters/formatters/slack.py +0 -0
  112. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/exporters/redis_streams.py +0 -0
  113. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/exporters/slack.py +0 -0
  114. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/features/__init__.py +0 -0
  115. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/features/core.py +0 -0
  116. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/features/orderbook.py +0 -0
  117. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/features/price.py +0 -0
  118. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/features/trades.py +0 -0
  119. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/features/utils.py +0 -0
  120. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/gathering/simplest.py +0 -0
  121. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/health/__init__.py +0 -0
  122. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/health/base.py +0 -0
  123. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/loggers/__init__.py +0 -0
  124. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/loggers/csv.py +0 -0
  125. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/loggers/factory.py +0 -0
  126. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/loggers/inmemory.py +0 -0
  127. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/loggers/mongo.py +0 -0
  128. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/math/__init__.py +0 -0
  129. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/math/stats.py +0 -0
  130. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/notifications/__init__.py +0 -0
  131. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/notifications/composite.py +0 -0
  132. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/notifications/slack.py +0 -0
  133. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/notifications/throttler.py +0 -0
  134. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/pandaz/__init__.py +0 -0
  135. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/pandaz/ta.py +0 -0
  136. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/pandaz/utils.py +0 -0
  137. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/resources/_build.py +0 -0
  138. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/resources/crypto-fees.ini +0 -0
  139. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/resources/instruments/hyperliquid-spot.json +0 -0
  140. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/resources/instruments/hyperliquid.f-perpetual.json +0 -0
  141. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/resources/instruments/symbols-binance-spot.json +0 -0
  142. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/resources/instruments/symbols-binance.cm-future.json +0 -0
  143. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/resources/instruments/symbols-binance.cm-perpetual.json +0 -0
  144. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/resources/instruments/symbols-binance.um-future.json +0 -0
  145. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/resources/instruments/symbols-binance.um-perpetual.json +0 -0
  146. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/resources/instruments/symbols-bitfinex.f-perpetual.json +0 -0
  147. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/resources/instruments/symbols-kraken-spot.json +0 -0
  148. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/resources/instruments/symbols-kraken.f-future.json +0 -0
  149. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/resources/instruments/symbols-kraken.f-perpetual.json +0 -0
  150. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/restarts/__init__.py +0 -0
  151. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/restarts/state_resolvers.py +0 -0
  152. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/restarts/time_finders.py +0 -0
  153. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/restorers/__init__.py +0 -0
  154. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/restorers/balance.py +0 -0
  155. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/restorers/factory.py +0 -0
  156. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/restorers/interfaces.py +0 -0
  157. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/restorers/position.py +0 -0
  158. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/restorers/signal.py +0 -0
  159. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/restorers/state.py +0 -0
  160. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/restorers/utils.py +0 -0
  161. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/ta/__init__.py +0 -0
  162. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/ta/indicators.pxd +0 -0
  163. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/ta/indicators.pyi +0 -0
  164. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/ta/indicators.pyx +0 -0
  165. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/__init__.py +0 -0
  166. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/base.py +0 -0
  167. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/project/accounts.toml.j2 +0 -0
  168. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/project/config.yml.j2 +0 -0
  169. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/project/jlive.sh.j2 +0 -0
  170. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/project/jpaper.sh.j2 +0 -0
  171. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/project/pyproject.toml.j2 +0 -0
  172. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/project/src/{{ strategy_name }}/__init__.py.j2 +0 -0
  173. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/project/src/{{ strategy_name }}/strategy.py.j2 +0 -0
  174. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/project/template.yml +0 -0
  175. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/simple/__init__.py.j2 +0 -0
  176. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/simple/accounts.toml.j2 +0 -0
  177. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/simple/config.yml.j2 +0 -0
  178. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/simple/jlive.sh.j2 +0 -0
  179. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/simple/jpaper.sh.j2 +0 -0
  180. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/simple/strategy.py.j2 +0 -0
  181. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/templates/simple/template.yml +0 -0
  182. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/trackers/__init__.py +0 -0
  183. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/trackers/advanced.py +0 -0
  184. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/trackers/composite.py +0 -0
  185. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/trackers/rebalancers.py +0 -0
  186. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/trackers/riskctrl.py +0 -0
  187. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/trackers/sizers.py +0 -0
  188. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/__init__.py +0 -0
  189. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/_pyxreloader.py +0 -0
  190. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/charting/lookinglass.py +0 -0
  191. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/charting/mpl_helpers.py +0 -0
  192. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/charting/orderbook.py +0 -0
  193. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/collections.py +0 -0
  194. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/marketdata/binance.py +0 -0
  195. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/marketdata/ccxt.py +0 -0
  196. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/marketdata/dukas.py +0 -0
  197. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/misc.py +0 -0
  198. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/ntp.py +0 -0
  199. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/numbers_utils.py +0 -0
  200. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/orderbook.py +0 -0
  201. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/plotting/__init__.py +0 -0
  202. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/plotting/dashboard.py +0 -0
  203. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/plotting/data.py +0 -0
  204. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/plotting/interfaces.py +0 -0
  205. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/plotting/renderers/__init__.py +0 -0
  206. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/plotting/renderers/plotly.py +0 -0
  207. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/questdb.py +0 -0
  208. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/runner/__init__.py +0 -0
  209. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/runner/_jupyter_runner.pyt +0 -0
  210. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/runner/accounts.py +0 -0
  211. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/runner/configs.py +0 -0
  212. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/runner/factory.py +0 -0
  213. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/runner/runner.py +0 -0
  214. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/time.py +0 -0
  215. {qubx-0.6.77 → qubx-0.6.78}/src/qubx/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: Qubx
3
- Version: 0.6.77
3
+ Version: 0.6.78
4
4
  Summary: Qubx - Quantitative Trading Framework
5
5
  Author: Dmitry Marienko
6
6
  Author-email: dmitry.marienko@xlydian.com
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "Qubx"
7
- version = "0.6.77"
7
+ version = "0.6.78"
8
8
  description = "Qubx - Quantitative Trading Framework"
9
9
  authors = [ "Dmitry Marienko <dmitry.marienko@xlydian.com>", "Yuriy Arabskyy <yuriy.arabskyy@xlydian.com>",]
10
10
  readme = "README.md"
@@ -84,9 +84,12 @@ def resolve_relative_import(relative_module: str, file_path: str, project_root:
84
84
  # Get the directory containing the file (remove filename)
85
85
  file_dir = os.path.dirname(rel_file_path)
86
86
 
87
- # Convert file directory path to module path
87
+ # Convert file directory path to module path
88
88
  if file_dir:
89
89
  current_module_parts = file_dir.replace(os.sep, ".").split(".")
90
+ # Remove 'src' prefix if present (common Python project structure)
91
+ if current_module_parts[0] == "src" and len(current_module_parts) > 1:
92
+ current_module_parts = current_module_parts[1:]
90
93
  else:
91
94
  current_module_parts = []
92
95
 
@@ -684,8 +687,8 @@ def _copy_dependencies(strategy_path: str, pyproject_root: str, release_dir: str
684
687
  if _src_root is None:
685
688
  raise DependencyResolutionError(f"Could not find the source root for {_src_dir} in {pyproject_root}")
686
689
 
687
- # Now call _get_imports with the correct source root directory
688
- _imports = _get_imports(strategy_path, _src_root, [_src_dir])
690
+ # Now call _get_imports with the correct source root directory and pyproject_root for relative imports
691
+ _imports = _get_imports(strategy_path, _src_root, [_src_dir], pyproject_root)
689
692
 
690
693
  # Validate all dependencies before copying
691
694
  valid_imports, missing_dependencies = _validate_dependencies(_imports, _src_root, _src_dir)
@@ -920,7 +923,7 @@ def _create_zip_archive(output_dir: str, release_dir: str, tag: str) -> None:
920
923
  shutil.rmtree(release_dir)
921
924
 
922
925
 
923
- def _get_imports(file_name: str, current_directory: str, what_to_look: list[str]) -> list[Import]:
926
+ def _get_imports(file_name: str, current_directory: str, what_to_look: list[str], pyproject_root: str | None = None, visited: set[str] | None = None) -> list[Import]:
924
927
  """
925
928
  Recursively get all imports from a file and its dependencies.
926
929
 
@@ -928,6 +931,8 @@ def _get_imports(file_name: str, current_directory: str, what_to_look: list[str]
928
931
  file_name: Path to the Python file to analyze
929
932
  current_directory: Root directory for resolving imports
930
933
  what_to_look: List of module prefixes to filter for
934
+ pyproject_root: Root directory of the project for resolving relative imports
935
+ visited: Set of already visited files to prevent infinite recursion
931
936
 
932
937
  Returns:
933
938
  List of Import objects for all discovered dependencies
@@ -935,8 +940,20 @@ def _get_imports(file_name: str, current_directory: str, what_to_look: list[str]
935
940
  Raises:
936
941
  DependencyResolutionError: If a required dependency cannot be found or processed
937
942
  """
943
+ # Initialize visited set if not provided
944
+ if visited is None:
945
+ visited = set()
946
+
947
+ # Skip if already visited to prevent infinite recursion
948
+ if file_name in visited:
949
+ return []
950
+ visited.add(file_name)
951
+
952
+ # Use pyproject_root if provided, otherwise use current_directory as fallback
953
+ project_root_for_resolution = pyproject_root or current_directory
954
+
938
955
  try:
939
- imports = list(get_imports(file_name, what_to_look, project_root=current_directory))
956
+ imports = list(get_imports(file_name, what_to_look, project_root=project_root_for_resolution))
940
957
  except (SyntaxError, FileNotFoundError) as e:
941
958
  raise DependencyResolutionError(f"Failed to parse imports from {file_name}: {e}")
942
959
 
@@ -959,7 +976,7 @@ def _get_imports(file_name: str, current_directory: str, what_to_look: list[str]
959
976
  if dependency_file:
960
977
  # Recursively process the dependency
961
978
  try:
962
- imports.extend(_get_imports(dependency_file, current_directory, what_to_look))
979
+ imports.extend(_get_imports(dependency_file, current_directory, what_to_look, pyproject_root, visited))
963
980
  except DependencyResolutionError as e:
964
981
  # Log nested dependency errors but continue processing
965
982
  logger.warning(f"Failed to resolve nested dependency: {e}")
@@ -18,6 +18,7 @@ from qubx.core.basics import (
18
18
  )
19
19
  from qubx.core.helpers import extract_price
20
20
  from qubx.core.interfaces import IAccountProcessor, ISubscriptionManager
21
+ from qubx.core.mixins.utils import EXCHANGE_MAPPINGS
21
22
 
22
23
 
23
24
  class BasicAccountProcessor(IAccountProcessor):
@@ -356,11 +357,20 @@ class CompositeAccountProcessor(IAccountProcessor):
356
357
  """
357
358
  if exchange:
358
359
  if exchange not in self._account_processors:
360
+ # Check if there's a mapping for this exchange
361
+ if exchange in EXCHANGE_MAPPINGS and EXCHANGE_MAPPINGS[exchange] in self._account_processors:
362
+ return EXCHANGE_MAPPINGS[exchange]
359
363
  raise ValueError(f"Unknown exchange: {exchange}")
360
364
  return exchange
361
365
 
362
366
  if instrument:
363
367
  if instrument.exchange not in self._account_processors:
368
+ # Check if there's a mapping for this exchange
369
+ if (
370
+ instrument.exchange in EXCHANGE_MAPPINGS
371
+ and EXCHANGE_MAPPINGS[instrument.exchange] in self._account_processors
372
+ ):
373
+ return EXCHANGE_MAPPINGS[instrument.exchange]
364
374
  raise ValueError(f"Unknown exchange: {instrument.exchange}")
365
375
  return instrument.exchange
366
376
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes