onesecondtrader 0.30.0__tar.gz → 0.31.0__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.
Files changed (24) hide show
  1. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/PKG-INFO +1 -1
  2. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/pyproject.toml +1 -1
  3. onesecondtrader-0.31.0/src/onesecondtrader/__init__.py +5 -0
  4. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/indicators/__init__.py +2 -0
  5. onesecondtrader-0.31.0/src/onesecondtrader/indicators/averages.py +56 -0
  6. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/models/__init__.py +2 -1
  7. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/models/data.py +8 -0
  8. onesecondtrader-0.30.0/src/onesecondtrader/__init__.py +0 -0
  9. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/LICENSE +0 -0
  10. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/README.md +0 -0
  11. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/brokers/__init__.py +0 -0
  12. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/brokers/base.py +0 -0
  13. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/brokers/simulated.py +0 -0
  14. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/events/__init__.py +0 -0
  15. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/events/bases.py +0 -0
  16. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/events/market.py +0 -0
  17. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/events/requests.py +0 -0
  18. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/events/responses.py +0 -0
  19. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/indicators/bar.py +0 -0
  20. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/indicators/base.py +0 -0
  21. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/messaging/__init__.py +0 -0
  22. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/messaging/eventbus.py +0 -0
  23. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/messaging/subscriber.py +0 -0
  24. {onesecondtrader-0.30.0 → onesecondtrader-0.31.0}/src/onesecondtrader/models/orders.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onesecondtrader
3
- Version: 0.30.0
3
+ Version: 0.31.0
4
4
  Summary: The Trading Infrastructure Toolkit for Python. Research, simulate, and deploy algorithmic trading strategies — all in one place.
5
5
  License-File: LICENSE
6
6
  Author: Nils P. Kujath
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "onesecondtrader"
3
- version = "0.30.0"
3
+ version = "0.31.0"
4
4
  description = "The Trading Infrastructure Toolkit for Python. Research, simulate, and deploy algorithmic trading strategies — all in one place."
5
5
  authors = [
6
6
  {name = "Nils P. Kujath",email = "63961429+NilsKujath@users.noreply.github.com"}
@@ -0,0 +1,5 @@
1
+ from onesecondtrader import brokers as brokers
2
+ from onesecondtrader import events as events
3
+ from onesecondtrader import indicators as indicators
4
+ from onesecondtrader import messaging as messaging
5
+ from onesecondtrader import models as models
@@ -5,7 +5,9 @@ __all__ = [
5
5
  "Low",
6
6
  "Close",
7
7
  "Volume",
8
+ "SimpleMovingAverage",
8
9
  ]
9
10
 
10
11
  from .base import Indicator
11
12
  from .bar import Open, High, Low, Close, Volume
13
+ from .averages import SimpleMovingAverage
@@ -0,0 +1,56 @@
1
+ from __future__ import annotations
2
+
3
+ import collections
4
+
5
+ import numpy as np
6
+
7
+ from onesecondtrader import events, models
8
+ from .base import Indicator
9
+
10
+
11
+ class SimpleMovingAverage(Indicator):
12
+ def __init__(
13
+ self,
14
+ period: int = 200,
15
+ max_history: int = 100,
16
+ input_source: models.InputSource = models.InputSource.CLOSE,
17
+ plot_at: int = 0,
18
+ ) -> None:
19
+ super().__init__(max_history=max_history, plot_at=plot_at)
20
+ self.period: int = max(1, int(period))
21
+ self.input_source: models.InputSource = input_source
22
+ self._window: dict[str, collections.deque[float]] = {}
23
+
24
+ @property
25
+ def name(self) -> str:
26
+ return f"SMA_{self.period}_{self.input_source.name}"
27
+
28
+ def _compute_indicator(self, incoming_bar: events.BarReceived) -> float:
29
+ symbol = incoming_bar.symbol
30
+ if symbol not in self._window:
31
+ self._window[symbol] = collections.deque(maxlen=self.period)
32
+ window = self._window[symbol]
33
+ value = self._extract_input(incoming_bar)
34
+ window.append(value)
35
+ if len(window) < self.period:
36
+ return np.nan
37
+ return sum(window) / self.period
38
+
39
+ def _extract_input(self, incoming_bar: events.BarReceived) -> float:
40
+ match self.input_source:
41
+ case models.InputSource.OPEN:
42
+ return incoming_bar.open
43
+ case models.InputSource.HIGH:
44
+ return incoming_bar.high
45
+ case models.InputSource.LOW:
46
+ return incoming_bar.low
47
+ case models.InputSource.CLOSE:
48
+ return incoming_bar.close
49
+ case models.InputSource.VOLUME:
50
+ return (
51
+ float(incoming_bar.volume)
52
+ if incoming_bar.volume is not None
53
+ else np.nan
54
+ )
55
+ case _:
56
+ return incoming_bar.close
@@ -1,8 +1,9 @@
1
1
  __all__ = [
2
2
  "BarPeriod",
3
+ "InputSource",
3
4
  "OrderSide",
4
5
  "OrderType",
5
6
  ]
6
7
 
7
- from .data import BarPeriod
8
+ from .data import BarPeriod, InputSource
8
9
  from .orders import OrderSide, OrderType
@@ -8,3 +8,11 @@ class BarPeriod(enum.Enum):
8
8
  MINUTE = enum.auto()
9
9
  HOUR = enum.auto()
10
10
  DAY = enum.auto()
11
+
12
+
13
+ class InputSource(enum.Enum):
14
+ OPEN = enum.auto()
15
+ HIGH = enum.auto()
16
+ LOW = enum.auto()
17
+ CLOSE = enum.auto()
18
+ VOLUME = enum.auto()
File without changes