Files
sentiment-engine/MALKHUT/malkhut/training/hooks.py

76 lines
2.4 KiB
Python
Raw Normal View History

"""
Execution Hooks — entry/exit interfaces for future BingX integration.
Prepares hooks that will be called when connecting to live execution systems.
All hooks are no-ops now but define the interface for future implementation.
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import Any, Callable, Optional, Protocol
from malkhut.state import MarketWorldState
from malkhut.actions import FulfilmentAction
class ExecutionIntentHook(Protocol):
"""Hook called when an execution intent is submitted."""
def on_intent(self, intent_id: str, target: str, urgency: float) -> None: ...
class FillCallbackHook(Protocol):
"""Hook called after a fill is received."""
def on_fill(self, fill_price: float, fill_qty: float, side: str, is_maker: bool) -> None: ...
class VenueTelemetryHook(Protocol):
"""Hook for venue state publishing to Zinc."""
def on_venue_state(self, state: Mapping[str, Any]) -> None: ...
class AccountReconciliationHook(Protocol):
"""Hook to compare internal state vs venue state."""
def reconcile(self, internal_state: MarketWorldState, venue_state: Mapping[str, Any]) -> list[str]: ...
@dataclass(frozen=True, slots=True)
class ExecutionHooks:
"""
Collection of hooks for future execution integration.
All hooks are no-ops by default. Override when connecting to live systems.
"""
on_intent: Optional[Callable] = None
on_fill: Optional[Callable] = None
on_venue_state: Optional[Callable] = None
reconcile: Optional[Callable] = None
def submit_intent(self, intent_id: str, target: str, urgency: float) -> None:
"""Submit an execution intent (DSL primitive)."""
if self.on_intent:
self.on_intent(intent_id, target, urgency)
def report_fill(self, fill_price: float, fill_qty: float, side: str, is_maker: bool) -> None:
"""Report a fill (DSL primitive)."""
if self.on_fill:
self.on_fill(fill_price, fill_qty, side, is_maker)
def publish_venue_state(self, state: Mapping[str, Any]) -> None:
"""Publish venue state to Zinc."""
if self.on_venue_state:
self.on_venue_state(state)
def reconcile_state(self, internal: MarketWorldState, venue: Mapping[str, Any]) -> list[str]:
"""Reconcile internal vs venue state."""
if self.reconcile:
return self.reconcile(internal, venue)
return []
# Default hooks (no-ops)
DEFAULT_HOOKS = ExecutionHooks()