models.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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 PaperPosition:
  34. symbol: str
  35. side: str
  36. quantity: float
  37. avg_entry_price: float
  38. margin_used: float
  39. @dataclass(frozen=True)
  40. class PaperState:
  41. cash_usdt: float
  42. realized_pnl: float
  43. positions: list[PaperPosition]
  44. updated_at: str
  45. @dataclass(frozen=True)
  46. class OrderResult:
  47. status: str
  48. order_id: str | None
  49. symbol: str
  50. side: str | None
  51. pos_side: str | None
  52. order_type: str | None
  53. size: float | None
  54. @dataclass(frozen=True)
  55. class PaperOrderResult:
  56. status: str
  57. symbol: str
  58. side: str | None
  59. price: float | None
  60. quantity: float | None
  61. margin_used: float | None
  62. cash_usdt: float
  63. @dataclass(frozen=True)
  64. class BacktestTrade:
  65. direction: str
  66. entry_price: float
  67. exit_price: float
  68. margin_used: float
  69. ending_equity: float
  70. @dataclass(frozen=True)
  71. class BacktestResult:
  72. initial_equity: float
  73. ending_equity: float
  74. total_return: float
  75. max_drawdown: float
  76. win_rate: float
  77. trade_count: int
  78. trades: list[BacktestTrade]
  79. def to_dict(self) -> dict[str, object]:
  80. return asdict(self)