strategy_context.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from __future__ import annotations
  2. from dataclasses import dataclass, field
  3. from typing import Any
  4. from .exec_client import list_open_orders, cancel_all_orders, cancel_order, place_order, get_account_info
  5. from .news_client import call_news_tool
  6. from .crypto_client import call_crypto_tool
  7. @dataclass(frozen=True)
  8. class StrategyContext:
  9. id: str
  10. account_id: str
  11. client_id: str | None = field(default=None, repr=False)
  12. mode: str = "off"
  13. market_symbol: str | None = None
  14. base_currency: str | None = None
  15. counter_currency: str | None = None
  16. minimum_order_value: float | None = None
  17. def __getattr__(self, name: str):
  18. if name == "mode":
  19. return "active"
  20. raise AttributeError(name)
  21. def get_open_orders(self) -> Any:
  22. payload = list_open_orders(self.account_id, self.client_id)
  23. if isinstance(payload, dict) and isinstance(payload.get("orders"), list):
  24. return payload["orders"]
  25. return payload
  26. def cancel_all_orders(self) -> Any:
  27. return cancel_all_orders(self.account_id, self.client_id)
  28. def cancel_order(self, order_id: str) -> Any:
  29. return cancel_order(self.account_id, order_id)
  30. def place_order(self, **kwargs: Any) -> Any:
  31. mode = getattr(self, "mode", "active")
  32. if mode != "active":
  33. raise RuntimeError(f"place_order not allowed in {mode} mode")
  34. kwargs.setdefault("account_id", self.account_id)
  35. kwargs.setdefault("client_id", self.client_id)
  36. return place_order(kwargs)
  37. def get_price(self, symbol: str) -> Any:
  38. return call_crypto_tool("get_price", {"symbol": symbol})
  39. def get_regime(self, symbol: str, timeframe: str = "1h") -> Any:
  40. return call_crypto_tool("get_regime", {"symbol": symbol, "timeframe": timeframe})
  41. def get_account_info(self) -> Any:
  42. return get_account_info(self.account_id)
  43. def get_news(self, **kwargs: Any) -> Any:
  44. return call_news_tool("search", kwargs)