deltaforge-real-time-cross-.../src/deltaforge/orchestrator.py

46 lines
1.6 KiB
Python

from __future__ import annotations
from typing import List
from .dsl import Asset, MarketSignal, PlanDelta, StrategyDelta
from .coordinator import ADMMCoordinator
from .execution import ExecutionEngine
from .backtester import Backtester
from .adapters.equity_feed import build_asset as build_equity_asset, get_signals as equity_signals
from .adapters.options_feed import build_asset as build_option_asset, get_signals as option_signals
def demo_run(now: float) -> dict:
# Create two assets across two venues as a minimal cross-venue demo
aapl = build_equity_asset("AAPL")
aapl_opt = build_option_asset("AAPL_20260120_150C")
# Signals (venue A data feed + venue B option data feed)
sigs: List[MarketSignal] = []
sigs.extend(equity_signals(now))
sigs.extend(option_signals(now))
# Simple delta plan: two deltas that sum to zero (delta-neutral)
d1 = StrategyDelta(delta_positions={aapl.symbol: 10, aapl_opt.symbol: -10}, cash_delta=0.0, notes="mv1")
d2 = StrategyDelta(delta_positions={aapl.symbol: -5, aapl_opt.symbol: 5}, cash_delta=0.0, notes="mv2")
plan = PlanDelta(actions=[], deltas=[d1, d2], signature="demo-sig-1")
# Reconcile plan across venues
coordinator = ADMMCoordinator()
reconciled = coordinator.reconcile(plan)
# Route via execution engine (latency-aware)
engine = ExecutionEngine()
routes = engine.route(reconciled, sigs)
# Backtest deterministic PnL
bt = Backtester(seed=42)
pnl = bt.replay(sigs, reconciled)
return {
"assets": [aapl.symbol, aapl_opt.symbol],
"routes": routes,
"pnl": pnl,
"signatures": reconciled.signature,
}