strategy.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from typing import Mapping
  2. from okx_codex_trader.models import TradeSignal
  3. def validate_signal(payload: Mapping[str, object]) -> TradeSignal:
  4. required_keys = {
  5. "action",
  6. "confidence",
  7. "leverage",
  8. "entry_price",
  9. "take_profit_price",
  10. "stop_loss_price",
  11. "reason",
  12. }
  13. if set(payload) != required_keys:
  14. raise ValueError("signal shape is invalid")
  15. action = payload["action"]
  16. if action not in {"long", "short", "flat"}:
  17. raise ValueError("signal action is invalid")
  18. confidence = payload["confidence"]
  19. if not isinstance(confidence, int | float) or not 0 <= float(confidence) <= 1:
  20. raise ValueError("signal confidence is invalid")
  21. leverage = payload["leverage"]
  22. if not isinstance(leverage, int) or not 1 <= leverage <= 3:
  23. raise ValueError("signal leverage is invalid")
  24. entry_price = payload["entry_price"]
  25. if entry_price is not None:
  26. if not isinstance(entry_price, int | float):
  27. raise ValueError("signal entry_price is invalid")
  28. entry_price = float(entry_price)
  29. take_profit_price = payload["take_profit_price"]
  30. if take_profit_price is not None:
  31. if not isinstance(take_profit_price, int | float):
  32. raise ValueError("signal take_profit_price is invalid")
  33. take_profit_price = float(take_profit_price)
  34. stop_loss_price = payload["stop_loss_price"]
  35. if stop_loss_price is not None:
  36. if not isinstance(stop_loss_price, int | float):
  37. raise ValueError("signal stop_loss_price is invalid")
  38. stop_loss_price = float(stop_loss_price)
  39. reason = payload["reason"]
  40. if not isinstance(reason, str) or not reason:
  41. raise ValueError("signal reason is invalid")
  42. return TradeSignal(
  43. action=action,
  44. confidence=float(confidence),
  45. leverage=leverage,
  46. entry_price=entry_price,
  47. take_profit_price=take_profit_price,
  48. stop_loss_price=stop_loss_price,
  49. reason=reason,
  50. )