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 +135 -2
- {onesecondtrader-0.17.0.dist-info → onesecondtrader-0.19.0.dist-info}/METADATA +1 -1
- onesecondtrader-0.19.0.dist-info/RECORD +7 -0
- onesecondtrader-0.17.0.dist-info/RECORD +0 -7
- {onesecondtrader-0.17.0.dist-info → onesecondtrader-0.19.0.dist-info}/WHEEL +0 -0
- {onesecondtrader-0.17.0.dist-info → onesecondtrader-0.19.0.dist-info}/licenses/LICENSE +0 -0
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
|
|
89
|
+
class MarketEvent(BaseEvent):
|
|
40
90
|
pass
|
|
41
91
|
|
|
42
92
|
@dataclasses.dataclass(kw_only=True, frozen=True)
|
|
43
|
-
class IncomingBar(
|
|
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.
|
|
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,,
|
|
File without changes
|
|
File without changes
|