Qubx 0.6.31__cp312-cp312-manylinux_2_39_x86_64.whl → 0.6.35__cp312-cp312-manylinux_2_39_x86_64.whl
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/connectors/ccxt/broker.py +4 -1
- qubx/connectors/ccxt/exchanges/__init__.py +2 -0
- qubx/connectors/ccxt/exchanges/bitfinex/bitfinex.py +91 -2
- qubx/connectors/ccxt/exchanges/bitfinex/bitfinex_account.py +0 -2
- qubx/connectors/tardis/data.py +5 -2
- qubx/core/series.cpython-312-x86_64-linux-gnu.so +0 -0
- qubx/core/utils.cpython-312-x86_64-linux-gnu.so +0 -0
- qubx/ta/indicators.cpython-312-x86_64-linux-gnu.so +0 -0
- qubx/utils/runner/runner.py +7 -7
- {qubx-0.6.31.dist-info → qubx-0.6.35.dist-info}/METADATA +2 -1
- {qubx-0.6.31.dist-info → qubx-0.6.35.dist-info}/RECORD +14 -14
- {qubx-0.6.31.dist-info → qubx-0.6.35.dist-info}/LICENSE +0 -0
- {qubx-0.6.31.dist-info → qubx-0.6.35.dist-info}/WHEEL +0 -0
- {qubx-0.6.31.dist-info → qubx-0.6.35.dist-info}/entry_points.txt +0 -0
qubx/connectors/ccxt/broker.py
CHANGED
|
@@ -168,7 +168,7 @@ class CcxtBroker(IBroker):
|
|
|
168
168
|
raise error
|
|
169
169
|
|
|
170
170
|
# If there was no error but also no order, something went wrong
|
|
171
|
-
if not order:
|
|
171
|
+
if not order and not self.enable_create_order_ws:
|
|
172
172
|
raise ExchangeError("Order creation failed with no specific error")
|
|
173
173
|
|
|
174
174
|
return order
|
|
@@ -224,6 +224,9 @@ class CcxtBroker(IBroker):
|
|
|
224
224
|
logger.error(msg)
|
|
225
225
|
return None, ExchangeError(msg)
|
|
226
226
|
|
|
227
|
+
if r["id"] is None:
|
|
228
|
+
return None, None
|
|
229
|
+
|
|
227
230
|
order = ccxt_convert_order_info(instrument, r)
|
|
228
231
|
logger.info(f"New order {order}")
|
|
229
232
|
return order, None
|
|
@@ -6,6 +6,7 @@ from functools import partial
|
|
|
6
6
|
|
|
7
7
|
import ccxt.pro as cxp
|
|
8
8
|
|
|
9
|
+
from ..broker import CcxtBroker
|
|
9
10
|
from .binance.broker import BinanceCcxtBroker
|
|
10
11
|
from .binance.exchange import BINANCE_UM_MM, BinancePortfolioMargin, BinanceQV, BinanceQVUSDM
|
|
11
12
|
from .bitfinex.bitfinex import BitfinexF
|
|
@@ -27,6 +28,7 @@ CUSTOM_BROKERS = {
|
|
|
27
28
|
"binance.um": partial(BinanceCcxtBroker, enable_create_order_ws=True, enable_cancel_order_ws=False),
|
|
28
29
|
"binance.cm": partial(BinanceCcxtBroker, enable_create_order_ws=True, enable_cancel_order_ws=False),
|
|
29
30
|
"binance.pm": partial(BinanceCcxtBroker, enable_create_order_ws=False, enable_cancel_order_ws=False),
|
|
31
|
+
"bitfinex.f": partial(CcxtBroker, enable_create_order_ws=True, enable_cancel_order_ws=True),
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
CUSTOM_ACCOUNTS = {
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from dataclasses import asdict
|
|
1
3
|
from typing import Dict, List
|
|
2
4
|
|
|
3
5
|
import ccxt.pro as cxp
|
|
6
|
+
from bfxapi import REST_HOST
|
|
7
|
+
from bfxapi import Client as BfxClient
|
|
8
|
+
from bfxapi.types import Order as BfxOrder
|
|
4
9
|
from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheByTimestamp
|
|
5
10
|
from ccxt.async_support.base.ws.client import Client
|
|
6
11
|
from ccxt.base.errors import ArgumentsRequired, BadRequest, NotSupported
|
|
@@ -19,12 +24,26 @@ from ccxt.base.types import (
|
|
|
19
24
|
Tickers,
|
|
20
25
|
)
|
|
21
26
|
|
|
27
|
+
from qubx import logger
|
|
28
|
+
|
|
22
29
|
|
|
23
30
|
class BitfinexF(cxp.bitfinex):
|
|
24
31
|
"""
|
|
25
32
|
Extended binance exchange to provide quote asset volumes support
|
|
26
33
|
"""
|
|
27
34
|
|
|
35
|
+
def __init__(self, *args, **kwargs):
|
|
36
|
+
super().__init__(*args, **kwargs)
|
|
37
|
+
|
|
38
|
+
# we are adding here the official bitfinex client to extend missing functionality
|
|
39
|
+
self.bfx = BfxClient(rest_host=REST_HOST, api_key=self.apiKey, api_secret=self.secret)
|
|
40
|
+
|
|
41
|
+
@self.bfx.wss.on("authenticated")
|
|
42
|
+
def on_authenticated(data: dict[str, Any]):
|
|
43
|
+
logger.info(f"Successful login for user {data['userId']}.")
|
|
44
|
+
|
|
45
|
+
asyncio.run_coroutine_threadsafe(self.bfx.wss.start(), self.asyncio_loop)
|
|
46
|
+
|
|
28
47
|
def describe(self):
|
|
29
48
|
"""
|
|
30
49
|
Overriding watchTrades to use aggTrade instead of trade.
|
|
@@ -34,6 +53,8 @@ class BitfinexF(cxp.bitfinex):
|
|
|
34
53
|
{
|
|
35
54
|
"has": {
|
|
36
55
|
"watchBidsAsks": True,
|
|
56
|
+
"createOrderWs": True,
|
|
57
|
+
"cancelOrderWs": True,
|
|
37
58
|
}
|
|
38
59
|
},
|
|
39
60
|
)
|
|
@@ -60,13 +81,42 @@ class BitfinexF(cxp.bitfinex):
|
|
|
60
81
|
response = await super().create_order(symbol, type, side, amount, price, params)
|
|
61
82
|
return response
|
|
62
83
|
|
|
84
|
+
async def create_order_ws(
|
|
85
|
+
self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}
|
|
86
|
+
) -> Order:
|
|
87
|
+
params.pop("type", None)
|
|
88
|
+
if "timeInForce" in params and params["timeInForce"] == "GTX":
|
|
89
|
+
# GTX is not supported by bitfinex, so we need to convert it to PO
|
|
90
|
+
params["timeInForce"] = "PO"
|
|
91
|
+
params["postOnly"] = True
|
|
92
|
+
|
|
93
|
+
await self.load_markets()
|
|
94
|
+
market = self.market(symbol)
|
|
95
|
+
request = self.create_order_request(symbol, type, side, amount, price, params)
|
|
96
|
+
|
|
97
|
+
# if "newClientOrderId" in request:
|
|
98
|
+
# request["cid"] = request["newClientOrderId"]
|
|
99
|
+
# del request["newClientOrderId"]
|
|
100
|
+
|
|
101
|
+
await self.bfx.wss.inputs.submit_order(
|
|
102
|
+
type=request["type"],
|
|
103
|
+
symbol=request["symbol"],
|
|
104
|
+
amount=float(request["amount"]),
|
|
105
|
+
price=float(request["price"]),
|
|
106
|
+
flags=request["flags"],
|
|
107
|
+
# cid=int(request["cid"]),
|
|
108
|
+
)
|
|
109
|
+
return self.safe_order({"info": {}}, market) # type: ignore
|
|
110
|
+
|
|
111
|
+
async def cancel_order_ws(self, id: str, symbol: Str = None, params={}) -> Order | None:
|
|
112
|
+
await self.bfx.wss.inputs.cancel_order(id=int(id))
|
|
113
|
+
return None
|
|
114
|
+
|
|
63
115
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
|
64
116
|
response = await super().watch_orders(symbol, since, limit, params)
|
|
65
|
-
print(response)
|
|
66
117
|
return response
|
|
67
118
|
|
|
68
119
|
def parse_ws_order_status(self, status):
|
|
69
|
-
print(status)
|
|
70
120
|
statuses: dict = {
|
|
71
121
|
"ACTIVE": "open",
|
|
72
122
|
"CANCELED": "canceled",
|
|
@@ -167,3 +217,42 @@ class BitfinexF(cxp.bitfinex):
|
|
|
167
217
|
"takeProfitPrice": None,
|
|
168
218
|
}
|
|
169
219
|
)
|
|
220
|
+
|
|
221
|
+
def _bfx_order_to_ccxt_order(self, bfx_order: BfxOrder, market: Market = None) -> Order:
|
|
222
|
+
flags = self.parse_order_flags(bfx_order.flags)
|
|
223
|
+
postOnly = False
|
|
224
|
+
if flags is not None:
|
|
225
|
+
for i in range(0, len(flags)):
|
|
226
|
+
if flags[i] == "postOnly":
|
|
227
|
+
postOnly = True
|
|
228
|
+
|
|
229
|
+
side = "sell" if Precise.string_lt(bfx_order.amount, "0") else "buy"
|
|
230
|
+
timeInForce = self.parse_time_in_force(bfx_order.order_type)
|
|
231
|
+
type = self.safe_string(self.safe_value(self.options, "exchangeTypes"), bfx_order.order_type)
|
|
232
|
+
|
|
233
|
+
return self.safe_order(
|
|
234
|
+
{
|
|
235
|
+
"info": asdict(bfx_order),
|
|
236
|
+
"id": str(bfx_order.id),
|
|
237
|
+
"clientOrderId": str(bfx_order.cid),
|
|
238
|
+
"timestamp": bfx_order.mts_create,
|
|
239
|
+
"datetime": self.iso8601(bfx_order.mts_create),
|
|
240
|
+
"lastTradeTimestamp": None,
|
|
241
|
+
"symbol": self.safe_symbol(bfx_order.symbol, market),
|
|
242
|
+
"type": type,
|
|
243
|
+
"timeInForce": timeInForce,
|
|
244
|
+
"postOnly": postOnly,
|
|
245
|
+
"side": side,
|
|
246
|
+
"price": bfx_order.price,
|
|
247
|
+
"triggerPrice": None,
|
|
248
|
+
"amount": bfx_order.amount,
|
|
249
|
+
"cost": None,
|
|
250
|
+
"average": bfx_order.price_avg,
|
|
251
|
+
"filled": None,
|
|
252
|
+
"remaining": None,
|
|
253
|
+
"status": None,
|
|
254
|
+
"fee": None,
|
|
255
|
+
"trades": None,
|
|
256
|
+
},
|
|
257
|
+
market,
|
|
258
|
+
) # type: ignore
|
|
@@ -24,9 +24,7 @@ class BitfinexAccountProcessor(CcxtAccountProcessor):
|
|
|
24
24
|
trades = await self.exchange.watch_my_trades()
|
|
25
25
|
for trade in trades: # type: ignore
|
|
26
26
|
instrument = ccxt_find_instrument(trade["symbol"], self.exchange, _symbol_to_instrument)
|
|
27
|
-
print(trade)
|
|
28
27
|
deals = ccxt_extract_deals_from_exec({"trades": [trade]})
|
|
29
|
-
print(deals)
|
|
30
28
|
channel.send((instrument, "deals", deals, False))
|
|
31
29
|
|
|
32
30
|
await asyncio.gather(
|
qubx/connectors/tardis/data.py
CHANGED
|
@@ -20,7 +20,7 @@ from qubx.core.interfaces import IDataProvider, IHealthMonitor
|
|
|
20
20
|
from qubx.core.series import Bar, Quote, Trade
|
|
21
21
|
from qubx.data.tardis import TARDIS_EXCHANGE_MAPPERS
|
|
22
22
|
from qubx.health import DummyHealthMonitor
|
|
23
|
-
from qubx.utils.misc import AsyncThreadLoop
|
|
23
|
+
from qubx.utils.misc import AsyncThreadLoop, synchronized
|
|
24
24
|
|
|
25
25
|
from .utils import (
|
|
26
26
|
tardis_convert_orderbook,
|
|
@@ -354,6 +354,7 @@ class TardisDataProvider(IDataProvider):
|
|
|
354
354
|
self._symbol_to_instrument[tardis_symbol] = instrument
|
|
355
355
|
return tardis_symbol
|
|
356
356
|
|
|
357
|
+
@synchronized
|
|
357
358
|
async def _start_websocket_connection(self):
|
|
358
359
|
"""Start the WebSocket connection to Tardis Machine."""
|
|
359
360
|
if not self._subscriptions:
|
|
@@ -420,6 +421,7 @@ class TardisDataProvider(IDataProvider):
|
|
|
420
421
|
except Exception as e:
|
|
421
422
|
logger.error(f"{self.__prefix()} WebSocket error: {e}")
|
|
422
423
|
finally:
|
|
424
|
+
logger.info(f"{self.__prefix()} WebSocket connection closed")
|
|
423
425
|
self._ws = None
|
|
424
426
|
|
|
425
427
|
async def _close_websocket_connection(self):
|
|
@@ -452,6 +454,7 @@ class TardisDataProvider(IDataProvider):
|
|
|
452
454
|
|
|
453
455
|
# Record data arrival for health monitoring
|
|
454
456
|
tardis_type = data["type"]
|
|
457
|
+
tardis_name = data["name"]
|
|
455
458
|
qubx_type = self._map_tardis_type_to_data_type(tardis_type)
|
|
456
459
|
if qubx_type:
|
|
457
460
|
self._health_monitor.record_data_arrival(qubx_type, dt_64(msg_time, "ns"))
|
|
@@ -468,7 +471,7 @@ class TardisDataProvider(IDataProvider):
|
|
|
468
471
|
# This is a simplified implementation
|
|
469
472
|
pass
|
|
470
473
|
|
|
471
|
-
elif tardis_type == "quote":
|
|
474
|
+
elif tardis_type == "quote" or tardis_name == "quote":
|
|
472
475
|
if DataType.QUOTE in self._subscriptions and instrument in self._subscriptions[DataType.QUOTE]:
|
|
473
476
|
quote = tardis_convert_quote(data, instrument)
|
|
474
477
|
if quote:
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
qubx/utils/runner/runner.py
CHANGED
|
@@ -463,10 +463,10 @@ def _create_account_processor(
|
|
|
463
463
|
restored_state: RestoredState | None = None,
|
|
464
464
|
read_only: bool = False,
|
|
465
465
|
) -> IAccountProcessor:
|
|
466
|
-
if
|
|
467
|
-
connector = exchange_config.account.connector
|
|
468
|
-
elif paper:
|
|
466
|
+
if paper:
|
|
469
467
|
connector = "paper"
|
|
468
|
+
elif exchange_config.account is not None:
|
|
469
|
+
connector = exchange_config.account.connector
|
|
470
470
|
else:
|
|
471
471
|
connector = exchange_config.connector
|
|
472
472
|
|
|
@@ -514,12 +514,12 @@ def _create_broker(
|
|
|
514
514
|
account_manager: AccountConfigurationManager,
|
|
515
515
|
paper: bool,
|
|
516
516
|
) -> IBroker:
|
|
517
|
-
if
|
|
518
|
-
connector = exchange_config.broker.connector
|
|
519
|
-
params = exchange_config.broker.params
|
|
520
|
-
elif paper:
|
|
517
|
+
if paper:
|
|
521
518
|
connector = "paper"
|
|
522
519
|
params = {}
|
|
520
|
+
elif exchange_config.broker is not None:
|
|
521
|
+
connector = exchange_config.broker.connector
|
|
522
|
+
params = exchange_config.broker.params
|
|
523
523
|
else:
|
|
524
524
|
connector = exchange_config.connector
|
|
525
525
|
params = exchange_config.params
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: Qubx
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.35
|
|
4
4
|
Summary: Qubx - Quantitative Trading Framework
|
|
5
5
|
Author: Dmitry Marienko
|
|
6
6
|
Author-email: dmitry.marienko@xlydian.com
|
|
@@ -11,6 +11,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.12
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.13
|
|
13
13
|
Requires-Dist: aiohttp (>=3.10.11,<3.11.0)
|
|
14
|
+
Requires-Dist: bitfinex-api-py (>=3.0.4,<4.0.0)
|
|
14
15
|
Requires-Dist: ccxt (>=4.2.68,<5.0.0)
|
|
15
16
|
Requires-Dist: croniter (>=2.0.5,<3.0.0)
|
|
16
17
|
Requires-Dist: cython (==3.0.8)
|
|
@@ -19,19 +19,19 @@ qubx/cli/misc.py,sha256=tP28QxLEzuP8R2xnt8g3JTs9Z7aYy4iVWY4g3VzKTsQ,14777
|
|
|
19
19
|
qubx/cli/release.py,sha256=JYdNt_ZM9jarmYiRDtKqbRqqllzm2Qwi6VggokB2j8A,28167
|
|
20
20
|
qubx/connectors/ccxt/__init__.py,sha256=HEQ7lM9HS8sED_zfsAHrhFT7F9E7NFGAecwZwNr-TDE,65
|
|
21
21
|
qubx/connectors/ccxt/account.py,sha256=HILqsSPfor58NrlP0qYwO5lkNZzUBG-SR5Hy1OSa7_M,24308
|
|
22
|
-
qubx/connectors/ccxt/broker.py,sha256=
|
|
22
|
+
qubx/connectors/ccxt/broker.py,sha256=PqGQU1CfwpGtjahynzIZul2hCOpVdkqu3B03aCulpcM,15408
|
|
23
23
|
qubx/connectors/ccxt/data.py,sha256=COVUh37ZdCUjiDB0a38Cj9SNSV8P95mqG2B3Gc_fQ2U,30172
|
|
24
24
|
qubx/connectors/ccxt/exceptions.py,sha256=OfZc7iMdEG8uLorcZta2NuEuJrSIqi0FG7IICmwF54M,262
|
|
25
|
-
qubx/connectors/ccxt/exchanges/__init__.py,sha256=
|
|
25
|
+
qubx/connectors/ccxt/exchanges/__init__.py,sha256=eOWj-VN1ZpMX89hSzsVxdl1Knxae-29kPl_bUHbX--k,1885
|
|
26
26
|
qubx/connectors/ccxt/exchanges/binance/broker.py,sha256=BB2V82zaOm1EjP3GrsOqQQMeGpml6-w23iv7goKrjyU,2111
|
|
27
27
|
qubx/connectors/ccxt/exchanges/binance/exchange.py,sha256=ywmf373kVkXXw0h1PTqi7dg_3-sb7ZYKC8Y3qTmDtsY,24561
|
|
28
|
-
qubx/connectors/ccxt/exchanges/bitfinex/bitfinex.py,sha256=
|
|
29
|
-
qubx/connectors/ccxt/exchanges/bitfinex/bitfinex_account.py,sha256=
|
|
28
|
+
qubx/connectors/ccxt/exchanges/bitfinex/bitfinex.py,sha256=SoMXtcPhuPU2Bi1kAymaq9VA9vHWPNt7l40EJMehMsk,10381
|
|
29
|
+
qubx/connectors/ccxt/exchanges/bitfinex/bitfinex_account.py,sha256=zrnA6GJiNddoM5JF-SlFFO4FpITDO5rGaU9ipshUvAY,1603
|
|
30
30
|
qubx/connectors/ccxt/exchanges/kraken/kraken.py,sha256=RFrnvr1L1NZYoKYWR5_L8vVkpMXtY7UDkWRnHeoasDU,351
|
|
31
31
|
qubx/connectors/ccxt/factory.py,sha256=T0cMSH5m6-T2LXrbZHM9uCSOYOfZf-bh1fAOXAoFhF4,3226
|
|
32
32
|
qubx/connectors/ccxt/reader.py,sha256=qaZIaOZkRf3Rz31ZrEqqAv4kATk5zDlSq-LK1jziBs8,8314
|
|
33
33
|
qubx/connectors/ccxt/utils.py,sha256=hin4NgFJCH8fwQMZsjnMCwtP4KiITm5xgkiBnWgzMkI,11733
|
|
34
|
-
qubx/connectors/tardis/data.py,sha256=
|
|
34
|
+
qubx/connectors/tardis/data.py,sha256=S8YjJ35_GXc3o8_VRPAM3L4GSnADPPdV46y0EgFd0NU,30919
|
|
35
35
|
qubx/connectors/tardis/utils.py,sha256=epThu9DwqbDb7BgScH6fHa_FVpKUaItOqp3JwtKGc5g,9092
|
|
36
36
|
qubx/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
37
|
qubx/core/account.py,sha256=4_XskMLR9Uh-rpJBDYMrceYiGMvAZw56k1ve-unIW8w,19417
|
|
@@ -52,11 +52,11 @@ qubx/core/mixins/processing.py,sha256=dqehukrfqcLy5BeILKnkpHCvva4SbLKj1ZbQdnByu1
|
|
|
52
52
|
qubx/core/mixins/subscription.py,sha256=V_g9wCPQ8S5SHkU-qOZ84cV5nReAUrV7DoSNAGG0LPY,10372
|
|
53
53
|
qubx/core/mixins/trading.py,sha256=idfRPaqrvkfMxzu9mXr9i_xfqLee-ZAOrERxkxv6Ruo,7256
|
|
54
54
|
qubx/core/mixins/universe.py,sha256=L3s2Jw46_J1iDh4622Gk_LvCjol4W7mflBwEHrLfZEw,9899
|
|
55
|
-
qubx/core/series.cpython-312-x86_64-linux-gnu.so,sha256=
|
|
55
|
+
qubx/core/series.cpython-312-x86_64-linux-gnu.so,sha256=FnN1en4og23NDYguU3uOYcYa-kt6m6-kH3UrVXCniLE,978280
|
|
56
56
|
qubx/core/series.pxd,sha256=jBdMwgO8J4Zrue0e_xQ5RlqTXqihpzQNu6V3ckZvvpY,3978
|
|
57
57
|
qubx/core/series.pyi,sha256=RaHm_oHHiWiNUMJqVfx5FXAXniGLsHxUFOUpacn7GC0,4604
|
|
58
58
|
qubx/core/series.pyx,sha256=7cM3zZThW59waHiYcZmMxvYj-HYD7Ej_l7nKA4emPjE,46477
|
|
59
|
-
qubx/core/utils.cpython-312-x86_64-linux-gnu.so,sha256=
|
|
59
|
+
qubx/core/utils.cpython-312-x86_64-linux-gnu.so,sha256=btF3eoTRmCq9jLbwBm7ZvM4U-7W0pGUo7DXxQop3ZZs,86568
|
|
60
60
|
qubx/core/utils.pyi,sha256=a-wS13V2p_dM1CnGq40JVulmiAhixTwVwt0ah5By0Hc,348
|
|
61
61
|
qubx/core/utils.pyx,sha256=k5QHfEFvqhqWfCob89ANiJDKNG8gGbOh-O4CVoneZ8M,1696
|
|
62
62
|
qubx/data/__init__.py,sha256=ELZykvpPGWc5rX7QoNyNQwMLgdKMG8MACOByA4pM5hA,549
|
|
@@ -117,7 +117,7 @@ qubx/restorers/signal.py,sha256=DBLqA7vDhoMTAzUC4N9UerrO0GbjeHdTeMoCz7U7iI8,6621
|
|
|
117
117
|
qubx/restorers/state.py,sha256=duXyEHQhS1zdNdo3VKscMhieZ5sYNlfE4S_pPXQ1Tuw,4109
|
|
118
118
|
qubx/restorers/utils.py,sha256=We2gfqwQKWziUYhuUnjb-xo-5tSlbuHWpPQn0CEMTn0,1155
|
|
119
119
|
qubx/ta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
120
|
-
qubx/ta/indicators.cpython-312-x86_64-linux-gnu.so,sha256=
|
|
120
|
+
qubx/ta/indicators.cpython-312-x86_64-linux-gnu.so,sha256=lmn5jOH43-uSKHjA3wwcQP6-WHZYAzPsx3Yeo5xoOxg,654440
|
|
121
121
|
qubx/ta/indicators.pxd,sha256=Goo0_N0Xnju8XGo3Xs-3pyg2qr_0Nh5C-_26DK8U_IE,4224
|
|
122
122
|
qubx/ta/indicators.pyi,sha256=19W0uERft49In5bf9jkJHkzJYEyE9gzudN7_DJ5Vdv8,1963
|
|
123
123
|
qubx/ta/indicators.pyx,sha256=Xgpew46ZxSXsdfSEWYn3A0Q35MLsopB9n7iyCsXTufs,25969
|
|
@@ -151,11 +151,11 @@ qubx/utils/runner/_jupyter_runner.pyt,sha256=41dLQeI2EL4wJjBDht2qKbgISgS5DtmJ6Xt
|
|
|
151
151
|
qubx/utils/runner/accounts.py,sha256=mpiv6oxr5z97zWt7STYyARMhWQIpc_XFKungb_pX38U,3270
|
|
152
152
|
qubx/utils/runner/configs.py,sha256=4lonQgksh4wDygsN67lIidVRIUksskWuhL25A2IZwho,3694
|
|
153
153
|
qubx/utils/runner/factory.py,sha256=vQ2dBTbrQE9YH__-TvuFzGF-E1li-vt_qQum9GHa11g,11666
|
|
154
|
-
qubx/utils/runner/runner.py,sha256=
|
|
154
|
+
qubx/utils/runner/runner.py,sha256=DWc85M5thSQsuiV9FQiowJ3VF9DbwPiG9RE5Lc-7XEk,29314
|
|
155
155
|
qubx/utils/time.py,sha256=J0ZFGjzFL5T6GA8RPAel8hKG0sg2LZXeQ5YfDCfcMHA,10055
|
|
156
156
|
qubx/utils/version.py,sha256=e52fIHyxzCiIuH7svCF6pkHuDlqL64rklqz-2XjWons,5309
|
|
157
|
-
qubx-0.6.
|
|
158
|
-
qubx-0.6.
|
|
159
|
-
qubx-0.6.
|
|
160
|
-
qubx-0.6.
|
|
161
|
-
qubx-0.6.
|
|
157
|
+
qubx-0.6.35.dist-info/LICENSE,sha256=qwMHOSJ2TD0nx6VUJvFhu1ynJdBfNozRMt6tnSul-Ts,35140
|
|
158
|
+
qubx-0.6.35.dist-info/METADATA,sha256=vhl17QmSnb0raya3HhxLpxOPNDOi1YTXdQdvlpmxGH8,4492
|
|
159
|
+
qubx-0.6.35.dist-info/WHEEL,sha256=XjdW4AGUgFDhpG9b3b2KPhtR_JLZvHyfemLgJJwcqOI,110
|
|
160
|
+
qubx-0.6.35.dist-info/entry_points.txt,sha256=VqilDTe8mVuV9SbR-yVlZJBTjbkHIL2JBgXfQw076HY,47
|
|
161
|
+
qubx-0.6.35.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|