onesecondtrader 0.17.0__py3-none-any.whl → 0.19.0__py3-none-any.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.
onesecondtrader/core.py CHANGED
@@ -8,6 +8,7 @@ import enum
8
8
  import pandas as pd
9
9
  import queue
10
10
  import threading
11
+ import uuid
11
12
 
12
13
  from collections import defaultdict
13
14
 
@@ -23,24 +24,73 @@ class Models:
23
24
  OHLCV_1H = 34
24
25
  OHLCV_1D = 35
25
26
 
27
+ class OrderSide(enum.Enum):
28
+ BUY = enum.auto()
29
+ SELL = enum.auto()
30
+
31
+ class OrderType(enum.Enum):
32
+ MARKET = enum.auto()
33
+ LIMIT = enum.auto()
34
+ STOP = enum.auto()
35
+ STOP_LIMIT = enum.auto()
36
+
37
+ class OrderRejectionReason(enum.Enum):
38
+ INSUFFICIENT_FUNDS = enum.auto()
39
+ MARKET_CLOSED = enum.auto()
40
+ UNKNOWN = enum.auto()
41
+
42
+ class CancelRejectionReason(enum.Enum):
43
+ ORDER_ALREADY_FILLED = enum.auto()
44
+ ORDER_ALREADY_CANCELLED = enum.auto()
45
+ ORDER_PENDING_EXECUTION = enum.auto()
46
+ MARKET_CLOSED = enum.auto()
47
+ UNKNOWN = enum.auto()
48
+
49
+ class ModifyRejectionReason(enum.Enum):
50
+ ORDER_ALREADY_FILLED = enum.auto()
51
+ ORDER_ALREADY_CANCELLED = enum.auto()
52
+ ORDER_PENDING_EXECUTION = enum.auto()
53
+ ORDER_NOT_FOUND = enum.auto()
54
+ INVALID_PRICE = enum.auto()
55
+ INVALID_QUANTITY = enum.auto()
56
+ MARKET_CLOSED = enum.auto()
57
+ UNKNOWN = enum.auto()
58
+
59
+ class TimeInForce(enum.Enum):
60
+ GTC = enum.auto()
61
+ DAY = enum.auto()
62
+ IOC = enum.auto()
63
+ FOK = enum.auto()
64
+
26
65
 
27
66
  class Events:
28
67
  """
29
68
  Namespace for all events.
30
69
  """
31
70
 
71
+ # BASE EVENT
32
72
  @dataclasses.dataclass(kw_only=True, frozen=True)
33
73
  class BaseEvent:
34
74
  ts_event: pd.Timestamp = dataclasses.field(
35
75
  default_factory=lambda: pd.Timestamp.now(tz="UTC")
36
76
  )
37
77
 
78
+ # SYSTEM EVENTS
79
+ @dataclasses.dataclass(kw_only=True, frozen=True)
80
+ class SystemEvent(BaseEvent):
81
+ pass
82
+
83
+ @dataclasses.dataclass(kw_only=True, frozen=True)
84
+ class SystemShutdown(SystemEvent):
85
+ pass
86
+
87
+ # MARKET EVENTS
38
88
  @dataclasses.dataclass(kw_only=True, frozen=True)
39
- class SystemShutdown(BaseEvent):
89
+ class MarketEvent(BaseEvent):
40
90
  pass
41
91
 
42
92
  @dataclasses.dataclass(kw_only=True, frozen=True)
43
- class IncomingBar(BaseEvent):
93
+ class IncomingBar(MarketEvent):
44
94
  ts_event: pd.Timestamp
45
95
  symbol: str
46
96
  record_type: Models.RecordType
@@ -50,6 +100,83 @@ class Events:
50
100
  close: float
51
101
  volume: int | None = None
52
102
 
103
+ # BROKER REQUESTS EVENTS
104
+ @dataclasses.dataclass(kw_only=True, frozen=True)
105
+ class BrokerRequestEvent(BaseEvent):
106
+ pass
107
+
108
+ @dataclasses.dataclass(kw_only=True, frozen=True)
109
+ class SubmitOrder(BrokerRequestEvent):
110
+ order_id: uuid.UUID = dataclasses.field(default_factory=uuid.uuid4)
111
+ symbol: str
112
+ order_type: Models.OrderType
113
+ side: Models.OrderSide
114
+ quantity: float
115
+ limit_price: float | None = None
116
+ stop_price: float | None = None
117
+ time_in_force: Models.TimeInForce = Models.TimeInForce.GTC
118
+
119
+ @dataclasses.dataclass(kw_only=True, frozen=True)
120
+ class ModifyOrder(BrokerRequestEvent):
121
+ order_id: uuid.UUID
122
+ quantity: float | None = None
123
+ limit_price: float | None = None
124
+ stop_price: float | None = None
125
+
126
+ @dataclasses.dataclass(kw_only=True, frozen=True)
127
+ class CancelOrder(BrokerRequestEvent):
128
+ order_id: uuid.UUID
129
+
130
+ # BROKER RESPONSE EVENTS
131
+ @dataclasses.dataclass(kw_only=True, frozen=True)
132
+ class BrokerResponseEvent(BaseEvent):
133
+ ts_broker: pd.Timestamp
134
+
135
+ @dataclasses.dataclass(kw_only=True, frozen=True)
136
+ class OrderSubmitted(BrokerResponseEvent):
137
+ order_id: uuid.UUID
138
+ broker_order_id: str | None = None
139
+
140
+ @dataclasses.dataclass(kw_only=True, frozen=True)
141
+ class OrderModified(BrokerResponseEvent):
142
+ order_id: uuid.UUID
143
+ broker_order_id: str | None = None
144
+
145
+ @dataclasses.dataclass(kw_only=True, frozen=True)
146
+ class Fill(BrokerResponseEvent):
147
+ fill_id: uuid.UUID = dataclasses.field(default_factory=uuid.uuid4)
148
+ broker_fill_id: str | None = None
149
+ associated_order_id: uuid.UUID
150
+ symbol: str
151
+ side: Models.OrderSide
152
+ quantity_filled: float
153
+ fill_price: float
154
+ commission: float
155
+ exchange: str = "SIMULATED"
156
+
157
+ @dataclasses.dataclass(kw_only=True, frozen=True)
158
+ class OrderRejected(BrokerResponseEvent):
159
+ order_id: uuid.UUID
160
+ reason: Models.OrderRejectionReason
161
+
162
+ @dataclasses.dataclass(kw_only=True, frozen=True)
163
+ class OrderCancelled(BrokerResponseEvent):
164
+ order_id: uuid.UUID
165
+
166
+ @dataclasses.dataclass(kw_only=True, frozen=True)
167
+ class OrderExpired(BrokerResponseEvent):
168
+ order_id: uuid.UUID
169
+
170
+ @dataclasses.dataclass(kw_only=True, frozen=True)
171
+ class CancelRejected(BrokerResponseEvent):
172
+ order_id: uuid.UUID
173
+ reason: Models.CancelRejectionReason
174
+
175
+ @dataclasses.dataclass(kw_only=True, frozen=True)
176
+ class ModifyRejected(BrokerResponseEvent):
177
+ order_id: uuid.UUID
178
+ reason: Models.ModifyRejectionReason
179
+
53
180
 
54
181
  class BaseConsumer(abc.ABC):
55
182
  """
@@ -103,3 +230,9 @@ class EventBus:
103
230
  consumers = list(self._subscriptions[type(event)])
104
231
  for consumer in consumers:
105
232
  consumer.receive(event)
233
+
234
+
235
+ event_bus = EventBus()
236
+ """
237
+ Global event bus instance.
238
+ """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onesecondtrader
3
- Version: 0.17.0
3
+ Version: 0.19.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
@@ -0,0 +1,7 @@
1
+ onesecondtrader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ onesecondtrader/core.py,sha256=b2vAoMPY8FzKJ3I23CZjualg7FSaQztKb5XIVFsR7sE,6879
3
+ onesecondtrader/indicators.py,sha256=wGn-5v8L1gepMP45KcVrEo-f2ReOCD3r8lva9aEIUnY,3199
4
+ onesecondtrader-0.19.0.dist-info/METADATA,sha256=gbvGvRtyUUMZPg9WmxbiV4_1BCia3G3oAOp8SP5Bv60,9682
5
+ onesecondtrader-0.19.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
6
+ onesecondtrader-0.19.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
7
+ onesecondtrader-0.19.0.dist-info/RECORD,,
@@ -1,7 +0,0 @@
1
- onesecondtrader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- onesecondtrader/core.py,sha256=_ww01j3PQ0bCRkkTDxDD-cNtD4dkeaIFKwBn2ro0Y5M,2766
3
- onesecondtrader/indicators.py,sha256=wGn-5v8L1gepMP45KcVrEo-f2ReOCD3r8lva9aEIUnY,3199
4
- onesecondtrader-0.17.0.dist-info/METADATA,sha256=Y-rLsvsHp0Vo-6lG0FqXE0Abm6YxaduSWkNb5D0Zv7g,9682
5
- onesecondtrader-0.17.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
6
- onesecondtrader-0.17.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
7
- onesecondtrader-0.17.0.dist-info/RECORD,,