Qubx 1.2.3.dev3__tar.gz → 1.2.3.dev5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/PKG-INFO +2 -2
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/pyproject.toml +1 -1
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/_version.py +2 -2
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/binance/exchange.py +11 -68
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/ta/indicators.pxd +2 -1
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/ta/indicators.pyx +23 -9
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/.gitignore +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/LICENSE +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/README.md +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/scripts/build.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/_nb_magic.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/account.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/broker.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/data.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/iteratedstream.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/management.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/ome.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/optimization.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/runner.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/sentinels.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/simulated_data.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/simulated_exchange.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/simulator.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/transfers.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/backtester/utils.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/commands.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/deploy.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/misc.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/release.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/resolver.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/s3.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/theme.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/tui.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/cli/user_config.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/config.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/account.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/adapters/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/adapters/polling_adapter.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/broker.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/connection_manager.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/data.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exceptions.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchange_manager.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/base.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/binance/broker.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex_account.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/gateio/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/gateio/gateio.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/hyperliquid/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/hyperliquid/account.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/hyperliquid/broker.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/hyperliquid/hyperliquid.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/kraken/kraken.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/okx/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/okx/account.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/okx/broker.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/okx/okx.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/factory.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/base.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/factory.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/funding_rate.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/liquidation.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/ohlc.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/open_interest.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/orderbook.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/quote.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/handlers/trade.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/rate_limits.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/subscription_config.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/subscription_manager.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/subscription_orchestrator.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/utils.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/warmup_service.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/registry.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/tardis/data.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/tardis/utils.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/builtin.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/decorator.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/executor.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/interfaces.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/server.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/control/types.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/account.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/basics.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/context.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/detectors/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/detectors/delisting.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/detectors/stale.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/errors.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/exceptions.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/helpers.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/initializer.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/interfaces.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/loggers.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/lookups.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/metrics.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/market.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/processing.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/subscription.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/trading.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/universe.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/mixins/utils.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/series.pxd +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/series.pyi +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/series.pyx +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/utils.pyi +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/core/utils.pyx +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/cache.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/containers.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/guards.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/registry.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storage.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/ccxt.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/csv.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/handy.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/multi.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/questdb.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/stub.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/storages/utils.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/data/transformers.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/base.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/composite.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/csv.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/indicator.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/inmemory.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/prometheus.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/emitters/questdb.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/composite.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/formatters/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/formatters/base.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/formatters/incremental.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/formatters/slack.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/formatters/target_position.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/redis_streams.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/exporters/slack.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/gathering/simplest.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/health/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/health/base.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/health/dummy.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/loggers/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/loggers/csv.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/loggers/factory.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/loggers/inmemory.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/loggers/mongo.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/loggers/postgres.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/notifications/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/notifications/composite.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/notifications/slack.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/notifications/throttler.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/pandaz/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/pandaz/stats.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/pandaz/ta.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/pandaz/utils.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/plugins/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/plugins/loader.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/backend.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/config.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/engine.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/ip_resolver.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/manager.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/pools.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/rate_limiting/redis_backend.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/_build.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/crypto-fees.ini +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/hyperliquid-spot.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/hyperliquid.f-perpetual.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-binance-spot.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-binance.cm-future.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-binance.cm-perpetual.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-binance.um-future.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-binance.um-perpetual.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-bitfinex.f-perpetual.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-kraken-spot.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-kraken.f-future.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/resources/instruments/symbols-kraken.f-perpetual.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restarts/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restarts/state_resolvers.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restarts/time_finders.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/balance.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/factory.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/interfaces.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/position.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/signal.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/state.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/restorers/utils.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/state/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/state/dummy.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/state/redis.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/ta/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/ta/indicators.pyi +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/base.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/accounts.toml.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/config.yml.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/jlive.sh.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/jpaper.sh.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/pyproject.toml.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/src/{{ strategy_name }}/__init__.py.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/src/{{ strategy_name }}/strategy.py.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/project/template.yml +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.claude/skills/qubx-cli/SKILL.md +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.claude/skills/qubx-indicators/SKILL.md +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.claude/skills/simulation-explorer/SKILL.md +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.claude/skills/strategy-release/SKILL.md +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.github/workflows/ci.yml.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.gitignore.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.python-version +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.vscode/launch.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.vscode/settings.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/.vscode/tasks.json +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/CLAUDE.md.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/README.md.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/configs/.gitkeep +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/justfile.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/pyproject.toml.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/research/.gitkeep +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/src/{{ strategy_name }}/__init__.py.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/src/{{ strategy_name }}/cli.py.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/src/{{ strategy_name }}/strategy.py.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/template.yml +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/repo/tests/test_strategy.py.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/__init__.py.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/accounts.toml.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/config.yml.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/jlive.sh.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/jpaper.sh.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/strategy.py.j2 +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/templates/simple/template.yml +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/trackers/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/trackers/advanced.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/trackers/composite.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/trackers/rebalancers.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/trackers/riskctrl.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/trackers/sizers.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/_pyxreloader.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/charting/lookinglass.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/charting/mpl_helpers.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/charting/orderbook.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/collections.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/hft/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/hft/numba_utils.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/hft/orderbook.pyi +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/hft/orderbook.pyx +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/marketdata/binance.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/marketdata/ccxt.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/marketdata/dukas.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/misc.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/nonce.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/ntp.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/numbers_utils.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/orderbook.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/plotting/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/plotting/dashboard.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/plotting/data.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/plotting/interfaces.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/plotting/renderers/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/plotting/renderers/plotly.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/questdb.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/rate_limiter.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/results.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/ringbuffer.pxd +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/ringbuffer.pyi +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/ringbuffer.pyx +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/_jupyter_runner.pyt +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/accounts.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/configs.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/factory.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/kernel_service.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/runner.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/app.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/handlers.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/init_code.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/kernel.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/styles.tcss +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/__init__.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/account_summary.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/command_input.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/debug_log.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/orders_table.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/positions_table.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/quotes_table.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/runner/textual/widgets/repl_output.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/s3.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/slack.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/throttler.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/time.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/utils/websocket_manager.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/tests/strategies/macd_crossover/src/macd_crossover/indicators/macd.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/tests/strategies/macd_crossover/src/macd_crossover/models/macd_crossover.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/tests/strategies/macd_crossover/src/macd_crossover/models/utils.py +0 -0
- {qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/tests/strategies/obi_trader/src/obi_trader/models/obi_trader.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: Qubx
|
|
3
|
-
Version: 1.2.3.
|
|
3
|
+
Version: 1.2.3.dev5
|
|
4
4
|
Summary: Qubx - Quantitative Trading Framework
|
|
5
5
|
Project-URL: homepage, https://xlydian.com
|
|
6
6
|
Project-URL: repository, https://github.com/xLydianSoftware/Qubx
|
|
@@ -58,7 +58,7 @@ Requires-Dist: python-binance<2,>=1.0.19; extra == 'binance'
|
|
|
58
58
|
Provides-Extra: bitfinex
|
|
59
59
|
Requires-Dist: qubx-bitfinex-api<4,>=3.0.7; extra == 'bitfinex'
|
|
60
60
|
Provides-Extra: connectors
|
|
61
|
-
Requires-Dist: ccxt<5,>=4.
|
|
61
|
+
Requires-Dist: ccxt<5,>=4.5.46; extra == 'connectors'
|
|
62
62
|
Provides-Extra: jupyter
|
|
63
63
|
Requires-Dist: jupyter-console<7,>=6.6.3; extra == 'jupyter'
|
|
64
64
|
Requires-Dist: jupyter<2,>=1.1.1; extra == 'jupyter'
|
|
@@ -81,7 +81,7 @@ qubx = "qubx.cli.commands:main"
|
|
|
81
81
|
# ============================================================
|
|
82
82
|
[project.optional-dependencies]
|
|
83
83
|
# Exchange connectors (ccxt-based)
|
|
84
|
-
connectors = ["ccxt>=4.
|
|
84
|
+
connectors = ["ccxt>=4.5.46,<5"]
|
|
85
85
|
# Binance-specific (historical data utilities)
|
|
86
86
|
binance = ["python-binance>=1.0.19,<2"]
|
|
87
87
|
# Bitfinex-specific (custom API client)
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.2.3.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2, 3, '
|
|
21
|
+
__version__ = version = '1.2.3.dev5'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 3, 'dev5')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -4,7 +4,7 @@ import ccxt.pro as cxp
|
|
|
4
4
|
import pandas as pd
|
|
5
5
|
from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheByTimestamp
|
|
6
6
|
from ccxt.async_support.base.ws.client import Client
|
|
7
|
-
from ccxt.base.errors import
|
|
7
|
+
from ccxt.base.errors import BadRequest, InsufficientFunds
|
|
8
8
|
from ccxt.base.precise import Precise
|
|
9
9
|
from ccxt.base.types import (
|
|
10
10
|
Any,
|
|
@@ -52,76 +52,19 @@ class BinanceQV(CcxtFuturePatchMixin, cxp.binance):
|
|
|
52
52
|
|
|
53
53
|
async def un_watch_bids_asks(self, symbols: Strings = None, params: dict = {}) -> Any:
|
|
54
54
|
"""
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
55
|
+
Unsubscribes from the bookTicker stream for the given symbols.
|
|
56
|
+
|
|
57
|
+
Upstream ccxt ships un_watch_bids_asks as a NotSupported stub, but the
|
|
58
|
+
companion watch_multi_ticker_helper has a working isUnsubscribe branch
|
|
59
|
+
that mirrors the subscribe path exactly (URL, sub-hashes, request body).
|
|
60
|
+
Delegating keeps us aligned with upstream's 2026-04 USDⓈ-M URL split
|
|
61
|
+
(/public/ws) and avoids duplicating internals that have already been
|
|
62
|
+
refactored once (get_message_hash was removed in ccxt 4.5.20).
|
|
64
63
|
"""
|
|
65
64
|
await self.load_markets()
|
|
66
|
-
methodName = "watchBidsAsks"
|
|
67
|
-
channelName = "bookTicker"
|
|
68
65
|
symbols = self.market_symbols(symbols, None, True, False, True)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
symbolsDefined = symbols is not None
|
|
72
|
-
if symbolsDefined:
|
|
73
|
-
firstMarket = self.market(symbols[0])
|
|
74
|
-
marketType, params = self.handle_market_type_and_params(methodName, firstMarket, params)
|
|
75
|
-
subType = None
|
|
76
|
-
subType, params = self.handle_sub_type_and_params(methodName, firstMarket, params)
|
|
77
|
-
rawMarketType = None
|
|
78
|
-
if self.isLinear(marketType, subType):
|
|
79
|
-
rawMarketType = "future"
|
|
80
|
-
elif self.isInverse(marketType, subType):
|
|
81
|
-
rawMarketType = "delivery"
|
|
82
|
-
elif marketType == "spot":
|
|
83
|
-
rawMarketType = marketType
|
|
84
|
-
else:
|
|
85
|
-
raise NotSupported(str(self.id) + " " + methodName + "() does not support options markets")
|
|
86
|
-
isBidAsk = True
|
|
87
|
-
subscriptionArgs = []
|
|
88
|
-
subMessageHashes = []
|
|
89
|
-
messageHashes = []
|
|
90
|
-
if symbolsDefined:
|
|
91
|
-
for i in range(0, len(symbols)):
|
|
92
|
-
symbol = symbols[i]
|
|
93
|
-
market = self.market(symbol)
|
|
94
|
-
subscriptionArgs.append(market["lowercaseId"] + "@" + channelName)
|
|
95
|
-
subMessageHashes.append(self.get_message_hash(channelName, market["symbol"], isBidAsk))
|
|
96
|
-
messageHashes.append("unsubscribe:bidsasks:" + symbol)
|
|
97
|
-
else:
|
|
98
|
-
if marketType == "spot":
|
|
99
|
-
raise ArgumentsRequired(
|
|
100
|
-
str(self.id) + " " + methodName + "() requires symbols for this channel for spot markets"
|
|
101
|
-
)
|
|
102
|
-
subscriptionArgs.append("!" + channelName)
|
|
103
|
-
subMessageHashes.append(self.get_message_hash(channelName, None, isBidAsk))
|
|
104
|
-
messageHashes.append("unsubscribe:bidsasks")
|
|
105
|
-
streamHash = channelName
|
|
106
|
-
if symbolsDefined:
|
|
107
|
-
streamHash = channelName + "::" + ",".join(symbols)
|
|
108
|
-
url = self.urls["api"]["ws"][rawMarketType] + "/" + self.stream(rawMarketType, streamHash)
|
|
109
|
-
requestId = self.request_id(url)
|
|
110
|
-
request: dict = {
|
|
111
|
-
"method": "UNSUBSCRIBE",
|
|
112
|
-
"params": subscriptionArgs,
|
|
113
|
-
"id": requestId,
|
|
114
|
-
}
|
|
115
|
-
subscription: dict = {
|
|
116
|
-
"unsubscribe": True,
|
|
117
|
-
"id": str(requestId),
|
|
118
|
-
"subMessageHashes": subMessageHashes,
|
|
119
|
-
"messageHashes": subMessageHashes,
|
|
120
|
-
"symbols": symbols,
|
|
121
|
-
"topic": "bidsasks",
|
|
122
|
-
}
|
|
123
|
-
return await self.watch_multiple(
|
|
124
|
-
url, subMessageHashes, self.extend(request, params), subMessageHashes, subscription
|
|
66
|
+
return await self.watch_multi_ticker_helper(
|
|
67
|
+
"watchBidsAsks", "bookTicker", symbols, params, isUnsubscribe=True
|
|
125
68
|
)
|
|
126
69
|
|
|
127
70
|
def parse_ohlcv(self, ohlcv, market=None):
|
|
@@ -198,7 +198,8 @@ cdef class Rsi(Indicator):
|
|
|
198
198
|
cdef object down_moves
|
|
199
199
|
cdef object smooth_up
|
|
200
200
|
cdef object smooth_down
|
|
201
|
-
cdef double prev_value
|
|
201
|
+
cdef double prev_value # - close of the previous COMPLETED bar (reference for diff)
|
|
202
|
+
cdef double last_value # - current bar's working value (updates on every tick)
|
|
202
203
|
|
|
203
204
|
cpdef double calculate(self, long long time, double value, short new_item_started)
|
|
204
205
|
|
|
@@ -1264,6 +1264,7 @@ cdef class Rsi(Indicator):
|
|
|
1264
1264
|
def __init__(self, str name, TimeSeries series, int period, str smoother="ema"):
|
|
1265
1265
|
self.period = period
|
|
1266
1266
|
self.prev_value = np.nan
|
|
1267
|
+
self.last_value = np.nan
|
|
1267
1268
|
|
|
1268
1269
|
# - create internal series for up and down moves
|
|
1269
1270
|
self.up_moves = TimeSeries("up_moves", series.timeframe, series.max_series_length)
|
|
@@ -1278,20 +1279,33 @@ cdef class Rsi(Indicator):
|
|
|
1278
1279
|
cpdef double calculate(self, long long time, double value, short new_item_started):
|
|
1279
1280
|
cdef double diff, up_move, down_move, smooth_u, smooth_d
|
|
1280
1281
|
|
|
1281
|
-
# -
|
|
1282
|
-
|
|
1283
|
-
|
|
1282
|
+
# - very first tick ever: initialize working value, emit 0 up/down moves,
|
|
1283
|
+
# - keep prev_value = NaN so no diff is computed until the first bar finalizes
|
|
1284
|
+
if np.isnan(self.last_value):
|
|
1285
|
+
self.last_value = value
|
|
1284
1286
|
self.up_moves.update(time, 0.0)
|
|
1285
1287
|
self.down_moves.update(time, 0.0)
|
|
1286
1288
|
return np.nan
|
|
1287
1289
|
|
|
1288
|
-
# -
|
|
1290
|
+
# - on new bar: the previously tracked working value (last_value) has just
|
|
1291
|
+
# - been finalized as the previous bar's close — promote it to prev_value
|
|
1292
|
+
# - so diff is measured against the true previous-bar close, not against
|
|
1293
|
+
# - any intrabar tick we may have seen earlier.
|
|
1289
1294
|
if new_item_started:
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
+
self.prev_value = self.last_value
|
|
1296
|
+
|
|
1297
|
+
# - track current working value for the bar (updates on every tick)
|
|
1298
|
+
self.last_value = value
|
|
1299
|
+
|
|
1300
|
+
# - still in the first bar (no finalized prev close yet): emit 0 moves
|
|
1301
|
+
# - and NaN — matches the single-call init path from batch replay
|
|
1302
|
+
if np.isnan(self.prev_value):
|
|
1303
|
+
self.up_moves.update(time, 0.0)
|
|
1304
|
+
self.down_moves.update(time, 0.0)
|
|
1305
|
+
return np.nan
|
|
1306
|
+
|
|
1307
|
+
# - diff is always against the previous COMPLETED bar's close
|
|
1308
|
+
diff = value - self.prev_value
|
|
1295
1309
|
|
|
1296
1310
|
# - calculate up and down moves
|
|
1297
1311
|
if diff > 0:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/bitfinex/bitfinex_account.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/hyperliquid/__init__.py
RENAMED
|
File without changes
|
{qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/hyperliquid/account.py
RENAMED
|
File without changes
|
{qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/src/qubx/connectors/ccxt/exchanges/hyperliquid/broker.py
RENAMED
|
File without changes
|
{qubx-1.2.3.dev3 → qubx-1.2.3.dev5}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|