35 lines
1.3 KiB
Python
35 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime, timedelta
|
|
from typing import Iterator
|
|
|
|
from ..dsl import MarketSignal, Asset
|
|
|
|
|
|
class EquityFeedAdapter:
|
|
"""Starter equity price feed adapter (stubbed for MVP).
|
|
|
|
Generates deterministic MarketSignal data for two assets across two venues.
|
|
"""
|
|
|
|
def __init__(self, symbols=None, venues=None):
|
|
self.symbols = symbols or ["AAPL", "MSFT"]
|
|
self.venues = venues or ["VENUE-A", "VENUE-B"]
|
|
|
|
def stream_signals(self) -> Iterator[MarketSignal]:
|
|
"""Yield deterministic MarketSignal objects compatible with deltaforge.dsl.MarketSignal.
|
|
|
|
Each signal carries the canonical Asset description as expected by the DSL.
|
|
"""
|
|
base = {"AAPL": 150.0, "MSFT": 300.0}
|
|
t = datetime.utcnow()
|
|
for i in range(4):
|
|
for v_i, venue in enumerate(self.venues):
|
|
for sym in self.symbols:
|
|
price = base.get(sym, 100.0) * (1 + (i * 0.001) + (v_i * 0.0005))
|
|
asset = Asset(symbol=sym, type="equity")
|
|
ts = float((t + timedelta(seconds=i)).timestamp())
|
|
venue_code = 0.0 if venue == "VENUE-A" else 1.0
|
|
sig = MarketSignal(asset=asset, price=float(price), timestamp=ts, meta={"venue": venue_code})
|
|
yield sig
|