Qubx 0.2.5__cp311-cp311-manylinux_2_35_x86_64.whl → 0.2.61__cp311-cp311-manylinux_2_35_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.

@@ -871,6 +871,9 @@ def _run_setup(
871
871
  _trigger = "bar: 0s"
872
872
  _stop = setup.generator.index[-1] # type: ignore
873
873
 
874
+ # - no historical data for generated signals, so disable it
875
+ enable_event_batching = False
876
+
874
877
  case _Types.SIGNAL_AND_TRACKER:
875
878
  strat = _GeneratedSignalsStrategy()
876
879
  strat.tracker = lambda ctx: setup.tracker
@@ -879,6 +882,9 @@ def _run_setup(
879
882
  _trigger = "bar: 0s"
880
883
  _stop = setup.generator.index[-1] # type: ignore
881
884
 
885
+ # - no historical data for generated signals, so disable it
886
+ enable_event_batching = False
887
+
882
888
  case _:
883
889
  raise ValueError(f"Unsupported setup type: {setup.setup_type} !")
884
890
 
qubx/core/basics.py CHANGED
@@ -146,7 +146,8 @@ class Instrument:
146
146
  take: float | None = None,
147
147
  group: str = "",
148
148
  comment: str = "",
149
- options: dict[str, Any] = None,
149
+ options: dict[str, Any] | None = None, # - probably we need to remove it ?
150
+ **kwargs,
150
151
  ) -> Signal:
151
152
  return Signal(
152
153
  self,
@@ -156,7 +157,7 @@ class Instrument:
156
157
  take=take,
157
158
  group=group,
158
159
  comment=comment,
159
- options=options or {},
160
+ options=(options or {}) | kwargs,
160
161
  )
161
162
 
162
163
  def __hash__(self) -> int:
qubx/core/metrics.py CHANGED
@@ -794,9 +794,11 @@ def get_equity(
794
794
  return _get_single_equity(sessions)
795
795
 
796
796
 
797
- def _estimate_timeframe(session: TradingSessionResult | list[TradingSessionResult]) -> str:
797
+ def _estimate_timeframe(
798
+ session: TradingSessionResult | list[TradingSessionResult], start: str | None = None, stop: str | None = None
799
+ ) -> str:
798
800
  session = session[0] if isinstance(session, list) else session
799
- start, end = pd.Timestamp(session.start), pd.Timestamp(session.stop)
801
+ start, end = pd.Timestamp(start or session.start), pd.Timestamp(stop or session.stop)
800
802
  diff = end - start
801
803
  if diff > pd.Timedelta("360d"):
802
804
  return "1d"
@@ -889,6 +891,7 @@ def chart_signals(
889
891
  indicators={},
890
892
  overlay=[],
891
893
  info=True,
894
+ show_trades: bool = True,
892
895
  show_quantity: bool = False,
893
896
  show_value: bool = False,
894
897
  show_leverage: bool = True,
@@ -899,6 +902,8 @@ def chart_signals(
899
902
  Show trading signals on chart
900
903
  """
901
904
  indicators = indicators | {}
905
+ if timeframe is None:
906
+ timeframe = _estimate_timeframe(result, start, end)
902
907
 
903
908
  executions = result.executions_log.rename(
904
909
  columns={"instrument_id": "instrument", "filled_qty": "quantity", "price": "exec_price"}
@@ -954,13 +959,13 @@ def chart_signals(
954
959
 
955
960
  indicators = {k: __resample(v) for k, v in indicators.items()}
956
961
 
957
- excs = executions[executions["instrument"] == symbol][
958
- ["quantity", "exec_price", "commissions", "commissions_quoted"]
959
- ]
962
+ if show_trades:
963
+ excs = executions[executions["instrument"] == symbol][
964
+ ["quantity", "exec_price", "commissions", "commissions_quoted"]
965
+ ]
966
+ overlay = list(overlay) + [excs]
960
967
 
961
- chart = (
962
- LookingGlass([bars, excs, *overlay], indicators).look(start, end, title=symbol).hover(show_info=info, h=height)
963
- )
968
+ chart = LookingGlass([bars, *overlay], indicators).look(start, end, title=symbol).hover(show_info=info, h=height)
964
969
  if not show_table:
965
970
  return chart.show()
966
971
 
qubx/core/series.pyi CHANGED
@@ -37,8 +37,9 @@ class Indexed:
37
37
  def __getitem__(self, idx): ...
38
38
 
39
39
  class TimeSeries:
40
+ name: str
40
41
  loc: Locator
41
- timeframe: str
42
+ timeframe: int
42
43
  max_series_length: int
43
44
  times: Indexed
44
45
  values: Indexed
@@ -77,6 +78,9 @@ class OHLCV(TimeSeries):
77
78
  def pd(self) -> pd.DataFrame: ...
78
79
 
79
80
  class Indicator(TimeSeries):
81
+ name: str
82
+ series: TimeSeries
83
+
80
84
  def update(self, time: int, value, new_item_started: bool) -> object: ...
81
85
 
82
86
  class IndicatorOHLC(Indicator): ...
qubx/ta/indicators.pyx CHANGED
@@ -144,7 +144,7 @@ cdef class Kama(Indicator):
144
144
  self._x_past[-1] = value
145
145
 
146
146
  cdef double rs = self.summator.update(abs(value - self._x_past[-2]), new_item_started)
147
- cdef double er = abs(value - self._x_past[0]) / rs
147
+ cdef double er = (abs(value - self._x_past[0]) / rs) if rs != 0.0 else 1.0
148
148
  cdef double sc = (er * self._K1 + self._S1) ** 2
149
149
 
150
150
  if self.summator.is_init_stage:
qubx/trackers/sizers.py CHANGED
@@ -98,7 +98,7 @@ class FixedRiskSizer(IPositionSizer):
98
98
  target_position_size = (
99
99
  _direction
100
100
  *min((_cap * self.max_cap_in_risk) / abs(signal.stop / _entry - 1), self.max_allowed_position_quoted) / _entry
101
- / len(ctx.instruments) if self.divide_by_symbols else 1
101
+ / (len(ctx.instruments) if self.divide_by_symbols else 1)
102
102
  )
103
103
  # fmt: on
104
104
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: Qubx
3
- Version: 0.2.5
3
+ Version: 0.2.61
4
4
  Summary: Qubx - quantitative trading framework
5
5
  Home-page: https://github.com/dmarienko/Qubx
6
6
  Author: Dmitry Marienko
@@ -4,22 +4,22 @@ qubx/backtester/__init__.py,sha256=g9K4pp4ieY4rRKE0eA_02LMo-c4vnk-QqtVn_ff9F5U,6
4
4
  qubx/backtester/ome.py,sha256=nbKuB4t67jcK7BBu7LpoQza-ulvgtUupzVFU6MaTCn4,8690
5
5
  qubx/backtester/optimization.py,sha256=wn48ppzziiNTG37tipY4HfRpqLKl2Y5iVCVO6NsCKRM,6588
6
6
  qubx/backtester/queue.py,sha256=ys9tHyrqx3NKbcoTAoOn0m0caIk5F0GpS2x7_sCikro,14997
7
- qubx/backtester/simulator.py,sha256=9-U7HKBoWFcaWLuxdwVSN1nUe-KSoryIyIbUYpcpgtI,33691
7
+ qubx/backtester/simulator.py,sha256=bppxwq_F5eS4_GjR8Xki1kS5AKWr7HPHPdYUXjsfASc,33921
8
8
  qubx/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  qubx/core/account.py,sha256=uIU-EUMuH5owWhHTmU1pZ0WrkQkiv9YiFqSZW9dFDK8,9066
10
- qubx/core/basics.py,sha256=7v2RL-IsHJ_ms33e0TCRmjqSvJZJSaup9-GeduBx4DU,19824
10
+ qubx/core/basics.py,sha256=iwJ5wi2ENbKFqPdJIQEcSgdB6HkskzY0P4b_cf8-Avk,19897
11
11
  qubx/core/context.py,sha256=I5bse6F4VVQbJb6jmkQsQEX_C2iht440pUK-BqOc1VU,37619
12
12
  qubx/core/exceptions.py,sha256=W1gG_0fE3o2EMGUfOeOl3vVJDp8Z1iHLv4iZ0ThNkTs,306
13
13
  qubx/core/helpers.py,sha256=JAB1kcKO8l--gxg9_W2BzWW1N4x72sicw1oBszKYcbo,12657
14
14
  qubx/core/loggers.py,sha256=6P3NwoyHe_pTW8Kdvmi8eHoCxHAWm7LEvwgmX-vZKR4,16530
15
15
  qubx/core/lookups.py,sha256=qGOSb2SIxmgVPGJFLJnPDI1P9hCzFMVipRDcVLUm8qk,14599
16
- qubx/core/metrics.py,sha256=tSw1XnasGSigJtaScK54Esh161dZDkihStxha03dmc4,36296
17
- qubx/core/series.cpython-311-x86_64-linux-gnu.so,sha256=0uAOzcq9Se4Myim_l9u0H-AIsFhnuOLkv0TaO7aRzC0,762408
16
+ qubx/core/metrics.py,sha256=lPxq3k1XFcSjlLafhDEluiqkA0ISoJlckxeJnrCm2mM,36537
17
+ qubx/core/series.cpython-311-x86_64-linux-gnu.so,sha256=4yXOmYXgQWwvHKVy_EFsJ9hcAPHYG-tZXnYEAvnHwIk,762408
18
18
  qubx/core/series.pxd,sha256=1KJGzun_R5GDDOynPbZER7Xg45a0JUM_S_lZ-9FFFJg,2994
19
- qubx/core/series.pyi,sha256=0CXPMUYoEy2M12ABW1dcBgJxOvVfLagjo4wBnJFQp2E,2202
19
+ qubx/core/series.pyi,sha256=ipca4P8LJGDvkhAAczLoZbgLvcJSm-5SFKlaQI9cn9E,2254
20
20
  qubx/core/series.pyx,sha256=7R0SQ3OKfxqdxlbBXAG1ld3WS-vrMT9us1Tvq21GLFY,31116
21
21
  qubx/core/strategy.py,sha256=RY2fdg7lvLquTxfUamewO51yaRVTElJLmariTB4e3CQ,10901
22
- qubx/core/utils.cpython-311-x86_64-linux-gnu.so,sha256=iQ9_WAKtK6MToi1Zg6oWfFjyQoHNlk2NQqwO3T6Gq10,74248
22
+ qubx/core/utils.cpython-311-x86_64-linux-gnu.so,sha256=sWcOu1gBDw_4IVr8RPV6kOdl9-AUZUGbrD2wUAI1-dA,74248
23
23
  qubx/core/utils.pyi,sha256=bT3NvsHwf0AszMh7OP8uC5StaAM1arArAE5Yd3BjLHI,167
24
24
  qubx/core/utils.pyx,sha256=csSIwI_lwvCd8CTbsp9Q0XiRCtGAHEuF62afHOJzCGQ,1382
25
25
  qubx/data/helpers.py,sha256=A0NGzhpXYWD92-GeB8TghwMnR0NW8bjcNJOCXybQw3g,782
@@ -35,15 +35,15 @@ qubx/pandaz/__init__.py,sha256=Iw5uzicYGSC3FEKZ-W1O5-7cXq_P0kH11-EcXV0zZhs,175
35
35
  qubx/pandaz/ta.py,sha256=NthiiueUoqWGRcjovcKKThcCcdImZn3JRdWDA2vL28k,85075
36
36
  qubx/pandaz/utils.py,sha256=XB28Zwv3cXWbKFXbcV5QGj_d6w-i8Yo4LYkX8aPuCHo,19613
37
37
  qubx/ta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- qubx/ta/indicators.cpython-311-x86_64-linux-gnu.so,sha256=hRzN4uncNaeCxbjjzgemM8NoYdECiUj3ta2NTRoYG-4,555560
38
+ qubx/ta/indicators.cpython-311-x86_64-linux-gnu.so,sha256=dSxdjDzPPs45ysGGOhAB7tluZDXqM0TrorLfXU2GOpY,555560
39
39
  qubx/ta/indicators.pxd,sha256=N1XyVos-5IsMF4A0_nmaSRlocHnui5bFJGwJCSTkwd4,3898
40
40
  qubx/ta/indicators.pyi,sha256=2OL0BIKNCPQfe61TEI_nu4qgFYSjGc9ERGDoQlojWo8,1334
41
- qubx/ta/indicators.pyx,sha256=c4owwmD9Hs4tvuozZsaDZ3PfKK9VRJZO2HeZGOK0-3c,22623
41
+ qubx/ta/indicators.pyx,sha256=HW0NZb7DTY6_6eSrkvOOp7hg2ZATM0L_GZwm4VnKRJo,22647
42
42
  qubx/trackers/__init__.py,sha256=-Hmlc8Mpdi_t6kyeW4ZtmYkHzrULaIb6gUsAkhUxA-4,169
43
43
  qubx/trackers/composite.py,sha256=rYQCaxu4IKLf5sS3DCyUUJaSUQwbCy6UMoVjsS-481A,6222
44
44
  qubx/trackers/rebalancers.py,sha256=dp-jemxczT8ndkjjzljsIgGnnA6lZQhsf5c4YdmHKCw,6048
45
45
  qubx/trackers/riskctrl.py,sha256=8P5iyaJ-PKhIX8GkGBpncQdxnefL1QWRWG-Jx1PFTuk,12595
46
- qubx/trackers/sizers.py,sha256=rOroN9e__C0oIQKaJ6CDlBrHFSlcZYBve7dgFQPi1vs,6111
46
+ qubx/trackers/sizers.py,sha256=3p1YG5Aqb9QBubuz8iUgVujiMod4GcgBBQKA4oT3e5M,6113
47
47
  qubx/utils/__init__.py,sha256=AL2YibJ3tqBKsZZLUjM9N2J5yy-Kq__k_44oTODQ5sM,321
48
48
  qubx/utils/_pyxreloader.py,sha256=FyqGzfSpZGYziB8JYS5AP3cLRAvJSIPAKgwQn0E4YQ0,12017
49
49
  qubx/utils/charting/lookinglass.py,sha256=1RxWf6c3rx0RxxeNPcFVtCtlwvh-Fxicc5fpF4aIIzo,38501
@@ -53,6 +53,6 @@ qubx/utils/misc.py,sha256=PaWH-nsZeULM0vFvnq_xeypC3vrIb6xWNRExaz1WS9w,10557
53
53
  qubx/utils/ntp.py,sha256=LZo4FPVY3rqLUV9VWkLcZaPOpUDFC8Qleynmfggg9No,1758
54
54
  qubx/utils/runner.py,sha256=Czo01KUCc9Oj9TIcs03d6Qh7fOpQV5w8oH6UDZ6Yqn0,9539
55
55
  qubx/utils/time.py,sha256=ioIos3VLA-iYI8LiQIn2m-t0Y37CEQAHFw_-C9Uwo0o,5188
56
- qubx-0.2.5.dist-info/METADATA,sha256=yulwYbdNGjayXmdg0pfMvu8wUkYV2yl9fDvc4D9Kd_I,2572
57
- qubx-0.2.5.dist-info/WHEEL,sha256=MLOa6LysROdjgj4FVxsHitAnIh8Be2D_c9ZSBHKrz2M,110
58
- qubx-0.2.5.dist-info/RECORD,,
56
+ qubx-0.2.61.dist-info/METADATA,sha256=OK_Rqo7H4tMlwRJ_GtJ1zxwLzGzkr6c_OgsWTunQYSY,2573
57
+ qubx-0.2.61.dist-info/WHEEL,sha256=MLOa6LysROdjgj4FVxsHitAnIh8Be2D_c9ZSBHKrz2M,110
58
+ qubx-0.2.61.dist-info/RECORD,,
File without changes