Qubx 0.6.29__tar.gz → 0.6.30__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 (157) hide show
  1. {qubx-0.6.29 → qubx-0.6.30}/PKG-INFO +1 -1
  2. {qubx-0.6.29 → qubx-0.6.30}/pyproject.toml +1 -1
  3. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/data.py +4 -3
  4. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/context.py +2 -2
  5. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/helpers.py +2 -0
  6. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/tardis.py +9 -0
  7. {qubx-0.6.29 → qubx-0.6.30}/LICENSE +0 -0
  8. {qubx-0.6.29 → qubx-0.6.30}/README.md +0 -0
  9. {qubx-0.6.29 → qubx-0.6.30}/build.py +0 -0
  10. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/__init__.py +0 -0
  11. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/_nb_magic.py +0 -0
  12. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/__init__.py +0 -0
  13. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/account.py +0 -0
  14. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/broker.py +0 -0
  15. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/data.py +0 -0
  16. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/management.py +0 -0
  17. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/ome.py +0 -0
  18. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/optimization.py +0 -0
  19. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/runner.py +0 -0
  20. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/simulated_data.py +0 -0
  21. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/simulated_exchange.py +0 -0
  22. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/simulator.py +0 -0
  23. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/backtester/utils.py +0 -0
  24. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/cli/__init__.py +0 -0
  25. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/cli/commands.py +0 -0
  26. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/cli/deploy.py +0 -0
  27. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/cli/misc.py +0 -0
  28. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/cli/release.py +0 -0
  29. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/__init__.py +0 -0
  30. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/account.py +0 -0
  31. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/broker.py +0 -0
  32. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/exceptions.py +0 -0
  33. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/exchanges/__init__.py +0 -0
  34. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/exchanges/binance/broker.py +0 -0
  35. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/exchanges/binance/exchange.py +0 -0
  36. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex.py +0 -0
  37. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/exchanges/kraken/kraken.py +0 -0
  38. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/factory.py +0 -0
  39. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/reader.py +0 -0
  40. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/ccxt/utils.py +0 -0
  41. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/tardis/data.py +0 -0
  42. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/connectors/tardis/utils.py +0 -0
  43. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/__init__.py +0 -0
  44. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/account.py +0 -0
  45. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/basics.py +0 -0
  46. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/deque.py +0 -0
  47. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/errors.py +0 -0
  48. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/exceptions.py +0 -0
  49. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/initializer.py +0 -0
  50. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/interfaces.py +0 -0
  51. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/loggers.py +0 -0
  52. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/lookups.py +0 -0
  53. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/metrics.py +0 -0
  54. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/mixins/__init__.py +0 -0
  55. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/mixins/market.py +0 -0
  56. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/mixins/processing.py +0 -0
  57. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/mixins/subscription.py +0 -0
  58. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/mixins/trading.py +0 -0
  59. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/mixins/universe.py +0 -0
  60. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/series.pxd +0 -0
  61. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/series.pyi +0 -0
  62. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/series.pyx +0 -0
  63. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/utils.pyi +0 -0
  64. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/core/utils.pyx +0 -0
  65. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/__init__.py +0 -0
  66. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/composite.py +0 -0
  67. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/helpers.py +0 -0
  68. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/hft.py +0 -0
  69. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/readers.py +0 -0
  70. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/data/registry.py +0 -0
  71. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/emitters/__init__.py +0 -0
  72. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/emitters/base.py +0 -0
  73. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/emitters/composite.py +0 -0
  74. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/emitters/csv.py +0 -0
  75. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/emitters/prometheus.py +0 -0
  76. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/emitters/questdb.py +0 -0
  77. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/__init__.py +0 -0
  78. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/composite.py +0 -0
  79. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/formatters/__init__.py +0 -0
  80. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/formatters/base.py +0 -0
  81. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/formatters/incremental.py +0 -0
  82. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/formatters/slack.py +0 -0
  83. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/redis_streams.py +0 -0
  84. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/exporters/slack.py +0 -0
  85. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/features/__init__.py +0 -0
  86. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/features/core.py +0 -0
  87. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/features/orderbook.py +0 -0
  88. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/features/price.py +0 -0
  89. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/features/trades.py +0 -0
  90. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/features/utils.py +0 -0
  91. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/gathering/simplest.py +0 -0
  92. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/health/__init__.py +0 -0
  93. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/health/base.py +0 -0
  94. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/math/__init__.py +0 -0
  95. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/math/stats.py +0 -0
  96. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/notifications/__init__.py +0 -0
  97. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/notifications/composite.py +0 -0
  98. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/notifications/slack.py +0 -0
  99. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/pandaz/__init__.py +0 -0
  100. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/pandaz/ta.py +0 -0
  101. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/pandaz/utils.py +0 -0
  102. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/_build.py +0 -0
  103. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-binance.cm.json +0 -0
  104. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-binance.json +0 -0
  105. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-binance.um.json +0 -0
  106. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-bitfinex.f.json +0 -0
  107. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-bitfinex.json +0 -0
  108. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-kraken.f.json +0 -0
  109. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/resources/instruments/symbols-kraken.json +0 -0
  110. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restarts/__init__.py +0 -0
  111. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restarts/state_resolvers.py +0 -0
  112. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restarts/time_finders.py +0 -0
  113. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/__init__.py +0 -0
  114. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/balance.py +0 -0
  115. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/factory.py +0 -0
  116. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/interfaces.py +0 -0
  117. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/position.py +0 -0
  118. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/signal.py +0 -0
  119. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/state.py +0 -0
  120. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/restorers/utils.py +0 -0
  121. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/ta/__init__.py +0 -0
  122. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/ta/indicators.pxd +0 -0
  123. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/ta/indicators.pyi +0 -0
  124. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/ta/indicators.pyx +0 -0
  125. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/trackers/__init__.py +0 -0
  126. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/trackers/advanced.py +0 -0
  127. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/trackers/composite.py +0 -0
  128. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/trackers/rebalancers.py +0 -0
  129. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/trackers/riskctrl.py +0 -0
  130. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/trackers/sizers.py +0 -0
  131. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/__init__.py +0 -0
  132. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/_pyxreloader.py +0 -0
  133. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/charting/lookinglass.py +0 -0
  134. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/charting/mpl_helpers.py +0 -0
  135. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/collections.py +0 -0
  136. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/marketdata/binance.py +0 -0
  137. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/marketdata/ccxt.py +0 -0
  138. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/marketdata/dukas.py +0 -0
  139. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/misc.py +0 -0
  140. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/ntp.py +0 -0
  141. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/numbers_utils.py +0 -0
  142. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/orderbook.py +0 -0
  143. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/plotting/__init__.py +0 -0
  144. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/plotting/dashboard.py +0 -0
  145. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/plotting/data.py +0 -0
  146. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/plotting/interfaces.py +0 -0
  147. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/plotting/renderers/__init__.py +0 -0
  148. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/plotting/renderers/plotly.py +0 -0
  149. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/questdb.py +0 -0
  150. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/runner/__init__.py +0 -0
  151. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/runner/_jupyter_runner.pyt +0 -0
  152. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/runner/accounts.py +0 -0
  153. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/runner/configs.py +0 -0
  154. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/runner/factory.py +0 -0
  155. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/runner/runner.py +0 -0
  156. {qubx-0.6.29 → qubx-0.6.30}/src/qubx/utils/time.py +0 -0
  157. {qubx-0.6.29 → qubx-0.6.30}/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.29
3
+ Version: 0.6.30
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.29"
7
+ version = "0.6.30"
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"
@@ -616,9 +616,10 @@ class CcxtDataProvider(IDataProvider):
616
616
  for exch_symbol, ccxt_ticker in ccxt_tickers.items(): # type: ignore
617
617
  instrument = ccxt_find_instrument(exch_symbol, self._exchange, _symbol_to_instrument)
618
618
  quote = ccxt_convert_ticker(ccxt_ticker)
619
- self._health_monitor.record_data_arrival(sub_type, dt_64(quote.time, "ns"))
620
- self._last_quotes[instrument] = quote
621
- channel.send((instrument, sub_type, quote, False))
619
+ if self._last_quotes[instrument] is None or quote.time > self._last_quotes[instrument].time:
620
+ self._health_monitor.record_data_arrival(sub_type, dt_64(quote.time, "ns"))
621
+ self._last_quotes[instrument] = quote
622
+ channel.send((instrument, sub_type, quote, False))
622
623
 
623
624
  async def un_watch_quote(instruments: list[Instrument]):
624
625
  symbols = [_instr_to_ccxt_symbol[i] for i in instruments]
@@ -430,8 +430,8 @@ class StrategyContext(IStrategyContext):
430
430
  def close_positions(self, market_type: MarketType | None = None) -> None:
431
431
  return self._trading_manager.close_positions(market_type)
432
432
 
433
- def cancel_order(self, order_id: str) -> None:
434
- return self._trading_manager.cancel_order(order_id)
433
+ def cancel_order(self, order_id: str, exchange: str | None = None) -> None:
434
+ return self._trading_manager.cancel_order(order_id, exchange)
435
435
 
436
436
  def cancel_orders(self, instrument: Instrument):
437
437
  return self._trading_manager.cancel_orders(instrument)
@@ -202,6 +202,8 @@ class CachedMarketDataHolder:
202
202
  series = self._ohlcvs.get(instrument)
203
203
  if series:
204
204
  for ser in series.values():
205
+ if len(ser) > 0 and ser[0].time > quote.time:
206
+ continue
205
207
  ser.update(quote.time, quote.mid_price(), 0)
206
208
 
207
209
  @SW.watch("CachedMarketDataHolder")
@@ -529,6 +529,7 @@ class TardisMachineReader(DataReader):
529
529
  raise ValueError(f"Invalid data_id format: {data_id}. Expected format: 'exchange:symbol'")
530
530
 
531
531
  exchange = TARDIS_EXCHANGE_MAPPERS.get(exchange.lower(), exchange)
532
+ symbol = self._map_symbol(symbol, exchange)
532
533
 
533
534
  start_date, end_date = handle_start_stop(start, stop)
534
535
  if not start_date:
@@ -607,6 +608,7 @@ class TardisMachineReader(DataReader):
607
608
  try:
608
609
  chunk = chunk_queue.get()
609
610
  if chunk is None: # End of chunks
611
+ logger.info(f"End of chunks for {data_id}")
610
612
  break
611
613
 
612
614
  # Process and yield the chunk
@@ -877,3 +879,10 @@ class TardisMachineReader(DataReader):
877
879
  def _stream_data(self, url: str, line_queue: Queue, stop_event: threading.Event):
878
880
  """Submit the streaming coroutine to the asyncio loop"""
879
881
  return self._async_loop.submit(self._fetch_stream(url, line_queue, stop_event))
882
+
883
+ def _map_symbol(self, symbol: str, exchange: str) -> str:
884
+ """Map symbol to Tardis Machine API format"""
885
+ if exchange.lower() == "bitfinex-derivatives":
886
+ return f"{symbol[:3]}F0:USTF0"
887
+ else:
888
+ return symbol
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