67 lines
2.0 KiB
Python
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,
|
|
}
|