models.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. from dataclasses import asdict, dataclass
  2. from typing import Literal
  3. @dataclass(frozen=True)
  4. class Candle:
  5. symbol: str
  6. ts: int
  7. open: float
  8. high: float
  9. low: float
  10. close: float
  11. volume: float
  12. @dataclass(frozen=True)
  13. class TradeSignal:
  14. action: Literal["long", "short", "flat"]
  15. confidence: float
  16. leverage: int
  17. entry_price: float | None
  18. take_profit_price: float | None
  19. stop_loss_price: float | None
  20. reason: str
  21. @dataclass(frozen=True)
  22. class InstrumentMeta:
  23. ct_val: float
  24. lot_sz: float
  25. min_sz: float
  26. @dataclass(frozen=True)
  27. class Position:
  28. symbol: str
  29. pos_side: str
  30. size: float
  31. avg_price: float
  32. @dataclass(frozen=True)
  33. class OrderResult:
  34. status: str
  35. order_id: str | None
  36. symbol: str
  37. side: str | None
  38. pos_side: str | None
  39. order_type: str | None
  40. size: float | None
  41. @dataclass(frozen=True)
  42. class BacktestTrade:
  43. direction: str
  44. entry_price: float
  45. exit_price: float
  46. margin_used: float
  47. ending_equity: float
  48. @dataclass(frozen=True)
  49. class BacktestResult:
  50. initial_equity: float
  51. ending_equity: float
  52. total_return: float
  53. max_drawdown: float
  54. win_rate: float
  55. trade_count: int
  56. trades: list[BacktestTrade]
  57. def to_dict(self) -> dict[str, object]:
  58. return asdict(self)