72 lines
2.6 KiB
Python
72 lines
2.6 KiB
Python
"""Demo: end-to-end DeltaTrace pipeline.
|
|
|
|
Generates synthetic market data, builds an event graph,
|
|
replays it deterministically, and produces a signed audit log.
|
|
"""
|
|
|
|
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
|
|
|
|
from .adapters import FIXFeedAdapter, SandboxExchangeAdapter
|
|
from .audit_log import AuditLog
|
|
from .event_graph import EventGraph, EventType
|
|
from .replay_engine import ReplayEngine
|
|
|
|
|
|
def main() -> None:
|
|
# 1. Setup
|
|
graph = EventGraph()
|
|
fix_adapter = FIXFeedAdapter()
|
|
sandbox = SandboxExchangeAdapter(fill_rate=1.0, latency_ms=0.1)
|
|
key = Ed25519PrivateKey.generate()
|
|
audit = AuditLog(key)
|
|
|
|
# 2. Ingest FIX market data
|
|
fix_msg = {"35": "W", "55": "AAPL", "bid": "185.50", "ask": "185.55", "44": "185.52", "38": "1000"}
|
|
tick_events = fix_adapter.ingest(fix_msg)
|
|
for ev in tick_events:
|
|
graph.add_event(ev)
|
|
|
|
# 3. Generate signal from tick
|
|
from .event_graph import Event
|
|
signal = Event.create(EventType.SIGNAL, {"strategy": "momentum", "direction": "buy", "strength": 0.85})
|
|
graph.add_event(signal)
|
|
graph.add_edge(tick_events[0].id, signal.id, label="tick->signal")
|
|
|
|
# 4. Plan delta
|
|
plan = Event.create(EventType.PLAN_DELTA, {"action": "buy", "symbol": "AAPL", "qty": 500, "limit": 185.55})
|
|
graph.add_event(plan)
|
|
graph.add_edge(signal.id, plan.id, label="signal->plan")
|
|
|
|
# 5. Risk check
|
|
risk = Event.create(EventType.RISK_CHECK, {"check": "position_limit", "result": "pass", "exposure": 92750})
|
|
graph.add_event(risk)
|
|
graph.add_edge(plan.id, risk.id, label="plan->risk_check")
|
|
|
|
# 6. Order via sandbox exchange
|
|
order_events = sandbox.ingest({"type": "order", "symbol": "AAPL", "price": 185.55, "qty": 500, "side": "buy"})
|
|
for ev in order_events:
|
|
graph.add_event(ev)
|
|
graph.add_edge(risk.id, order_events[0].id, label="risk->order")
|
|
if len(order_events) > 1:
|
|
graph.add_edge(order_events[0].id, order_events[1].id, label="order->fill")
|
|
|
|
# 7. Audit log
|
|
for ev in graph.topological_order():
|
|
audit.append(ev.id, f"processed:{ev.event_type.value}", ev.payload)
|
|
|
|
# 8. Replay
|
|
engine = ReplayEngine()
|
|
result = engine.replay(graph)
|
|
|
|
# 9. Output
|
|
print(f"Events in graph: {len(graph.events)}")
|
|
print(f"Edges: {len(graph.edges)}")
|
|
print(f"Replay: {result.events_replayed} events, {result.total_latency_ns / 1e6:.2f}ms span")
|
|
print(f"Fidelity: {result.fidelity_score}")
|
|
print(f"Audit entries: {len(audit.entries)}")
|
|
print(f"Audit chain valid: {audit.verify()}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|