58 lines
1.6 KiB
Python
58 lines
1.6 KiB
Python
from typing import List, Optional
|
|
from pydantic import BaseModel, Field
|
|
from datetime import datetime
|
|
|
|
|
|
class LocalBook(BaseModel):
|
|
"""A minimal per-venue order book snapshot.
|
|
|
|
This is intentionally tiny for Phase 0: top-of-book bids/asks with sizes and timestamp.
|
|
"""
|
|
venue_id: str
|
|
asset: str
|
|
best_bid: Optional[float]
|
|
best_bid_size: Optional[float]
|
|
best_ask: Optional[float]
|
|
best_ask_size: Optional[float]
|
|
timestamp: datetime = Field(default_factory=datetime.utcnow)
|
|
|
|
|
|
class OrderEvent(BaseModel):
|
|
"""A canonical order lifecycle event used between adapters and simulator."""
|
|
order_id: str
|
|
venue_id: str
|
|
asset: str
|
|
side: str # 'buy' or 'sell'
|
|
price: Optional[float]
|
|
size: float
|
|
created_at: datetime = Field(default_factory=datetime.utcnow)
|
|
status: str = "submitted" # submitted, accepted, filled, cancelled
|
|
|
|
|
|
class QuoteSnapshot(BaseModel):
|
|
venue_id: str
|
|
asset: str
|
|
bids: List[List[float]] = [] # [[price, size], ...]
|
|
asks: List[List[float]] = []
|
|
timestamp: datetime = Field(default_factory=datetime.utcnow)
|
|
|
|
|
|
class SharedSignals(BaseModel):
|
|
"""Lightweight aggregated signals used for cross-venue coordination."""
|
|
asset: str
|
|
mid_price: Optional[float]
|
|
liquidity: Optional[float]
|
|
timestamp: datetime = Field(default_factory=datetime.utcnow)
|
|
|
|
|
|
class PlanDelta(BaseModel):
|
|
"""An incremental plan update: proposed hedge or quote update."""
|
|
plan_id: str
|
|
author: str
|
|
asset: str
|
|
venue_id: str
|
|
side: str
|
|
price: Optional[float]
|
|
size: float
|
|
created_at: datetime = Field(default_factory=datetime.utcnow)
|