Qubx 0.6.10__tar.gz → 0.6.11__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.
- {qubx-0.6.10 → qubx-0.6.11}/PKG-INFO +1 -1
- {qubx-0.6.10 → qubx-0.6.11}/pyproject.toml +1 -1
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/basics.py +14 -5
- {qubx-0.6.10 → qubx-0.6.11}/README.md +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/build.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/_nb_magic.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/backtester/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/backtester/account.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/backtester/broker.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/backtester/data.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/backtester/management.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/backtester/ome.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/backtester/optimization.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/backtester/runner.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/backtester/simulated_data.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/backtester/simulator.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/backtester/utils.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/cli/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/cli/commands.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/cli/deploy.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/cli/misc.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/cli/release.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/connectors/ccxt/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/connectors/ccxt/account.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/connectors/ccxt/broker.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/connectors/ccxt/customizations.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/connectors/ccxt/data.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/connectors/ccxt/exceptions.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/connectors/ccxt/factory.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/connectors/ccxt/reader.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/connectors/ccxt/utils.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/account.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/context.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/exceptions.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/helpers.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/initializer.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/interfaces.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/loggers.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/lookups.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/metrics.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/mixins/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/mixins/market.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/mixins/processing.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/mixins/subscription.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/mixins/trading.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/mixins/universe.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/series.pxd +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/series.pyi +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/series.pyx +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/utils.pyi +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/core/utils.pyx +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/data/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/data/composite.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/data/helpers.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/data/hft.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/data/readers.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/data/registry.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/data/tardis.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/emitters/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/emitters/base.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/emitters/composite.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/emitters/prometheus.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/emitters/questdb.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/exporters/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/exporters/composite.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/exporters/formatters/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/exporters/formatters/base.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/exporters/formatters/incremental.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/exporters/formatters/slack.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/exporters/redis_streams.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/exporters/slack.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/features/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/features/core.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/features/orderbook.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/features/price.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/features/trades.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/features/utils.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/gathering/simplest.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/math/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/math/stats.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/notifications/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/notifications/composite.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/notifications/slack.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/pandaz/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/pandaz/ta.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/pandaz/utils.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/resources/_build.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/resources/instruments/symbols-binance.cm.json +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/resources/instruments/symbols-binance.json +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/resources/instruments/symbols-binance.um.json +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/resources/instruments/symbols-bitfinex.f.json +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/resources/instruments/symbols-bitfinex.json +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/resources/instruments/symbols-kraken.f.json +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/resources/instruments/symbols-kraken.json +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/restarts/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/restarts/state_resolvers.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/restarts/time_finders.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/restorers/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/restorers/balance.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/restorers/factory.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/restorers/interfaces.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/restorers/position.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/restorers/signal.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/restorers/state.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/restorers/utils.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/ta/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/ta/indicators.pxd +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/ta/indicators.pyi +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/ta/indicators.pyx +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/trackers/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/trackers/advanced.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/trackers/composite.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/trackers/rebalancers.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/trackers/riskctrl.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/trackers/sizers.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/_pyxreloader.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/charting/lookinglass.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/charting/mpl_helpers.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/marketdata/binance.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/marketdata/ccxt.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/marketdata/dukas.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/misc.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/ntp.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/numbers_utils.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/orderbook.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/plotting/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/plotting/dashboard.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/plotting/data.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/plotting/interfaces.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/plotting/renderers/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/plotting/renderers/plotly.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/runner/__init__.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/runner/_jupyter_runner.pyt +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/runner/accounts.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/runner/configs.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/runner/runner.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/time.py +0 -0
- {qubx-0.6.10 → qubx-0.6.11}/src/qubx/utils/version.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
4
4
|
|
|
5
5
|
[tool.poetry]
|
|
6
6
|
name = "Qubx"
|
|
7
|
-
version = "0.6.
|
|
7
|
+
version = "0.6.11"
|
|
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"
|
|
@@ -8,6 +8,7 @@ from typing import Any, Literal, Optional, TypeAlias, Union
|
|
|
8
8
|
import numpy as np
|
|
9
9
|
import pandas as pd
|
|
10
10
|
|
|
11
|
+
from qubx import logger
|
|
11
12
|
from qubx.core.exceptions import QueueTimeout
|
|
12
13
|
from qubx.core.series import Bar, OrderBook, Quote, Trade, time_as_nsec
|
|
13
14
|
from qubx.core.utils import prec_ceil, prec_floor, time_delta_to_str
|
|
@@ -550,7 +551,7 @@ class Position:
|
|
|
550
551
|
qty_opening = pos_change if prev_direction == direction else pos_change - qty_closing
|
|
551
552
|
|
|
552
553
|
# - extract realized part of PnL
|
|
553
|
-
if qty_closing
|
|
554
|
+
if not np.isclose(qty_closing, 0.0):
|
|
554
555
|
_abs_qty_close = abs(qty_closing)
|
|
555
556
|
deal_pnl = qty_closing * (self.position_avg_price - exec_price)
|
|
556
557
|
|
|
@@ -564,11 +565,19 @@ class Position:
|
|
|
564
565
|
self.__pos_incr_qty = 0
|
|
565
566
|
|
|
566
567
|
# - if it has something to add to position let's update price and cost
|
|
567
|
-
if qty_opening
|
|
568
|
+
if not np.isclose(qty_opening, 0.0):
|
|
568
569
|
_abs_qty_open = abs(qty_opening)
|
|
569
|
-
|
|
570
|
-
self.__pos_incr_qty
|
|
571
|
-
|
|
570
|
+
try:
|
|
571
|
+
pos_avg_price_raw = (_abs_qty_open * exec_price + self.__pos_incr_qty * self.position_avg_price) / (
|
|
572
|
+
self.__pos_incr_qty + _abs_qty_open
|
|
573
|
+
)
|
|
574
|
+
except ZeroDivisionError:
|
|
575
|
+
logger.warning(
|
|
576
|
+
"Zero division error in position update: "
|
|
577
|
+
f"qty_opening={qty_opening}, exec_price={exec_price}, pos_incr_qty={self.__pos_incr_qty}, position_avg_price={self.position_avg_price}"
|
|
578
|
+
)
|
|
579
|
+
pos_avg_price_raw = self.position_avg_price
|
|
580
|
+
|
|
572
581
|
# - round position average price to be in line with how it's calculated by broker
|
|
573
582
|
self.position_avg_price = self.instrument.round_price_down(pos_avg_price_raw)
|
|
574
583
|
self.__pos_incr_qty += _abs_qty_open
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|