strategy.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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 isinstance(confidence, bool):
  20. raise ValueError("signal confidence is invalid")
  21. if not isinstance(confidence, int | float) or not 0 <= float(confidence) <= 1:
  22. raise ValueError("signal confidence is invalid")
  23. leverage = payload["leverage"]
  24. if isinstance(leverage, bool):
  25. raise ValueError("signal leverage is invalid")
  26. if not isinstance(leverage, int) or not 1 <= leverage <= 3:
  27. raise ValueError("signal leverage is invalid")
  28. entry_price = payload["entry_price"]
  29. if entry_price is not None:
  30. if isinstance(entry_price, bool):
  31. raise ValueError("signal entry_price is invalid")
  32. if not isinstance(entry_price, int | float):
  33. raise ValueError("signal entry_price is invalid")
  34. entry_price = float(entry_price)
  35. take_profit_price = payload["take_profit_price"]
  36. if take_profit_price is not None:
  37. if isinstance(take_profit_price, bool):
  38. raise ValueError("signal take_profit_price is invalid")
  39. if not isinstance(take_profit_price, int | float):
  40. raise ValueError("signal take_profit_price is invalid")
  41. take_profit_price = float(take_profit_price)
  42. stop_loss_price = payload["stop_loss_price"]
  43. if stop_loss_price is not None:
  44. if isinstance(stop_loss_price, bool):
  45. raise ValueError("signal stop_loss_price is invalid")
  46. if not isinstance(stop_loss_price, int | float):
  47. raise ValueError("signal stop_loss_price is invalid")
  48. stop_loss_price = float(stop_loss_price)
  49. reason = payload["reason"]
  50. if not isinstance(reason, str) or not reason:
  51. raise ValueError("signal reason is invalid")
  52. return TradeSignal(
  53. action=action,
  54. confidence=float(confidence),
  55. leverage=leverage,
  56. entry_price=entry_price,
  57. take_profit_price=take_profit_price,
  58. stop_loss_price=stop_loss_price,
  59. reason=reason,
  60. )