Qubx 0.7.5__tar.gz → 0.7.7__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 (272) hide show
  1. {qubx-0.7.5 → qubx-0.7.7}/PKG-INFO +1 -1
  2. {qubx-0.7.5 → qubx-0.7.7}/pyproject.toml +1 -1
  3. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/account.py +2 -3
  4. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/broker.py +3 -2
  5. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/interfaces.py +1 -2
  6. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/series.pxd +10 -1
  7. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/series.pyi +2 -0
  8. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/series.pyx +46 -7
  9. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/restarts/state_resolvers.py +1 -0
  10. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/ta/indicators.pxd +2 -6
  11. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/ta/indicators.pyx +4 -27
  12. {qubx-0.7.5 → qubx-0.7.7}/LICENSE +0 -0
  13. {qubx-0.7.5 → qubx-0.7.7}/README.md +0 -0
  14. {qubx-0.7.5 → qubx-0.7.7}/build.py +0 -0
  15. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/__init__.py +0 -0
  16. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/_nb_magic.py +0 -0
  17. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/__init__.py +0 -0
  18. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/account.py +0 -0
  19. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/broker.py +0 -0
  20. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/data.py +0 -0
  21. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/management.py +0 -0
  22. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/ome.py +0 -0
  23. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/optimization.py +0 -0
  24. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/runner.py +0 -0
  25. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/sentinels.py +0 -0
  26. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/simulated_data.py +0 -0
  27. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/simulated_exchange.py +0 -0
  28. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/simulator.py +0 -0
  29. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/transfers.py +0 -0
  30. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/backtester/utils.py +0 -0
  31. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/cli/__init__.py +0 -0
  32. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/cli/commands.py +0 -0
  33. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/cli/deploy.py +0 -0
  34. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/cli/misc.py +0 -0
  35. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/cli/release.py +0 -0
  36. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/cli/tui.py +0 -0
  37. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/__init__.py +0 -0
  38. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/account.py +0 -0
  39. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/adapters/__init__.py +0 -0
  40. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/adapters/polling_adapter.py +0 -0
  41. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/broker.py +0 -0
  42. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/connection_manager.py +0 -0
  43. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/data.py +0 -0
  44. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/exceptions.py +0 -0
  45. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/exchange_manager.py +0 -0
  46. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/exchanges/__init__.py +0 -0
  47. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/exchanges/base.py +0 -0
  48. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/exchanges/binance/broker.py +0 -0
  49. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/exchanges/binance/exchange.py +0 -0
  50. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex.py +0 -0
  51. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex_account.py +0 -0
  52. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/exchanges/hyperliquid/__init__.py +0 -0
  53. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/exchanges/hyperliquid/account.py +0 -0
  54. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/exchanges/hyperliquid/broker.py +0 -0
  55. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/exchanges/hyperliquid/hyperliquid.py +0 -0
  56. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/exchanges/kraken/kraken.py +0 -0
  57. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/factory.py +0 -0
  58. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/handlers/__init__.py +0 -0
  59. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/handlers/base.py +0 -0
  60. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/handlers/factory.py +0 -0
  61. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/handlers/funding_rate.py +0 -0
  62. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/handlers/liquidation.py +0 -0
  63. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/handlers/ohlc.py +0 -0
  64. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/handlers/open_interest.py +0 -0
  65. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/handlers/orderbook.py +0 -0
  66. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/handlers/quote.py +0 -0
  67. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/handlers/trade.py +0 -0
  68. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/reader.py +0 -0
  69. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/subscription_config.py +0 -0
  70. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/subscription_manager.py +0 -0
  71. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/subscription_orchestrator.py +0 -0
  72. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/utils.py +0 -0
  73. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/ccxt/warmup_service.py +0 -0
  74. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/tardis/data.py +0 -0
  75. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/tardis/utils.py +0 -0
  76. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/__init__.py +0 -0
  77. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/client.py +0 -0
  78. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/constants.py +0 -0
  79. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/data.py +0 -0
  80. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/extensions.py +0 -0
  81. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/factory.py +0 -0
  82. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/handlers/__init__.py +0 -0
  83. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/handlers/base.py +0 -0
  84. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/handlers/orderbook.py +0 -0
  85. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/handlers/quote.py +0 -0
  86. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/handlers/stats.py +0 -0
  87. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/handlers/trades.py +0 -0
  88. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/instruments.py +0 -0
  89. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/nonce.py +0 -0
  90. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/parsers.py +0 -0
  91. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/rate_limits.py +0 -0
  92. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/reader.py +0 -0
  93. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/utils.py +0 -0
  94. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/connectors/xlighter/websocket.py +0 -0
  95. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/__init__.py +0 -0
  96. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/account.py +0 -0
  97. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/basics.py +0 -0
  98. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/context.py +0 -0
  99. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/deque.py +0 -0
  100. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/detectors/__init__.py +0 -0
  101. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/detectors/delisting.py +0 -0
  102. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/detectors/stale.py +0 -0
  103. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/errors.py +0 -0
  104. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/exceptions.py +0 -0
  105. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/helpers.py +0 -0
  106. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/initializer.py +0 -0
  107. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/loggers.py +0 -0
  108. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/lookups.py +0 -0
  109. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/metrics.py +0 -0
  110. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/mixins/__init__.py +0 -0
  111. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/mixins/market.py +0 -0
  112. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/mixins/processing.py +0 -0
  113. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/mixins/subscription.py +0 -0
  114. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/mixins/trading.py +0 -0
  115. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/mixins/universe.py +0 -0
  116. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/mixins/utils.py +0 -0
  117. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/utils.pyi +0 -0
  118. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/core/utils.pyx +0 -0
  119. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/data/__init__.py +0 -0
  120. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/data/composite.py +0 -0
  121. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/data/containers.py +0 -0
  122. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/data/helpers.py +0 -0
  123. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/data/hft.py +0 -0
  124. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/data/readers.py +0 -0
  125. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/data/registry.py +0 -0
  126. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/data/storage.py +0 -0
  127. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/data/storages/csv.py +0 -0
  128. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/data/storages/questdb.py +0 -0
  129. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/data/storages/utils.py +0 -0
  130. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/data/tardis.py +0 -0
  131. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/data/transformers.py +0 -0
  132. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/emitters/__init__.py +0 -0
  133. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/emitters/base.py +0 -0
  134. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/emitters/composite.py +0 -0
  135. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/emitters/csv.py +0 -0
  136. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/emitters/indicator.py +0 -0
  137. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/emitters/inmemory.py +0 -0
  138. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/emitters/prometheus.py +0 -0
  139. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/emitters/questdb.py +0 -0
  140. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/exporters/__init__.py +0 -0
  141. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/exporters/composite.py +0 -0
  142. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/exporters/formatters/__init__.py +0 -0
  143. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/exporters/formatters/base.py +0 -0
  144. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/exporters/formatters/incremental.py +0 -0
  145. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/exporters/formatters/slack.py +0 -0
  146. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/exporters/formatters/target_position.py +0 -0
  147. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/exporters/redis_streams.py +0 -0
  148. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/exporters/slack.py +0 -0
  149. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/features/__init__.py +0 -0
  150. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/features/core.py +0 -0
  151. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/features/orderbook.py +0 -0
  152. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/features/price.py +0 -0
  153. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/features/trades.py +0 -0
  154. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/features/utils.py +0 -0
  155. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/gathering/simplest.py +0 -0
  156. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/health/__init__.py +0 -0
  157. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/health/base.py +0 -0
  158. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/loggers/__init__.py +0 -0
  159. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/loggers/csv.py +0 -0
  160. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/loggers/factory.py +0 -0
  161. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/loggers/inmemory.py +0 -0
  162. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/loggers/mongo.py +0 -0
  163. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/math/__init__.py +0 -0
  164. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/math/stats.py +0 -0
  165. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/notifications/__init__.py +0 -0
  166. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/notifications/composite.py +0 -0
  167. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/notifications/slack.py +0 -0
  168. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/notifications/throttler.py +0 -0
  169. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/pandaz/__init__.py +0 -0
  170. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/pandaz/ta.py +0 -0
  171. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/pandaz/utils.py +0 -0
  172. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/resources/_build.py +0 -0
  173. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/resources/crypto-fees.ini +0 -0
  174. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/resources/instruments/hyperliquid-spot.json +0 -0
  175. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/resources/instruments/hyperliquid.f-perpetual.json +0 -0
  176. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/resources/instruments/symbols-binance-spot.json +0 -0
  177. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/resources/instruments/symbols-binance.cm-future.json +0 -0
  178. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/resources/instruments/symbols-binance.cm-perpetual.json +0 -0
  179. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/resources/instruments/symbols-binance.um-future.json +0 -0
  180. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/resources/instruments/symbols-binance.um-perpetual.json +0 -0
  181. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/resources/instruments/symbols-bitfinex.f-perpetual.json +0 -0
  182. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/resources/instruments/symbols-kraken-spot.json +0 -0
  183. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/resources/instruments/symbols-kraken.f-future.json +0 -0
  184. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/resources/instruments/symbols-kraken.f-perpetual.json +0 -0
  185. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/restarts/__init__.py +0 -0
  186. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/restarts/time_finders.py +0 -0
  187. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/restorers/__init__.py +0 -0
  188. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/restorers/balance.py +0 -0
  189. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/restorers/factory.py +0 -0
  190. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/restorers/interfaces.py +0 -0
  191. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/restorers/position.py +0 -0
  192. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/restorers/signal.py +0 -0
  193. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/restorers/state.py +0 -0
  194. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/restorers/utils.py +0 -0
  195. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/ta/__init__.py +0 -0
  196. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/ta/indicators.pyi +0 -0
  197. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/__init__.py +0 -0
  198. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/base.py +0 -0
  199. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/project/accounts.toml.j2 +0 -0
  200. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/project/config.yml.j2 +0 -0
  201. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/project/jlive.sh.j2 +0 -0
  202. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/project/jpaper.sh.j2 +0 -0
  203. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/project/pyproject.toml.j2 +0 -0
  204. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/project/src/{{ strategy_name }}/__init__.py.j2 +0 -0
  205. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/project/src/{{ strategy_name }}/strategy.py.j2 +0 -0
  206. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/project/template.yml +0 -0
  207. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/simple/__init__.py.j2 +0 -0
  208. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/simple/accounts.toml.j2 +0 -0
  209. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/simple/config.yml.j2 +0 -0
  210. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/simple/jlive.sh.j2 +0 -0
  211. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/simple/jpaper.sh.j2 +0 -0
  212. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/simple/strategy.py.j2 +0 -0
  213. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/templates/simple/template.yml +0 -0
  214. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/trackers/__init__.py +0 -0
  215. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/trackers/advanced.py +0 -0
  216. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/trackers/composite.py +0 -0
  217. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/trackers/rebalancers.py +0 -0
  218. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/trackers/riskctrl.py +0 -0
  219. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/trackers/sizers.py +0 -0
  220. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/__init__.py +0 -0
  221. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/_pyxreloader.py +0 -0
  222. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/charting/lookinglass.py +0 -0
  223. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/charting/mpl_helpers.py +0 -0
  224. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/charting/orderbook.py +0 -0
  225. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/collections.py +0 -0
  226. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/hft/__init__.py +0 -0
  227. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/hft/numba_utils.py +0 -0
  228. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/hft/orderbook.pyi +0 -0
  229. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/hft/orderbook.pyx +0 -0
  230. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/marketdata/binance.py +0 -0
  231. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/marketdata/ccxt.py +0 -0
  232. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/marketdata/dukas.py +0 -0
  233. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/misc.py +0 -0
  234. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/nonce.py +0 -0
  235. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/ntp.py +0 -0
  236. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/numbers_utils.py +0 -0
  237. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/orderbook.py +0 -0
  238. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/plotting/__init__.py +0 -0
  239. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/plotting/dashboard.py +0 -0
  240. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/plotting/data.py +0 -0
  241. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/plotting/interfaces.py +0 -0
  242. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/plotting/renderers/__init__.py +0 -0
  243. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/plotting/renderers/plotly.py +0 -0
  244. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/questdb.py +0 -0
  245. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/rate_limiter.py +0 -0
  246. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/ringbuffer.pxd +0 -0
  247. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/ringbuffer.pyi +0 -0
  248. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/ringbuffer.pyx +0 -0
  249. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/__init__.py +0 -0
  250. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/_jupyter_runner.pyt +0 -0
  251. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/accounts.py +0 -0
  252. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/configs.py +0 -0
  253. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/factory.py +0 -0
  254. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/kernel_service.py +0 -0
  255. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/runner.py +0 -0
  256. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/textual/__init__.py +0 -0
  257. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/textual/app.py +0 -0
  258. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/textual/handlers.py +0 -0
  259. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/textual/init_code.py +0 -0
  260. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/textual/kernel.py +0 -0
  261. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/textual/styles.tcss +0 -0
  262. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/textual/widgets/__init__.py +0 -0
  263. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/textual/widgets/command_input.py +0 -0
  264. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/textual/widgets/debug_log.py +0 -0
  265. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/textual/widgets/orders_table.py +0 -0
  266. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/textual/widgets/positions_table.py +0 -0
  267. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/textual/widgets/quotes_table.py +0 -0
  268. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/runner/textual/widgets/repl_output.py +0 -0
  269. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/slack.py +0 -0
  270. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/time.py +0 -0
  271. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/version.py +0 -0
  272. {qubx-0.7.5 → qubx-0.7.7}/src/qubx/utils/websocket_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Qubx
3
- Version: 0.7.5
3
+ Version: 0.7.7
4
4
  Summary: Qubx - Quantitative Trading Framework
5
5
  License-File: LICENSE
6
6
  Author: Dmitry Marienko
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "Qubx"
7
- version = "0.7.5"
7
+ version = "0.7.7"
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"
@@ -415,9 +415,8 @@ class LighterAccountProcessor(BasicAccountProcessor):
415
415
  try:
416
416
  orders = parse_account_all_orders_message(message, self.instrument_loader)
417
417
 
418
- logger.debug(
419
- f"Received {len(orders)} orders: \n\t{'\n\t'.join([f'{order.id} ({order.instrument.symbol})' for order in orders])}"
420
- )
418
+ _d_msg = "\n\t".join([f"{order.id} ({order.instrument.symbol})" for order in orders])
419
+ logger.debug(f"Received {len(orders)} orders: \n\t{_d_msg}")
421
420
 
422
421
  for order in orders:
423
422
  self.channel.send((order.instrument, "order", order, False))
@@ -401,7 +401,9 @@ class LighterBroker(IBroker):
401
401
  base_amount_int = int(amount * (10**instrument.size_precision))
402
402
  price_int = int(price * (10**instrument.price_precision))
403
403
 
404
- # logger.debug(f"Modify order {order.id}: amount={order.quantity} → {amount}, price={order.price} → {price}")
404
+ logger.debug(
405
+ f"[{order.instrument.symbol}] :: Modifying order {order.id}: amount={order.quantity} → {amount}, price={order.price} → {price}"
406
+ )
405
407
 
406
408
  # Step 1: Sign modification transaction locally
407
409
  signer = self.client.signer_client
@@ -435,7 +437,6 @@ class LighterBroker(IBroker):
435
437
  options=order.options,
436
438
  )
437
439
 
438
- logger.info(f"Order modification submitted via WebSocket: {order.id}")
439
440
  return updated_order
440
441
 
441
442
  except Exception as e:
@@ -942,8 +942,7 @@ class ITradingManager:
942
942
 
943
943
  Args:
944
944
  instrument: The instrument to get the minimum size for
945
- amount: The amount to get the minimum size for
946
- price: The price to get the minimum size for
945
+ amount: The amount to be traded to determine if it's position reducing or not
947
946
  """
948
947
  ...
949
948
 
@@ -172,4 +172,13 @@ cdef class GenericSeries(TimeSeries):
172
172
 
173
173
 
174
174
  cdef class IndicatorGeneric(Indicator):
175
- pass
175
+ pass
176
+
177
+
178
+ cdef class SeriesCachedValue:
179
+ cdef double cached_ser_value
180
+ cdef long long cached_ser_time
181
+ cdef int cached_ser_idx
182
+ cdef TimeSeries ser
183
+
184
+ cdef double value(self, long long time)
@@ -244,3 +244,5 @@ def lag(series: TimeSeries, period: int) -> "Indicator":
244
244
  Only positive shift (from past) period is allowed.
245
245
  """
246
246
  ...
247
+
248
+ class SeriesCachedValue: ...
@@ -554,6 +554,41 @@ cdef class Resampler(TimeSeries):
554
554
  super().update(time, value)
555
555
 
556
556
 
557
+ cdef class SeriesCachedValue:
558
+ def __init__(self, TimeSeries ser):
559
+ # - initialize series cache
560
+ self.cached_ser_value = np.nan
561
+ self.cached_ser_time = -1
562
+ self.cached_ser_idx = -1
563
+ self.ser = ser
564
+
565
+ cdef double value(self, long long time):
566
+ cdef double ser_value
567
+ cdef long long ser_period_start
568
+ cdef int idx
569
+
570
+ if len(self.ser) > 0:
571
+ # - calculate period start for volatility timeframe
572
+ ser_period_start = floor_t64(time, self.ser.series.timeframe)
573
+
574
+ # - only do lookup when period changes (cache within same period)
575
+ if ser_period_start != self.cached_ser_time:
576
+ idx = self.ser.times.lookup_idx(time, 'ffill')
577
+ if idx >= 0:
578
+ self.cached_ser_value = self.ser.values.values[idx]
579
+ self.cached_ser_idx = idx
580
+ else:
581
+ self.cached_ser_value = np.nan
582
+ self.cached_ser_idx = -1
583
+ self.cached_ser_time = ser_period_start
584
+
585
+ ser_value = self.cached_ser_value
586
+ else:
587
+ ser_value = np.nan
588
+
589
+ return ser_value
590
+
591
+
557
592
  cdef class Lag(Indicator):
558
593
  cdef int period
559
594
 
@@ -1236,7 +1271,10 @@ cdef class OHLCV(TimeSeries):
1236
1271
 
1237
1272
  return self._is_new_item
1238
1273
 
1239
- cpdef short update_by_bar(self, long long time, double open, double high, double low, double close, double vol_incr=0.0, double b_vol_incr=0.0, double volume_quote=0.0, double bought_volume_quote=0.0, int trade_count=0, short is_incremental=1):
1274
+ cpdef short update_by_bar(
1275
+ self, long long time, double open, double high, double low, double close,
1276
+ double vol_incr=0.0, double b_vol_incr=0.0, double volume_quote=0.0, double bought_volume_quote=0.0, int trade_count=0, short is_incremental=1
1277
+ ):
1240
1278
  cdef Bar b
1241
1279
  cdef Bar l_bar
1242
1280
  bar_start_time = floor_t64(time, self.timeframe)
@@ -1468,14 +1506,15 @@ cdef class OHLCV(TimeSeries):
1468
1506
  ValueError(f"Input must be a pandas DataFrame, got {type(df_p).__name__}")
1469
1507
 
1470
1508
  _ohlc = OHLCV(name, infer_series_frequency(df_p).item())
1509
+ _has_count = "count" in df_p.columns
1471
1510
  for t in df_p.itertuples():
1472
1511
  _ohlc.update_by_bar(
1473
- t.Index.asm8, t.open, t.high, t.low, t.close,
1474
- getattr(t, "volume", 0.0),
1475
- getattr(t, "taker_buy_volume", 0.0),
1476
- getattr(t, "quote_volume", 0.0),
1477
- getattr(t, "taker_buy_quote_volume", 0.0),
1478
- getattr(t, "count", 0.0)
1512
+ time=t.Index.asm8, open=t.open, high=t.high, low=t.low, close=t.close,
1513
+ vol_incr=getattr(t, "volume", 0.0),
1514
+ b_vol_incr=getattr(t, "taker_buy_volume", 0.0),
1515
+ volume_quote=getattr(t, "quote_volume", 0.0),
1516
+ bought_volume_quote=getattr(t, "taker_buy_quote_volume", 0.0),
1517
+ trade_count=t.count if _has_count else 0,
1479
1518
  )
1480
1519
  return _ohlc
1481
1520
 
@@ -149,6 +149,7 @@ class StateResolver:
149
149
 
150
150
  # - now check which positions are open in live and we didn't update them by InitializingSignal
151
151
  for instrument, live_pos in live_positions.items():
152
+ ctx.cancel_orders(live_pos.instrument)
152
153
  if live_pos.is_open() and instrument not in sim_active_targets:
153
154
  # - just close the position
154
155
  ctx.emit_signal(InitializingSignal(time=ctx.time(), instrument=instrument, signal=0.0))
@@ -1,5 +1,5 @@
1
1
  cimport numpy as np
2
- from qubx.core.series cimport Indicator, IndicatorOHLC, RollingSum, TimeSeries, OHLCV, Bar
2
+ from qubx.core.series cimport Indicator, IndicatorOHLC, RollingSum, TimeSeries, OHLCV, Bar, SeriesCachedValue
3
3
 
4
4
  cdef class Sma(Indicator):
5
5
  cdef unsigned int period
@@ -200,14 +200,10 @@ cdef class StdEma(Indicator):
200
200
  cpdef double calculate(self, long long time, double value, short new_item_started)
201
201
 
202
202
  cdef class CusumFilter(Indicator):
203
- cdef TimeSeries target
204
203
  cdef double s_pos, s_neg
205
204
  cdef double prev_value
206
205
  cdef double saved_s_pos, saved_s_neg, saved_prev_value
207
- # - cache for target value to avoid repeated lookups
208
- cdef double cached_target_value
209
- cdef long long cached_target_time
210
- cdef int cached_target_idx
206
+ cdef SeriesCachedValue target_cache
211
207
 
212
208
  cdef void _store(self)
213
209
 
@@ -4,7 +4,7 @@ cimport numpy as np
4
4
  from scipy.special.cython_special import ndtri, stdtrit, gamma
5
5
  from collections import deque
6
6
 
7
- from qubx.core.series cimport TimeSeries, Indicator, IndicatorOHLC, RollingSum, nans, OHLCV, Bar
7
+ from qubx.core.series cimport TimeSeries, Indicator, IndicatorOHLC, RollingSum, nans, OHLCV, Bar, SeriesCachedValue
8
8
  from qubx.core.utils import time_to_str
9
9
  from qubx.pandaz.utils import scols, srows
10
10
 
@@ -1385,13 +1385,10 @@ cdef class CusumFilter(Indicator):
1385
1385
  """
1386
1386
 
1387
1387
  def __init__(self, str name, TimeSeries series, TimeSeries target):
1388
- self.target = target
1388
+ self.target_cache = SeriesCachedValue(target)
1389
1389
  self.s_pos = 0.0
1390
1390
  self.s_neg = 0.0
1391
1391
  self.prev_value = np.nan
1392
- self.cached_target_value = np.nan
1393
- self.cached_target_time = -1
1394
- self.cached_target_idx = -1
1395
1392
  super().__init__(name, series)
1396
1393
 
1397
1394
  cdef void _store(self):
@@ -1432,28 +1429,8 @@ cdef class CusumFilter(Indicator):
1432
1429
  self.s_neg = min(0.0, self.s_neg + diff)
1433
1430
 
1434
1431
  # - get threshold from target series (it can be from higher timeframe)
1435
- # - use caching to avoid repeated lookups for the same target period
1436
- cdef int idx
1437
- cdef long long target_period_start
1438
-
1439
- if len(self.target) > 0:
1440
- # - calculate the period start time for the target timeframe
1441
- target_period_start = floor_t64(time, self.target.timeframe)
1442
-
1443
- # - check if we need to update the cached value
1444
- if target_period_start != self.cached_target_time:
1445
- idx = self.target.times.lookup_idx(time, 'ffill')
1446
- if idx >= 0:
1447
- self.cached_target_value = self.target.values.values[idx]
1448
- self.cached_target_idx = idx
1449
- else:
1450
- self.cached_target_value = np.nan
1451
- self.cached_target_idx = -1
1452
- self.cached_target_time = target_period_start
1453
-
1454
- target_value = self.cached_target_value
1455
- else:
1456
- target_value = np.nan
1432
+ # - SeriesCachedValue handles caching automatically
1433
+ target_value = self.target_cache.value(time)
1457
1434
 
1458
1435
  # - only check for events if threshold is available
1459
1436
  if not np.isnan(target_value):
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