onesecondtrader 0.35.0__py3-none-any.whl → 0.37.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.
Files changed (41) hide show
  1. onesecondtrader/__init__.py +7 -6
  2. onesecondtrader/connectors/__init__.py +2 -0
  3. onesecondtrader/connectors/brokers/__init__.py +3 -0
  4. onesecondtrader/{brokers → connectors/brokers}/simulated.py +2 -2
  5. onesecondtrader/{datafeeds → connectors/datafeeds}/__init__.py +1 -4
  6. onesecondtrader/{datafeeds → connectors/datafeeds}/base.py +1 -1
  7. onesecondtrader/{datafeeds → connectors/datafeeds}/simulated.py +1 -1
  8. onesecondtrader/core/__init__.py +6 -0
  9. onesecondtrader/core/brokers/__init__.py +3 -0
  10. onesecondtrader/{brokers → core/brokers}/base.py +1 -1
  11. onesecondtrader/{events → core/events}/market.py +1 -1
  12. onesecondtrader/{events → core/events}/requests.py +1 -1
  13. onesecondtrader/{events → core/events}/responses.py +1 -1
  14. onesecondtrader/{indicators → core/indicators}/averages.py +1 -1
  15. onesecondtrader/{indicators → core/indicators}/bar.py +1 -1
  16. onesecondtrader/{indicators → core/indicators}/base.py +1 -1
  17. onesecondtrader/{messaging → core/messaging}/eventbus.py +1 -1
  18. onesecondtrader/{messaging → core/messaging}/subscriber.py +1 -1
  19. onesecondtrader/{strategies → core/strategies}/__init__.py +1 -1
  20. onesecondtrader/{strategies → core/strategies}/base.py +1 -1
  21. onesecondtrader/{strategies/sma_crossover.py → core/strategies/examples.py} +1 -1
  22. onesecondtrader/dashboard/__init__.py +0 -0
  23. onesecondtrader/secmaster/__init__.py +5 -0
  24. onesecondtrader/secmaster/schema.sql +46 -0
  25. onesecondtrader/secmaster/utils.py +26 -0
  26. {onesecondtrader-0.35.0.dist-info → onesecondtrader-0.37.0.dist-info}/METADATA +1 -1
  27. onesecondtrader-0.37.0.dist-info/RECORD +37 -0
  28. onesecondtrader/brokers/__init__.py +0 -7
  29. onesecondtrader/observers/__init__.py +0 -5
  30. onesecondtrader/observers/csvbookkeeper.py +0 -180
  31. onesecondtrader-0.35.0.dist-info/RECORD +0 -32
  32. /onesecondtrader/{events → core/events}/__init__.py +0 -0
  33. /onesecondtrader/{events → core/events}/bases.py +0 -0
  34. /onesecondtrader/{indicators → core/indicators}/__init__.py +0 -0
  35. /onesecondtrader/{messaging → core/messaging}/__init__.py +0 -0
  36. /onesecondtrader/{models → core/models}/__init__.py +0 -0
  37. /onesecondtrader/{models → core/models}/data.py +0 -0
  38. /onesecondtrader/{models → core/models}/orders.py +0 -0
  39. /onesecondtrader/{models → core/models}/records.py +0 -0
  40. {onesecondtrader-0.35.0.dist-info → onesecondtrader-0.37.0.dist-info}/WHEEL +0 -0
  41. {onesecondtrader-0.35.0.dist-info → onesecondtrader-0.37.0.dist-info}/licenses/LICENSE +0 -0
@@ -24,15 +24,16 @@ __all__ = [
24
24
  "Volume",
25
25
  ]
26
26
 
27
- from onesecondtrader.brokers import BrokerBase, SimulatedBroker
28
- from onesecondtrader.datafeeds import Datafeed, SimulatedDatafeed
29
- from onesecondtrader.events import (
27
+ from onesecondtrader.core.brokers import BrokerBase
28
+ from onesecondtrader.connectors.brokers import SimulatedBroker
29
+ from onesecondtrader.connectors.datafeeds import Datafeed, SimulatedDatafeed
30
+ from onesecondtrader.core.events import (
30
31
  BarProcessed,
31
32
  BarReceived,
32
33
  OrderFilled,
33
34
  OrderSubmission,
34
35
  )
35
- from onesecondtrader.indicators import (
36
+ from onesecondtrader.core.indicators import (
36
37
  Close,
37
38
  High,
38
39
  Indicator,
@@ -41,7 +42,7 @@ from onesecondtrader.indicators import (
41
42
  SimpleMovingAverage,
42
43
  Volume,
43
44
  )
44
- from onesecondtrader.models import (
45
+ from onesecondtrader.core.models import (
45
46
  BarPeriod,
46
47
  FillRecord,
47
48
  InputSource,
@@ -49,4 +50,4 @@ from onesecondtrader.models import (
49
50
  OrderSide,
50
51
  OrderType,
51
52
  )
52
- from onesecondtrader.strategies import SMACrossover, StrategyBase
53
+ from onesecondtrader.core.strategies import SMACrossover, StrategyBase
@@ -0,0 +1,2 @@
1
+ from onesecondtrader.connectors import brokers as brokers
2
+ from onesecondtrader.connectors import datafeeds as datafeeds
@@ -0,0 +1,3 @@
1
+ __all__ = ["SimulatedBroker"]
2
+
3
+ from .simulated import SimulatedBroker
@@ -3,8 +3,8 @@ from __future__ import annotations
3
3
  import dataclasses
4
4
  import uuid
5
5
 
6
- from onesecondtrader import events, messaging, models
7
- from .base import BrokerBase
6
+ from onesecondtrader.core import events, messaging, models
7
+ from onesecondtrader.core.brokers import BrokerBase
8
8
 
9
9
 
10
10
  @dataclasses.dataclass
@@ -1,7 +1,4 @@
1
- __all__ = [
2
- "Datafeed",
3
- "SimulatedDatafeed",
4
- ]
1
+ __all__ = ["Datafeed", "SimulatedDatafeed"]
5
2
 
6
3
  from .base import Datafeed
7
4
  from .simulated import SimulatedDatafeed
@@ -1,6 +1,6 @@
1
1
  import abc
2
2
 
3
- from onesecondtrader import events, messaging, models
3
+ from onesecondtrader.core import events, messaging, models
4
4
 
5
5
 
6
6
  class Datafeed(abc.ABC):
@@ -3,7 +3,7 @@ import threading
3
3
 
4
4
  import pandas as pd
5
5
 
6
- from onesecondtrader import events, messaging, models
6
+ from onesecondtrader.core import events, messaging, models
7
7
  from .base import Datafeed
8
8
 
9
9
  _RTYPE_MAP = {
@@ -0,0 +1,6 @@
1
+ from onesecondtrader.core import brokers as brokers
2
+ from onesecondtrader.core import events as events
3
+ from onesecondtrader.core import indicators as indicators
4
+ from onesecondtrader.core import messaging as messaging
5
+ from onesecondtrader.core import models as models
6
+ from onesecondtrader.core import strategies as strategies
@@ -0,0 +1,3 @@
1
+ __all__ = ["BrokerBase"]
2
+
3
+ from .base import BrokerBase
@@ -1,6 +1,6 @@
1
1
  import abc
2
2
 
3
- from onesecondtrader import events, messaging
3
+ from onesecondtrader.core import events, messaging
4
4
 
5
5
 
6
6
  class BrokerBase(messaging.Subscriber):
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
4
 
5
- from onesecondtrader import models
5
+ from onesecondtrader.core import models
6
6
  from . import bases
7
7
 
8
8
 
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import dataclasses
4
4
  import uuid
5
5
 
6
- from onesecondtrader import models
6
+ from onesecondtrader.core import models
7
7
  from . import bases
8
8
 
9
9
 
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import dataclasses
4
4
  import uuid
5
5
 
6
- from onesecondtrader import models
6
+ from onesecondtrader.core import models
7
7
  from . import bases
8
8
 
9
9
 
@@ -4,7 +4,7 @@ import collections
4
4
 
5
5
  import numpy as np
6
6
 
7
- from onesecondtrader import events, models
7
+ from onesecondtrader.core import events, models
8
8
  from .base import Indicator
9
9
 
10
10
 
@@ -1,4 +1,4 @@
1
- from onesecondtrader import events
1
+ from onesecondtrader.core import events
2
2
  from .base import Indicator
3
3
 
4
4
 
@@ -6,7 +6,7 @@ import threading
6
6
 
7
7
  import numpy as np
8
8
 
9
- from onesecondtrader import events
9
+ from onesecondtrader.core import events
10
10
 
11
11
 
12
12
  class Indicator(abc.ABC):
@@ -4,7 +4,7 @@ import collections
4
4
  import threading
5
5
  import typing
6
6
 
7
- from onesecondtrader import events
7
+ from onesecondtrader.core import events
8
8
 
9
9
  if typing.TYPE_CHECKING:
10
10
  from .subscriber import Subscriber
@@ -2,7 +2,7 @@ import abc
2
2
  import queue
3
3
  import threading
4
4
 
5
- from onesecondtrader import events
5
+ from onesecondtrader.core import events
6
6
  from .eventbus import EventBus
7
7
 
8
8
 
@@ -4,4 +4,4 @@ __all__ = [
4
4
  ]
5
5
 
6
6
  from .base import StrategyBase
7
- from .sma_crossover import SMACrossover
7
+ from .examples import SMACrossover
@@ -6,7 +6,7 @@ from types import SimpleNamespace
6
6
 
7
7
  import pandas as pd
8
8
 
9
- from onesecondtrader import events, indicators, messaging, models
9
+ from onesecondtrader.core import events, indicators, messaging, models
10
10
 
11
11
 
12
12
  class StrategyBase(messaging.Subscriber, abc.ABC):
@@ -1,4 +1,4 @@
1
- from onesecondtrader import events, indicators, models
1
+ from onesecondtrader.core import events, indicators, models
2
2
  from .base import StrategyBase
3
3
 
4
4
 
File without changes
@@ -0,0 +1,5 @@
1
+ __all__ = [
2
+ "init_secmaster",
3
+ ]
4
+
5
+ from onesecondtrader.secmaster.utils import init_secmaster
@@ -0,0 +1,46 @@
1
+ -- Security Master Database Schema
2
+ --
3
+ -- Stores instrument metadata and OHLCV market data. Prices are stored as
4
+ -- fixed-point integers (scale factor $10^9$) to avoid floating-point errors.
5
+ -- Timestamps are nanoseconds since Unix epoch.
6
+
7
+ -- Data providers. Separated from instruments because the same symbol (e.g.,
8
+ -- `ESH5`) may exist across multiple vendors with different `instrument_id`s.
9
+ CREATE TABLE publishers (
10
+ publisher_id INTEGER PRIMARY KEY,
11
+ name TEXT NOT NULL UNIQUE,
12
+ dataset TEXT NOT NULL,
13
+ venue TEXT
14
+ );
15
+
16
+ -- Security/instrument metadata. The UNIQUE constraint on (`publisher_id`, `raw_symbol`)
17
+ -- allows the same symbol from different vendors while preventing duplicates.
18
+ CREATE TABLE instruments (
19
+ instrument_id INTEGER PRIMARY KEY,
20
+ publisher_id INTEGER NOT NULL,
21
+ raw_symbol TEXT NOT NULL,
22
+ instrument_class TEXT NOT NULL DEFAULT 'K',
23
+ exchange TEXT,
24
+ currency TEXT DEFAULT 'USD',
25
+ min_price_increment INTEGER,
26
+ ts_recv INTEGER NOT NULL,
27
+ FOREIGN KEY (publisher_id) REFERENCES publishers(publisher_id),
28
+ UNIQUE(publisher_id, raw_symbol)
29
+ );
30
+
31
+ -- OHLCV bar data. The primary key order (`instrument_id`, `rtype`, `ts_event`) ensures
32
+ -- bars for the same instrument/timeframe are contiguous on disk, making range
33
+ -- queries fast. `WITHOUT ROWID` stores data directly in the primary key B-tree,
34
+ -- eliminating the indirection of a separate rowid lookup.
35
+ CREATE TABLE ohlcv (
36
+ instrument_id INTEGER NOT NULL,
37
+ rtype INTEGER NOT NULL,
38
+ ts_event INTEGER NOT NULL,
39
+ open INTEGER NOT NULL,
40
+ high INTEGER NOT NULL,
41
+ low INTEGER NOT NULL,
42
+ close INTEGER NOT NULL,
43
+ volume INTEGER NOT NULL,
44
+ FOREIGN KEY (instrument_id) REFERENCES instruments(instrument_id),
45
+ PRIMARY KEY (instrument_id, rtype, ts_event)
46
+ ) WITHOUT ROWID;
@@ -0,0 +1,26 @@
1
+ from __future__ import annotations
2
+
3
+ import pathlib
4
+ import sqlite3
5
+
6
+
7
+ def init_secmaster(db_path: pathlib.Path) -> None:
8
+ """Initialize a new secmaster database at the specified path.
9
+
10
+ Creates the database file with the schema defined in schema.sql (publishers, instruments,
11
+ and ohlcv tables) but does not populate any data.
12
+
13
+ Args:
14
+ db_path: Path where the database file will be created.
15
+
16
+ Raises:
17
+ FileExistsError: If a database already exists at the path.
18
+ """
19
+ if db_path.exists():
20
+ raise FileExistsError(f"Database already exists: {db_path}")
21
+ db_path.parent.mkdir(parents=True, exist_ok=True)
22
+ schema_path = pathlib.Path(__file__).parent / "schema.sql"
23
+ conn = sqlite3.connect(str(db_path))
24
+ conn.executescript(schema_path.read_text())
25
+ conn.commit()
26
+ conn.close()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onesecondtrader
3
- Version: 0.35.0
3
+ Version: 0.37.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,37 @@
1
+ onesecondtrader/__init__.py,sha256=MZbEb45XiQOuWY-8EbBfidLnCZ7Qwp0cVajOpbgbQn4,1090
2
+ onesecondtrader/connectors/__init__.py,sha256=TDV1mXCkNVuMS8FQWRts_6FDwBEeNciMqYtZb8HNl2w,120
3
+ onesecondtrader/connectors/brokers/__init__.py,sha256=O67ETIic6yrGDQp_wJSNTsjZ4Tt_3NGO3v4RJf3bm7Q,70
4
+ onesecondtrader/connectors/brokers/simulated.py,sha256=ck0gWdz88KSyEMkiHW2CP0vuLrBELBTz3KveYIwbLuI,12722
5
+ onesecondtrader/connectors/datafeeds/__init__.py,sha256=OzrPQcmdwzI6Fo8BONoWeJQtp0ttQ6TMYL6dUvvery4,113
6
+ onesecondtrader/connectors/datafeeds/base.py,sha256=hpffDlv5Z92OZnL_B3vs_rRmq7uRU4HCf8N6IZkRxmM,482
7
+ onesecondtrader/connectors/datafeeds/simulated.py,sha256=aMLSDu2CVaQcxxeWOcznFrfPgXq3icEB2rRe4KNK0Wg,3011
8
+ onesecondtrader/core/__init__.py,sha256=5T2eAX4I_yo2ku9zywhFvl628kPTINxoLY92u7x_gy0,324
9
+ onesecondtrader/core/brokers/__init__.py,sha256=mC-nNPdaT17oy-rjluwNvbKzxi5q8xxZ4mAkU7aJU0Y,55
10
+ onesecondtrader/core/brokers/base.py,sha256=n82DHGvqkP9c4ATW8qT9yosPRoRQGUrs1oveGASdhlY,1350
11
+ onesecondtrader/core/events/__init__.py,sha256=IOlFRdiOXz93SpvkpKL8wr1954d_8olKSB1n9mlTL3Y,898
12
+ onesecondtrader/core/events/bases.py,sha256=g-ykq2jgcitIAueRurUlqAq0jINQwuhSWi_khAniPHw,662
13
+ onesecondtrader/core/events/market.py,sha256=UY04TH6G-98NgYPEvBQSY92_ddeiT4yNwaUXnHdongQ,514
14
+ onesecondtrader/core/events/requests.py,sha256=7cnt7TiuE7yl9ezFruIixY0v5A-mzZDWdoTBkAcVff0,836
15
+ onesecondtrader/core/events/responses.py,sha256=biHIFa6usnsgSEX9bh2zOs1zB00I7HVSS01Dh_pZISE,1441
16
+ onesecondtrader/core/indicators/__init__.py,sha256=hRg3FCP1FT7LYOLzztybWn48gTR5QvewzzdELPYbdoY,239
17
+ onesecondtrader/core/indicators/averages.py,sha256=sCAIJrOYhtkwO5MkS2vx-4CfzHIVLJZpwYDzwv1GZ7Y,1905
18
+ onesecondtrader/core/indicators/bar.py,sha256=9NUckrLO1AhyO3uTJlNCL2_Pqge58x5S_TcSz4qrk-c,1120
19
+ onesecondtrader/core/indicators/base.py,sha256=_2pJ7PS0MRUz85UT0YpvzJ5V6ce60koT8MbjoerZ9eM,1894
20
+ onesecondtrader/core/messaging/__init__.py,sha256=vMRDabHBgse_vZRTRFtnU8M8v2sY_o4pHjGzgu3hp3E,115
21
+ onesecondtrader/core/messaging/eventbus.py,sha256=SaXLRoqz9tWBBlyEo0ry1HHr_8azj2U2dEaQEnr3PNo,1581
22
+ onesecondtrader/core/messaging/subscriber.py,sha256=Sp77pB6bGyW57FlV0rdzAWy1Jv_nHA77YEtN64spZjs,2111
23
+ onesecondtrader/core/models/__init__.py,sha256=7amHCQ6BAhHKps0ke63E-zh8IJNmkdDogZq-PfBukMs,249
24
+ onesecondtrader/core/models/data.py,sha256=fBmddVl6EXYC5u2UnvQ59DXAXeZeIb48KP1ZdeTL52A,322
25
+ onesecondtrader/core/models/orders.py,sha256=y6Ar-6fMqaOd_hRnRGvfWUF0Z13H_2hfTOW3ROOk0A8,254
26
+ onesecondtrader/core/models/records.py,sha256=vdCWBtoDQs5R4iB_8_3fXkxWEvoCxOssk9XBnS4l7Vk,599
27
+ onesecondtrader/core/strategies/__init__.py,sha256=Nq1n6HCdZ-GKkpn4WAlKxconPnOmeVKo0nhTk0J1ybA,121
28
+ onesecondtrader/core/strategies/base.py,sha256=wZMjPu4sSMclvoyMptIZKllaqFkRrA06CZ5EG7uQ-Uo,11211
29
+ onesecondtrader/core/strategies/examples.py,sha256=j4K092_qt0bcvajp-i4ugrGqzbaFebYX6rBbtZawtvE,1124
30
+ onesecondtrader/dashboard/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ onesecondtrader/secmaster/__init__.py,sha256=HUpfkdWpz6t5YO0QgiEyM5MU32RQNGv9lfsvdE8HHZQ,96
32
+ onesecondtrader/secmaster/schema.sql,sha256=NHHBb86cwZYtSZbOWlBgXd8dQsi5B26KZC-OR5sytAU,1802
33
+ onesecondtrader/secmaster/utils.py,sha256=82DUBbzdGbNmQHewhC2qmcbbarnrr4g9PhEsucxbT4Y,831
34
+ onesecondtrader-0.37.0.dist-info/METADATA,sha256=opI_V5OP0sWpVTX9pdtZ2IAKK0spDm-V3WtglKWbXUM,9682
35
+ onesecondtrader-0.37.0.dist-info/WHEEL,sha256=3ny-bZhpXrU6vSQ1UPG34FoxZBp3lVcvK0LkgUz6VLk,88
36
+ onesecondtrader-0.37.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
37
+ onesecondtrader-0.37.0.dist-info/RECORD,,
@@ -1,7 +0,0 @@
1
- __all__ = [
2
- "BrokerBase",
3
- "SimulatedBroker",
4
- ]
5
-
6
- from .base import BrokerBase
7
- from .simulated import SimulatedBroker
@@ -1,5 +0,0 @@
1
- __all__ = [
2
- "CSVBookkeeper",
3
- ]
4
-
5
- from .csvbookkeeper import CSVBookkeeper
@@ -1,180 +0,0 @@
1
- import pathlib
2
-
3
- import pandas as pd
4
-
5
- from onesecondtrader import events, messaging
6
-
7
-
8
- class CSVBookkeeper(messaging.Subscriber):
9
- BATCH_SIZE: int = 1000
10
-
11
- def __init__(
12
- self, event_bus: messaging.EventBus, results_path: pathlib.Path
13
- ) -> None:
14
- self._results_path = results_path
15
- self._bars_buffer: list[dict] = []
16
- self._fills_buffer: list[dict] = []
17
- self._orders_buffer: list[dict] = []
18
-
19
- super().__init__(event_bus)
20
- self._subscribe(
21
- events.BarProcessed,
22
- events.OrderFilled,
23
- events.OrderSubmission,
24
- events.OrderModification,
25
- events.OrderCancellation,
26
- events.OrderSubmissionAccepted,
27
- events.OrderModificationAccepted,
28
- events.OrderCancellationAccepted,
29
- events.OrderSubmissionRejected,
30
- events.OrderModificationRejected,
31
- events.OrderCancellationRejected,
32
- events.OrderExpired,
33
- )
34
-
35
- def _on_event(self, event: events.EventBase) -> None:
36
- match event:
37
- case events.BarProcessed() as e:
38
- self._on_processed_bar(e)
39
- case events.OrderFilled() as e:
40
- self._on_fill(e)
41
- case events.OrderSubmission() as e:
42
- self._on_order_event(e, "submission_requested")
43
- case events.OrderModification() as e:
44
- self._on_order_event(e, "modification_requested")
45
- case events.OrderCancellation() as e:
46
- self._on_order_event(e, "cancellation_requested")
47
- case events.OrderSubmissionAccepted() as e:
48
- self._on_order_event(e, "submission_accepted")
49
- case events.OrderModificationAccepted() as e:
50
- self._on_order_event(e, "modification_accepted")
51
- case events.OrderCancellationAccepted() as e:
52
- self._on_order_event(e, "cancellation_accepted")
53
- case events.OrderSubmissionRejected() as e:
54
- self._on_order_event(e, "submission_rejected")
55
- case events.OrderModificationRejected() as e:
56
- self._on_order_event(e, "modification_rejected")
57
- case events.OrderCancellationRejected() as e:
58
- self._on_order_event(e, "cancellation_rejected")
59
- case events.OrderExpired() as e:
60
- self._on_order_event(e, "expired")
61
-
62
- def _on_processed_bar(self, event: events.BarProcessed) -> None:
63
- record = {
64
- "ts_event": event.ts_event,
65
- "symbol": event.symbol,
66
- "bar_period": event.bar_period.name,
67
- "open": event.open,
68
- "high": event.high,
69
- "low": event.low,
70
- "close": event.close,
71
- "volume": event.volume,
72
- }
73
- record.update(event.indicators)
74
- self._bars_buffer.append(record)
75
- if len(self._bars_buffer) >= self.BATCH_SIZE:
76
- self._flush_bars()
77
-
78
- def _on_fill(self, event: events.OrderFilled) -> None:
79
- self._fills_buffer.append(
80
- {
81
- "ts_event": event.ts_event,
82
- "fill_id": str(event.fill_id),
83
- "broker_fill_id": event.broker_fill_id,
84
- "order_id": str(event.associated_order_id),
85
- "symbol": event.symbol,
86
- "side": event.side.name,
87
- "quantity": event.quantity_filled,
88
- "price": event.fill_price,
89
- "commission": event.commission,
90
- "exchange": event.exchange,
91
- }
92
- )
93
- if len(self._fills_buffer) >= self.BATCH_SIZE:
94
- self._flush_fills()
95
-
96
- def _on_order_event(self, event: events.EventBase, event_type: str) -> None:
97
- record: dict = {
98
- "ts_event": event.ts_event,
99
- "event_type": event_type,
100
- }
101
- match event:
102
- case events.OrderSubmission():
103
- record.update(
104
- {
105
- "order_id": str(event.system_order_id),
106
- "symbol": event.symbol,
107
- "order_type": event.order_type.name,
108
- "side": event.side.name,
109
- "quantity": event.quantity,
110
- "limit_price": event.limit_price,
111
- "stop_price": event.stop_price,
112
- }
113
- )
114
- case events.OrderModification():
115
- record.update(
116
- {
117
- "order_id": str(event.system_order_id),
118
- "symbol": event.symbol,
119
- "quantity": event.quantity,
120
- "limit_price": event.limit_price,
121
- "stop_price": event.stop_price,
122
- }
123
- )
124
- case events.OrderCancellation():
125
- record.update(
126
- {
127
- "order_id": str(event.system_order_id),
128
- "symbol": event.symbol,
129
- }
130
- )
131
- case events.OrderSubmissionAccepted() | events.OrderModificationAccepted():
132
- record.update(
133
- {
134
- "order_id": str(event.associated_order_id),
135
- "broker_order_id": event.broker_order_id,
136
- }
137
- )
138
- case events.OrderCancellationAccepted():
139
- record.update({"order_id": str(event.associated_order_id)})
140
- case (
141
- events.OrderSubmissionRejected()
142
- | events.OrderModificationRejected()
143
- | events.OrderCancellationRejected()
144
- ):
145
- record.update({"order_id": str(event.associated_order_id)})
146
- case events.OrderExpired():
147
- record.update({"order_id": str(event.associated_order_id)})
148
-
149
- self._orders_buffer.append(record)
150
- if len(self._orders_buffer) >= self.BATCH_SIZE:
151
- self._flush_orders()
152
-
153
- def _flush_bars(self) -> None:
154
- if not self._bars_buffer:
155
- return
156
- df = pd.DataFrame(self._bars_buffer)
157
- path = self._results_path / "processed_bars.csv"
158
- df.to_csv(path, mode="a", header=not path.exists(), index=False)
159
- self._bars_buffer.clear()
160
-
161
- def _flush_fills(self) -> None:
162
- if not self._fills_buffer:
163
- return
164
- df = pd.DataFrame(self._fills_buffer)
165
- path = self._results_path / "fills.csv"
166
- df.to_csv(path, mode="a", header=not path.exists(), index=False)
167
- self._fills_buffer.clear()
168
-
169
- def _flush_orders(self) -> None:
170
- if not self._orders_buffer:
171
- return
172
- df = pd.DataFrame(self._orders_buffer)
173
- path = self._results_path / "orders.csv"
174
- df.to_csv(path, mode="a", header=not path.exists(), index=False)
175
- self._orders_buffer.clear()
176
-
177
- def _cleanup(self) -> None:
178
- self._flush_bars()
179
- self._flush_fills()
180
- self._flush_orders()
@@ -1,32 +0,0 @@
1
- onesecondtrader/__init__.py,sha256=bzV-SaWcDnq7os8pUtsaq8GAsBWjxBDhkFvRs3Z9FJw,1008
2
- onesecondtrader/brokers/__init__.py,sha256=YofzD0qlrfo_BzL6gwiHb9by7Webp36TQ_1O5EV0uzY,124
3
- onesecondtrader/brokers/base.py,sha256=b6Xq2gBUdy3RTpnUfpUiNSXwbuq_bRIjXJ-s89Xu7nE,1345
4
- onesecondtrader/brokers/simulated.py,sha256=pJvZ7b76xAs-NBbOX_v78IJgVrdnuTLCadqj8kYQ5sg,12694
5
- onesecondtrader/datafeeds/__init__.py,sha256=zSj1cQhBS-Z5271ICsmGc_zq-1fOd8yLQ7c4F0oJIVk,124
6
- onesecondtrader/datafeeds/base.py,sha256=bSIHBlZ8kbJ4rTZrUMiMgl8_j0Kqe6Eh2hNX5E3DhHU,477
7
- onesecondtrader/datafeeds/simulated.py,sha256=mbnEh0jjgZWRDhRLIASMbUpV1ybQktBA8opTv6nj33s,3006
8
- onesecondtrader/events/__init__.py,sha256=IOlFRdiOXz93SpvkpKL8wr1954d_8olKSB1n9mlTL3Y,898
9
- onesecondtrader/events/bases.py,sha256=g-ykq2jgcitIAueRurUlqAq0jINQwuhSWi_khAniPHw,662
10
- onesecondtrader/events/market.py,sha256=IfHuIGfp_IUiw-dFay4c4RYmkoNzshxbhuWTglBqfN0,509
11
- onesecondtrader/events/requests.py,sha256=2KXwSckiar9-fy8wkN3vcSIeOkeBfeo_XhUhrNKEd2Q,831
12
- onesecondtrader/events/responses.py,sha256=w_BH1nkkPyxQjh30EXEVFcUGDoMprFc2PuAaqpVrQ8A,1436
13
- onesecondtrader/indicators/__init__.py,sha256=hRg3FCP1FT7LYOLzztybWn48gTR5QvewzzdELPYbdoY,239
14
- onesecondtrader/indicators/averages.py,sha256=DpRRdY5G5ze3jwNOV19PPjV6slA0IEeOOla67yChi2Y,1900
15
- onesecondtrader/indicators/bar.py,sha256=0H07mKNiUx5cE1fQvx1oPVY0R_MXcmAAgsLek175vTk,1115
16
- onesecondtrader/indicators/base.py,sha256=64HJD8JWBnUdR7PLd02N3hbNrRfKMjWHEKGeSyMRms8,1889
17
- onesecondtrader/messaging/__init__.py,sha256=vMRDabHBgse_vZRTRFtnU8M8v2sY_o4pHjGzgu3hp3E,115
18
- onesecondtrader/messaging/eventbus.py,sha256=Y8VbDZlEz8Q6KcCkfXRKsVIixsctBMRW1a5ANw297Ls,1576
19
- onesecondtrader/messaging/subscriber.py,sha256=ImpFmu5IstLXLoKVMaebmLp5MXN6225vHLdTL1ZOPvw,2106
20
- onesecondtrader/models/__init__.py,sha256=7amHCQ6BAhHKps0ke63E-zh8IJNmkdDogZq-PfBukMs,249
21
- onesecondtrader/models/data.py,sha256=fBmddVl6EXYC5u2UnvQ59DXAXeZeIb48KP1ZdeTL52A,322
22
- onesecondtrader/models/orders.py,sha256=y6Ar-6fMqaOd_hRnRGvfWUF0Z13H_2hfTOW3ROOk0A8,254
23
- onesecondtrader/models/records.py,sha256=vdCWBtoDQs5R4iB_8_3fXkxWEvoCxOssk9XBnS4l7Vk,599
24
- onesecondtrader/observers/__init__.py,sha256=fYF9tUW4H7L6Iueqkn2wnBf2LpXZtfdppqG4RkZCi2M,77
25
- onesecondtrader/observers/csvbookkeeper.py,sha256=hTRHhithHY4r2bjgroO2DchvTDOM6DEO3m6jdvWeUeM,7021
26
- onesecondtrader/strategies/__init__.py,sha256=5TlEckz3RnwZTs1Isj0wJ_9Og5R9MMXBL90Vu9b45io,126
27
- onesecondtrader/strategies/base.py,sha256=kIi6by4Y8YuB9gPMPMr2Unm5_i9SGAANyiW2UaHiRO0,11206
28
- onesecondtrader/strategies/sma_crossover.py,sha256=s2u_uL_D5CrZTACiAbojnrLrLf4jqIPdfOCiNDEIsDA,1119
29
- onesecondtrader-0.35.0.dist-info/METADATA,sha256=3qckSVPhiHalNJt8HeQSto06RfjM3Af84DtXgJ9m5lo,9682
30
- onesecondtrader-0.35.0.dist-info/WHEEL,sha256=3ny-bZhpXrU6vSQ1UPG34FoxZBp3lVcvK0LkgUz6VLk,88
31
- onesecondtrader-0.35.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
32
- onesecondtrader-0.35.0.dist-info/RECORD,,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes