import math from datetime import datetime from deltaforge.dsl import Asset, MarketSignal, LocalArbProblem, SharedSignals, PlanDelta from deltaforge.curator import reconcile from deltaforge.adapters.equity_feed import generate_signal from deltaforge.adapters.options_feed import generate_signal as opt_signal from deltaforge.execution import ExecutionEngine from deltaforge.backtester import backtest def test_end_to_end_basic_flow(): # Define two assets (two venues) a1 = Asset(symbol="AAPL", asset_type="equity", venue="venueA") a2 = Asset(symbol="SPY", asset_type="equity", venue="venueB") # Generate signals from adapters s1 = MarketSignal(asset=a1, timestamp=datetime.utcnow(), price=150.0, source="equity_feed") s2 = MarketSignal(asset=a2, timestamp=datetime.utcnow(), price=400.0, source="equity_feed") signals = SharedSignals(version=1, signals=[s1, s2], privacy_tag="public") # Local arb problem per venue arb1 = LocalArbProblem(id="arb-venueA", venue="venueA", assets=[a1], objective="delta-hedge") arb2 = LocalArbProblem(id="arb-venueB", venue="venueB", assets=[a2], objective="delta-hedge") plan = PlanDelta(delta={"AAPL": -0.5, "SPY": 0.5}, timestamp=datetime.utcnow(), author="tester", contract_id="ct-001") # Curator reconciles plan across venues reconciled = reconcile(signals, [arb1, arb2], plan) # Basic execution routing (toy) engine = ExecutionEngine(venues=["venueA", "venueB"]) venue_map = {"AAPL": "venueA", "SPY": "venueB"} exec_res = engine.route(reconciled.delta, venue_map) assert exec_res.status == "ok" # Backtest deterministically bt = backtest(reconciled.delta, initial_capital=100000.0) assert isinstance(bt.pnl, float) # PnL should be deterministic given the same inputs assert math.isfinite(bt.pnl)