Qubx 1.0.4.dev1__tar.gz → 1.0.4.dev3__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.
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/PKG-INFO +16 -17
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/pyproject.toml +19 -24
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/_version.py +2 -2
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/cli/release.py +10 -11
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/__init__.py +15 -6
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/.gitignore +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/LICENSE +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/README.md +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/scripts/build.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/_nb_magic.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/account.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/broker.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/data.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/iteratedstream.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/management.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/ome.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/optimization.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/runner.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/sentinels.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/simulated_data.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/simulated_exchange.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/simulator.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/transfers.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/backtester/utils.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/cli/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/cli/commands.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/cli/deploy.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/cli/misc.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/cli/theme.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/cli/tui.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/config.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/account.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/adapters/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/adapters/polling_adapter.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/broker.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/connection_manager.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/data.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exceptions.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchange_manager.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/base.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/binance/broker.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/binance/exchange.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex_account.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/gateio/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/gateio/gateio.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/hyperliquid/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/hyperliquid/account.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/hyperliquid/broker.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/hyperliquid/hyperliquid.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/kraken/kraken.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/okx/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/okx/account.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/okx/broker.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/okx/okx.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/factory.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/handlers/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/handlers/base.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/handlers/factory.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/handlers/funding_rate.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/handlers/liquidation.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/handlers/ohlc.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/handlers/open_interest.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/handlers/orderbook.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/handlers/quote.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/handlers/trade.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/subscription_config.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/subscription_manager.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/subscription_orchestrator.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/utils.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/warmup_service.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/registry.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/tardis/data.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/tardis/utils.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/account.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/basics.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/context.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/detectors/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/detectors/delisting.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/detectors/stale.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/errors.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/exceptions.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/helpers.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/initializer.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/interfaces.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/loggers.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/lookups.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/metrics.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/mixins/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/mixins/market.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/mixins/processing.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/mixins/subscription.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/mixins/trading.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/mixins/universe.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/mixins/utils.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/series.pxd +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/series.pyi +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/series.pyx +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/utils.pyi +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/core/utils.pyx +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/cache.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/containers.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/guards.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/registry.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/storage.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/storages/ccxt.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/storages/csv.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/storages/handy.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/storages/multi.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/storages/questdb.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/storages/stub.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/storages/utils.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/data/transformers.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/emitters/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/emitters/base.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/emitters/composite.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/emitters/csv.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/emitters/indicator.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/emitters/inmemory.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/emitters/prometheus.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/emitters/questdb.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/exporters/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/exporters/composite.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/exporters/formatters/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/exporters/formatters/base.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/exporters/formatters/incremental.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/exporters/formatters/slack.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/exporters/formatters/target_position.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/exporters/redis_streams.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/exporters/slack.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/gathering/simplest.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/health/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/health/base.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/health/dummy.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/health/server.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/loggers/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/loggers/csv.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/loggers/factory.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/loggers/inmemory.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/loggers/mongo.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/notifications/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/notifications/composite.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/notifications/slack.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/notifications/throttler.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/pandaz/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/pandaz/stats.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/pandaz/ta.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/pandaz/utils.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/plugins/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/plugins/loader.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/resources/_build.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/resources/crypto-fees.ini +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/resources/instruments/hyperliquid-spot.json +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/resources/instruments/hyperliquid.f-perpetual.json +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/resources/instruments/symbols-binance-spot.json +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/resources/instruments/symbols-binance.cm-future.json +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/resources/instruments/symbols-binance.cm-perpetual.json +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/resources/instruments/symbols-binance.um-future.json +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/resources/instruments/symbols-binance.um-perpetual.json +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/resources/instruments/symbols-bitfinex.f-perpetual.json +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/resources/instruments/symbols-kraken-spot.json +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/resources/instruments/symbols-kraken.f-future.json +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/resources/instruments/symbols-kraken.f-perpetual.json +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/restarts/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/restarts/state_resolvers.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/restarts/time_finders.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/restorers/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/restorers/balance.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/restorers/factory.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/restorers/interfaces.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/restorers/position.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/restorers/signal.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/restorers/state.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/restorers/utils.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/state/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/state/dummy.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/state/redis.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/ta/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/ta/indicators.pxd +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/ta/indicators.pyi +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/ta/indicators.pyx +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/base.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/project/accounts.toml.j2 +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/project/config.yml.j2 +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/project/jlive.sh.j2 +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/project/jpaper.sh.j2 +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/project/pyproject.toml.j2 +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/project/src/{{ strategy_name }}/__init__.py.j2 +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/project/src/{{ strategy_name }}/strategy.py.j2 +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/project/template.yml +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/simple/__init__.py.j2 +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/simple/accounts.toml.j2 +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/simple/config.yml.j2 +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/simple/jlive.sh.j2 +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/simple/jpaper.sh.j2 +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/simple/strategy.py.j2 +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/templates/simple/template.yml +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/trackers/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/trackers/advanced.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/trackers/composite.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/trackers/rebalancers.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/trackers/riskctrl.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/trackers/sizers.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/_pyxreloader.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/charting/lookinglass.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/charting/mpl_helpers.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/charting/orderbook.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/collections.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/hft/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/hft/numba_utils.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/hft/orderbook.pyi +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/hft/orderbook.pyx +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/marketdata/binance.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/marketdata/ccxt.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/marketdata/dukas.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/misc.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/nonce.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/ntp.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/numbers_utils.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/orderbook.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/plotting/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/plotting/dashboard.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/plotting/data.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/plotting/interfaces.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/plotting/renderers/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/plotting/renderers/plotly.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/questdb.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/rate_limiter.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/results.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/ringbuffer.pxd +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/ringbuffer.pyi +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/ringbuffer.pyx +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/_jupyter_runner.pyt +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/accounts.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/configs.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/factory.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/kernel_service.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/runner.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/textual/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/textual/app.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/textual/handlers.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/textual/init_code.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/textual/kernel.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/textual/styles.tcss +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/textual/widgets/__init__.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/textual/widgets/command_input.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/textual/widgets/debug_log.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/textual/widgets/orders_table.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/textual/widgets/positions_table.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/textual/widgets/quotes_table.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/runner/textual/widgets/repl_output.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/slack.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/throttler.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/time.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/utils/websocket_manager.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/tests/strategies/macd_crossover/src/macd_crossover/indicators/macd.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/tests/strategies/macd_crossover/src/macd_crossover/models/macd_crossover.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/tests/strategies/macd_crossover/src/macd_crossover/models/utils.py +0 -0
- {qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/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.0.4.
|
|
3
|
+
Version: 1.0.4.dev3
|
|
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
|
|
@@ -9,12 +9,17 @@ Author-email: Dmitry Marienko <dmitry.marienko@xlydian.com>, Yuriy Arabskyy <yur
|
|
|
9
9
|
License-File: LICENSE
|
|
10
10
|
Requires-Python: <4.0,>=3.12
|
|
11
11
|
Requires-Dist: aiohttp<3.11,>=3.10.11
|
|
12
|
+
Requires-Dist: boto3<2,>=1.34.0
|
|
12
13
|
Requires-Dist: click<9,>=8.1.7
|
|
13
14
|
Requires-Dist: croniter<3,>=2.0.5
|
|
15
|
+
Requires-Dist: duckdb>=1.0.0
|
|
14
16
|
Requires-Dist: gitpython<4,>=3.1.44
|
|
15
17
|
Requires-Dist: importlib-metadata
|
|
18
|
+
Requires-Dist: ipykernel<7,>=6.29.0
|
|
19
|
+
Requires-Dist: ipywidgets<9,>=8.1.5
|
|
16
20
|
Requires-Dist: jinja2<4,>=3.1.0
|
|
17
21
|
Requires-Dist: joblib<2,>=1.3.0
|
|
22
|
+
Requires-Dist: jupyter-client<9,>=8.0.0
|
|
18
23
|
Requires-Dist: loguru<1,>=0.7.2
|
|
19
24
|
Requires-Dist: msgspec<1,>=0.18.6
|
|
20
25
|
Requires-Dist: ntplib<1,>=0.4.0
|
|
@@ -22,17 +27,27 @@ Requires-Dist: numba<1,>=0.59.1
|
|
|
22
27
|
Requires-Dist: numpy>=1.26.3
|
|
23
28
|
Requires-Dist: orjson<4,>=3.10.15
|
|
24
29
|
Requires-Dist: pandas<3,>=2.2.2
|
|
30
|
+
Requires-Dist: prometheus-client<1,>=0.21.1
|
|
31
|
+
Requires-Dist: psycopg-binary<4,>=3.1.19
|
|
32
|
+
Requires-Dist: psycopg-pool<4,>=3.2.2
|
|
33
|
+
Requires-Dist: psycopg<4,>=3.1.18
|
|
25
34
|
Requires-Dist: pyarrow>=15.0.0
|
|
26
35
|
Requires-Dist: pydantic-settings<3,>=2.4.0
|
|
27
36
|
Requires-Dist: pydantic<3,>=2.9.2
|
|
37
|
+
Requires-Dist: pymongo<5,>=4.6.1
|
|
28
38
|
Requires-Dist: python-dotenv<2,>=1.0.0
|
|
29
39
|
Requires-Dist: pyyaml<7,>=6.0.2
|
|
40
|
+
Requires-Dist: questdb<3,>=2.0.3
|
|
41
|
+
Requires-Dist: redis<6,>=5.2.1
|
|
30
42
|
Requires-Dist: rich<14,>=13.9.4
|
|
31
43
|
Requires-Dist: scipy<2,>=1.12.0
|
|
32
44
|
Requires-Dist: sortedcontainers<3,>=2.4.0
|
|
33
45
|
Requires-Dist: stackprinter<1,>=0.2.10
|
|
34
46
|
Requires-Dist: statsmodels<1,>=0.14.6
|
|
35
47
|
Requires-Dist: tabulate<1,>=0.9.0
|
|
48
|
+
Requires-Dist: textual-autocomplete<5,>=4.0.0
|
|
49
|
+
Requires-Dist: textual-serve<2,>=1.0.0
|
|
50
|
+
Requires-Dist: textual[syntax]<7,>=6.0.0
|
|
36
51
|
Requires-Dist: toml<1,>=0.10.2
|
|
37
52
|
Requires-Dist: tqdm<5,>=4.66.0
|
|
38
53
|
Requires-Dist: uvloop<1,>=0.22.1; sys_platform != 'win32'
|
|
@@ -43,25 +58,9 @@ Provides-Extra: bitfinex
|
|
|
43
58
|
Requires-Dist: qubx-bitfinex-api<4,>=3.0.7; extra == 'bitfinex'
|
|
44
59
|
Provides-Extra: connectors
|
|
45
60
|
Requires-Dist: ccxt<5,>=4.2.68; extra == 'connectors'
|
|
46
|
-
Provides-Extra: db
|
|
47
|
-
Requires-Dist: duckdb>=1.0.0; extra == 'db'
|
|
48
|
-
Requires-Dist: psycopg-binary<4,>=3.1.19; extra == 'db'
|
|
49
|
-
Requires-Dist: psycopg-pool<4,>=3.2.2; extra == 'db'
|
|
50
|
-
Requires-Dist: psycopg<4,>=3.1.18; extra == 'db'
|
|
51
|
-
Requires-Dist: pymongo<5,>=4.6.1; extra == 'db'
|
|
52
|
-
Requires-Dist: questdb<3,>=2.0.3; extra == 'db'
|
|
53
|
-
Requires-Dist: redis<6,>=5.2.1; extra == 'db'
|
|
54
61
|
Provides-Extra: jupyter
|
|
55
|
-
Requires-Dist: ipywidgets<9,>=8.1.5; extra == 'jupyter'
|
|
56
62
|
Requires-Dist: jupyter-console<7,>=6.6.3; extra == 'jupyter'
|
|
57
63
|
Requires-Dist: jupyter<2,>=1.1.1; extra == 'jupyter'
|
|
58
|
-
Provides-Extra: k8
|
|
59
|
-
Requires-Dist: boto3<2,>=1.34.0; extra == 'k8'
|
|
60
|
-
Requires-Dist: prometheus-client<1,>=0.21.1; extra == 'k8'
|
|
61
|
-
Provides-Extra: tui
|
|
62
|
-
Requires-Dist: textual-autocomplete<5,>=4.0.0; extra == 'tui'
|
|
63
|
-
Requires-Dist: textual-serve<2,>=1.0.0; extra == 'tui'
|
|
64
|
-
Requires-Dist: textual[syntax]<7,>=6.0.0; extra == 'tui'
|
|
65
64
|
Provides-Extra: viz
|
|
66
65
|
Requires-Dist: dash-bootstrap-components<2,>=1.6.0; extra == 'viz'
|
|
67
66
|
Requires-Dist: dash<3,>=2.18.2; extra == 'viz'
|
|
@@ -46,6 +46,24 @@ dependencies = [
|
|
|
46
46
|
"rich>=13.9.4,<14",
|
|
47
47
|
"click>=8.1.7,<9",
|
|
48
48
|
"statsmodels>=0.14.6,<1",
|
|
49
|
+
# Database backends
|
|
50
|
+
"pymongo>=4.6.1,<5",
|
|
51
|
+
"redis>=5.2.1,<6",
|
|
52
|
+
"psycopg>=3.1.18,<4",
|
|
53
|
+
"psycopg-binary>=3.1.19,<4",
|
|
54
|
+
"psycopg-pool>=3.2.2,<4",
|
|
55
|
+
"questdb>=2.0.3,<3",
|
|
56
|
+
"duckdb>=1.0.0",
|
|
57
|
+
# Terminal UI
|
|
58
|
+
"textual[syntax]>=6.0.0,<7",
|
|
59
|
+
"textual-autocomplete>=4.0.0,<5",
|
|
60
|
+
"textual-serve>=1.0.0,<2",
|
|
61
|
+
"jupyter-client>=8.0.0,<9",
|
|
62
|
+
"ipykernel>=6.29.0,<7",
|
|
63
|
+
"ipywidgets>=8.1.5,<9",
|
|
64
|
+
# Production monitoring & cloud
|
|
65
|
+
"prometheus-client>=0.21.1,<1",
|
|
66
|
+
"boto3>=1.34.0,<2",
|
|
49
67
|
]
|
|
50
68
|
|
|
51
69
|
[project.urls]
|
|
@@ -57,7 +75,7 @@ docs = "https://xlydiansoftware.github.io/Qubx"
|
|
|
57
75
|
qubx = "qubx.cli.commands:main"
|
|
58
76
|
|
|
59
77
|
# ============================================================
|
|
60
|
-
# OPTIONAL DEPENDENCIES (`pip install qubx[connectors
|
|
78
|
+
# OPTIONAL DEPENDENCIES (`pip install qubx[connectors,...]`)
|
|
61
79
|
# ============================================================
|
|
62
80
|
[project.optional-dependencies]
|
|
63
81
|
# Exchange connectors (ccxt-based)
|
|
@@ -66,16 +84,6 @@ connectors = ["ccxt>=4.2.68,<5"]
|
|
|
66
84
|
binance = ["python-binance>=1.0.19,<2"]
|
|
67
85
|
# Bitfinex-specific (custom API client)
|
|
68
86
|
bitfinex = ["qubx-bitfinex-api>=3.0.7,<4"]
|
|
69
|
-
# Database backends (MongoDB, Redis, PostgreSQL/QuestDB, DuckDB)
|
|
70
|
-
db = [
|
|
71
|
-
"pymongo>=4.6.1,<5",
|
|
72
|
-
"redis>=5.2.1,<6",
|
|
73
|
-
"psycopg>=3.1.18,<4",
|
|
74
|
-
"psycopg-binary>=3.1.19,<4",
|
|
75
|
-
"psycopg-pool>=3.2.2,<4",
|
|
76
|
-
"questdb>=2.0.3,<3",
|
|
77
|
-
"duckdb>=1.0.0",
|
|
78
|
-
]
|
|
79
87
|
# Visualization & charting
|
|
80
88
|
viz = [
|
|
81
89
|
"matplotlib>=3.8.4,<4",
|
|
@@ -83,22 +91,10 @@ viz = [
|
|
|
83
91
|
"dash>=2.18.2,<3",
|
|
84
92
|
"dash-bootstrap-components>=1.6.0,<2",
|
|
85
93
|
]
|
|
86
|
-
# Terminal UI (textual TUI, browse command)
|
|
87
|
-
tui = [
|
|
88
|
-
"textual[syntax]>=6.0.0,<7",
|
|
89
|
-
"textual-autocomplete>=4.0.0,<5",
|
|
90
|
-
"textual-serve>=1.0.0,<2",
|
|
91
|
-
]
|
|
92
94
|
# Jupyter integration
|
|
93
95
|
jupyter = [
|
|
94
96
|
"jupyter>=1.1.1,<2",
|
|
95
97
|
"jupyter-console>=6.6.3,<7",
|
|
96
|
-
"ipywidgets>=8.1.5,<9",
|
|
97
|
-
]
|
|
98
|
-
# Kubernetes / production monitoring
|
|
99
|
-
k8 = [
|
|
100
|
-
"prometheus-client>=0.21.1,<1",
|
|
101
|
-
"boto3>=1.34.0,<2",
|
|
102
98
|
]
|
|
103
99
|
|
|
104
100
|
# ============================================================
|
|
@@ -164,7 +160,6 @@ dev = [
|
|
|
164
160
|
"py-spy>=0.4.1,<1",
|
|
165
161
|
# Jupyter / notebooks
|
|
166
162
|
"ipykernel>=6.29.4,<7",
|
|
167
|
-
"iprogress>=0.4,<1",
|
|
168
163
|
"nbformat>=5.10.4,<6",
|
|
169
164
|
# Documentation
|
|
170
165
|
"markdown==3.7",
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '1.0.4.
|
|
32
|
-
__version_tuple__ = version_tuple = (1, 0, 4, '
|
|
31
|
+
__version__ = version = '1.0.4.dev3'
|
|
32
|
+
__version_tuple__ = version_tuple = (1, 0, 4, 'dev3')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -633,10 +633,15 @@ def _scan_strategy_deps(
|
|
|
633
633
|
all_deps.extend(group_deps)
|
|
634
634
|
|
|
635
635
|
# Step 4: for each declared dep, check if the strategy uses it
|
|
636
|
+
import re
|
|
637
|
+
|
|
636
638
|
scanned_deps: list[str] = []
|
|
637
639
|
for dep_spec in all_deps:
|
|
638
|
-
#
|
|
639
|
-
|
|
640
|
+
# Parse dep spec like "qubx[connectors,db,k8,tui]==1.0.3" or "cachetools>=6.2.1,<7"
|
|
641
|
+
# Extract: package name, extras (if any), version specifiers
|
|
642
|
+
match = re.match(r'^([A-Za-z0-9_.-]+)(\[[^\]]*\])?', dep_spec)
|
|
643
|
+
pkg_name = match.group(1).strip() if match else dep_spec.split("[")[0].split(">")[0].split("=")[0].split("<")[0].strip()
|
|
644
|
+
extras = match.group(2) or "" if match else ""
|
|
640
645
|
pkg_name_normalized = pkg_name.lower().replace("-", "_")
|
|
641
646
|
|
|
642
647
|
# Determine import names for this package
|
|
@@ -652,7 +657,7 @@ def _scan_strategy_deps(
|
|
|
652
657
|
if dist.files:
|
|
653
658
|
for f in dist.files:
|
|
654
659
|
parts = str(f).split("/")
|
|
655
|
-
if len(parts) > 1 and not parts[0].endswith(".dist-info"):
|
|
660
|
+
if len(parts) > 1 and parts[0] and not parts[0].endswith(".dist-info"):
|
|
656
661
|
import_names.add(parts[0].replace("-", "_"))
|
|
657
662
|
if not import_names:
|
|
658
663
|
import_names.add(pkg_name_normalized)
|
|
@@ -662,10 +667,10 @@ def _scan_strategy_deps(
|
|
|
662
667
|
|
|
663
668
|
# Check if any import name is used by strategy
|
|
664
669
|
if import_names & strategy_imports:
|
|
665
|
-
# Pin version from lock file
|
|
670
|
+
# Pin version from lock file, preserving extras
|
|
666
671
|
version = lock_versions.get(pkg_name_normalized)
|
|
667
672
|
if version:
|
|
668
|
-
pinned = f"{pkg_name}=={version}"
|
|
673
|
+
pinned = f"{pkg_name}{extras}=={version}"
|
|
669
674
|
else:
|
|
670
675
|
# Fallback to declared spec
|
|
671
676
|
pinned = dep_spec
|
|
@@ -893,12 +898,6 @@ def _generate_release_pyproject(
|
|
|
893
898
|
},
|
|
894
899
|
}
|
|
895
900
|
|
|
896
|
-
# Preserve [[tool.uv.index]] from original pyproject (needed for private registry)
|
|
897
|
-
if pyproject_data:
|
|
898
|
-
indexes = pyproject_data.get("tool", {}).get("uv", {}).get("index", [])
|
|
899
|
-
if indexes:
|
|
900
|
-
release_pyproject["tool"]["uv"]["index"] = indexes
|
|
901
|
-
|
|
902
901
|
pyproject_path = os.path.join(release_dir, "pyproject.toml")
|
|
903
902
|
with open(pyproject_path, "w") as f:
|
|
904
903
|
toml.dump(release_pyproject, f)
|
|
@@ -9,8 +9,6 @@ import ccxt.pro as cxp
|
|
|
9
9
|
from ..broker import CcxtBroker
|
|
10
10
|
from .binance.broker import BinanceCcxtBroker
|
|
11
11
|
from .binance.exchange import BINANCE_UM_MM, BinancePortfolioMargin, BinanceQV, BinanceQVUSDM
|
|
12
|
-
from .bitfinex.bitfinex import BitfinexF
|
|
13
|
-
from .bitfinex.bitfinex_account import BitfinexAccountProcessor
|
|
14
12
|
from .gateio.gateio import GateioFutures
|
|
15
13
|
from .hyperliquid.account import HyperliquidAccountProcessor
|
|
16
14
|
from .hyperliquid.broker import HyperliquidCcxtBroker
|
|
@@ -20,6 +18,15 @@ from .okx.account import OkxAccountProcessor
|
|
|
20
18
|
from .okx.broker import OkxCcxtBroker
|
|
21
19
|
from .okx.okx import OkxFutures
|
|
22
20
|
|
|
21
|
+
# Bitfinex requires optional qubx-bitfinex-api package
|
|
22
|
+
try:
|
|
23
|
+
from .bitfinex.bitfinex import BitfinexF
|
|
24
|
+
from .bitfinex.bitfinex_account import BitfinexAccountProcessor
|
|
25
|
+
|
|
26
|
+
_HAS_BITFINEX = True
|
|
27
|
+
except ImportError:
|
|
28
|
+
_HAS_BITFINEX = False
|
|
29
|
+
|
|
23
30
|
|
|
24
31
|
@dataclass
|
|
25
32
|
class ReaderCapabilities:
|
|
@@ -59,7 +66,7 @@ CUSTOM_BROKERS: dict[str, BrokerConfig] = {
|
|
|
59
66
|
"binance.um": BrokerConfig(BinanceCcxtBroker, {"enable_create_order_ws": True, "enable_cancel_order_ws": True}),
|
|
60
67
|
"binance.cm": BrokerConfig(BinanceCcxtBroker, {"enable_create_order_ws": True, "enable_cancel_order_ws": False}),
|
|
61
68
|
"binance.pm": BrokerConfig(BinanceCcxtBroker, {"enable_create_order_ws": False, "enable_cancel_order_ws": False}),
|
|
62
|
-
"bitfinex.f": BrokerConfig(CcxtBroker, {"enable_create_order_ws": True, "enable_cancel_order_ws": True}),
|
|
69
|
+
**({"bitfinex.f": BrokerConfig(CcxtBroker, {"enable_create_order_ws": True, "enable_cancel_order_ws": True})} if _HAS_BITFINEX else {}),
|
|
63
70
|
"hyperliquid": BrokerConfig(
|
|
64
71
|
HyperliquidCcxtBroker,
|
|
65
72
|
{"enable_create_order_ws": True, "enable_cancel_order_ws": False, "enable_edit_order_ws": True},
|
|
@@ -72,7 +79,7 @@ CUSTOM_BROKERS: dict[str, BrokerConfig] = {
|
|
|
72
79
|
}
|
|
73
80
|
|
|
74
81
|
CUSTOM_ACCOUNTS = {
|
|
75
|
-
"bitfinex.f": BitfinexAccountProcessor,
|
|
82
|
+
**({"bitfinex.f": BitfinexAccountProcessor} if _HAS_BITFINEX else {}),
|
|
76
83
|
"hyperliquid": HyperliquidAccountProcessor,
|
|
77
84
|
"hyperliquid.f": HyperliquidAccountProcessor,
|
|
78
85
|
"okx.f": OkxAccountProcessor,
|
|
@@ -98,7 +105,8 @@ cxp.binanceqv_usdm = BinanceQVUSDM # type: ignore
|
|
|
98
105
|
cxp.binancepm = BinancePortfolioMargin # type: ignore
|
|
99
106
|
cxp.binance_um_mm = BINANCE_UM_MM # type: ignore
|
|
100
107
|
cxp.custom_krakenfutures = CustomKrakenFutures # type: ignore
|
|
101
|
-
|
|
108
|
+
if _HAS_BITFINEX:
|
|
109
|
+
cxp.bitfinex_f = BitfinexF # type: ignore
|
|
102
110
|
cxp.hyperliquid = Hyperliquid # type: ignore
|
|
103
111
|
cxp.hyperliquid_f = HyperliquidF # type: ignore
|
|
104
112
|
cxp.gateio_futures = GateioFutures # type: ignore
|
|
@@ -110,7 +118,8 @@ cxp.exchanges.append("binancepm")
|
|
|
110
118
|
cxp.exchanges.append("binancepm_usdm")
|
|
111
119
|
cxp.exchanges.append("binance_um_mm")
|
|
112
120
|
cxp.exchanges.append("custom_krakenfutures")
|
|
113
|
-
|
|
121
|
+
if _HAS_BITFINEX:
|
|
122
|
+
cxp.exchanges.append("bitfinex_f")
|
|
114
123
|
cxp.exchanges.append("hyperliquid")
|
|
115
124
|
cxp.exchanges.append("hyperliquid_f")
|
|
116
125
|
cxp.exchanges.append("gateio_futures")
|
|
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
|
{qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex_account.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/hyperliquid/__init__.py
RENAMED
|
File without changes
|
{qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/hyperliquid/account.py
RENAMED
|
File without changes
|
{qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/hyperliquid/broker.py
RENAMED
|
File without changes
|
{qubx-1.0.4.dev1 → qubx-1.0.4.dev3}/src/qubx/connectors/ccxt/exchanges/hyperliquid/hyperliquid.py
RENAMED
|
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
|
|
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
|