idea144-crossvenuearbx-fede.../crossvenue_arbx/adapters.py

67 lines
2.0 KiB
Python

from __future__ import annotations
import time
from typing import Dict, Any
from .core import LocalArbProblem, SharedSignals, PlanDelta
def _deterministic_delta(seed: str) -> float:
basis = sum(ord(ch) for ch in seed)
return 0.0002 * (basis % 5)
class PriceFeedAdapter:
"""Adapter A: emits LocalArbProblem + SharedSignals on a fixed cadence."""
def __init__(self, venue: str, assets: list[str]):
self.venue = venue
self.assets = assets
self.version = 1
def step(self) -> tuple[LocalArbProblem, SharedSignals]:
prob = LocalArbProblem(
id=f"{self.venue}-p1",
venue=self.venue,
assets=self.assets,
target_misprice=0.001,
max_exposure=100000.0,
latency_budget=0.1,
)
signals = SharedSignals(
version=self.version,
price_delta_by_asset={a: _deterministic_delta(f"{self.venue}:{a}") for a in self.assets},
cross_corr={(a1, a2): 0.1 for a1 in self.assets for a2 in self.assets if a1 != a2},
liquidity_estimates={a: 1.0 for a in self.assets},
)
self.version += 1
return prob, signals
class BrokerAdapter:
"""Adapter B: consumes PlanDelta and prints a simulated fill."""
def __init__(self, venue: str):
self.venue = venue
def execute(self, plan: PlanDelta) -> Dict[str, Any]:
fills = []
for action in plan.delta_actions:
fills.append(
{
"asset": action.get("asset"),
"size": action.get("size"),
"from": action.get("from_venue"),
"to": action.get("to_venue"),
"status": "filled",
"fee_bps": 1.0,
}
)
return {
"venue": self.venue,
"timestamp": plan.timestamp,
"fills": fills,
"ack": True,
"contract_id": plan.contract_id,
"signature": plan.signature,
}