strategy.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. 交易策略模块
  5. 实现基于Lighter和Binance价差的交易策略
  6. """
  7. import logging
  8. from enum import Enum
  9. from datetime import datetime
  10. import os
  11. import lighter
  12. # 配置日志
  13. logs_dir = "logs"
  14. if not os.path.exists(logs_dir):
  15. os.makedirs(logs_dir)
  16. logger = logging.getLogger("strategy")
  17. class StrategyState(Enum):
  18. """策略状态枚举"""
  19. WAITING_INIT = 1 # 等待初始化
  20. IDLE_MONITORING = 2 # 空闲状态监听价差
  21. EXECUTING_TRADE = 3 # 价差达成触发交易
  22. WAITING_CONVERGENCE = 4 # 交易完成等待价差收敛
  23. CLOSING_POSITION = 5 # 收敛完成进行平仓
  24. POSITION_CLOSED = 6 # 平仓完成
  25. class TradingStrategy:
  26. """交易策略类"""
  27. def __init__(self):
  28. """初始化策略"""
  29. self.state = StrategyState.WAITING_INIT
  30. self.current_position = None # 当前持仓信息
  31. self.entry_price_bps = 5 # 入场时的价差
  32. self.target_symbol = "DOGE" # 目标交易对
  33. self.account_index = 281474976643718
  34. self.api_client = lighter.ApiClient()
  35. self.account_api = lighter.AccountApi(self.api_client)
  36. self.transaction_api = lighter.TransactionApi(self.api_client)
  37. self.signer_client = lighter.SignerClient(
  38. url='https://mainnet.zklighter.elliot.ai',
  39. private_key='0xf3625c4662ab0b338e405f61b7555e90aeda8fa28dd607588c9e275dc6f326ddcbd9341e18ca2950',
  40. account_index=self.account_index,
  41. api_key_index=0
  42. )
  43. # Check client connection
  44. err = self.signer_client.check_client()
  45. if err is not None:
  46. logger.error(f"SignerClient CheckClient error: {trim_exception(err)}")
  47. return
  48. logger.info("策略初始化完成,当前状态: WAITING_INIT")
  49. async def do_strategy(self, market_data):
  50. """
  51. 执行策略逻辑
  52. Args:
  53. market_data: 包含市场数据的字典,格式:
  54. {
  55. 'symbol': str,
  56. 'binance_mark_price': float,
  57. 'binance_price': float,
  58. 'lighter_mark_price': float,
  59. 'lighter_price': float,
  60. 'timestamp': int
  61. }
  62. """
  63. if not market_data:
  64. return
  65. symbol = market_data.get('symbol')
  66. # 如果是DOGE交易对,打印实时行情
  67. if symbol == self.target_symbol:
  68. await self._print_market_data(market_data)
  69. # 根据当前状态执行相应逻辑
  70. if self.state == StrategyState.WAITING_INIT:
  71. await self._handle_waiting_init()
  72. elif self.state == StrategyState.IDLE_MONITORING:
  73. await self._handle_idle_monitoring(market_data)
  74. elif self.state == StrategyState.EXECUTING_TRADE:
  75. await self._handle_executing_trade(market_data)
  76. elif self.state == StrategyState.WAITING_CONVERGENCE:
  77. await self._handle_waiting_convergence(market_data)
  78. elif self.state == StrategyState.CLOSING_POSITION:
  79. await self._handle_closing_position(market_data)
  80. elif self.state == StrategyState.POSITION_CLOSED:
  81. await self._handle_position_closed()
  82. async def _print_market_data(self, market_data):
  83. """打印市场数据"""
  84. symbol = market_data.get('symbol')
  85. # binance_mark = market_data.get('binance_mark_price')
  86. binance_price = market_data.get('binance_price')
  87. # lighter_mark = market_data.get('lighter_mark_price')
  88. lighter_price = market_data.get('lighter_price')
  89. # 计算价差,转换为bps单位
  90. if binance_price and lighter_price:
  91. # 确保两个价格都是浮点数
  92. binance_price_float = float(binance_price) if isinstance(binance_price, str) else binance_price
  93. lighter_price_float = float(lighter_price) if isinstance(lighter_price, str) else lighter_price
  94. # 计算价差并转换为bps (1bps = 0.01%)
  95. price_diff_bps = int((lighter_price_float - binance_price_float) / binance_price_float * 10000) if binance_price_float else 0
  96. else:
  97. price_diff_bps = None
  98. # 格式化输出
  99. price_diff_str = f"{price_diff_bps}bps" if price_diff_bps is not None else "N/A"
  100. logger.info(f"[{symbol}] Binance: 最新价={binance_price} | Lighter: 最新价={lighter_price} | 价差={price_diff_str}")
  101. account = await self.account_api.account(by="index", value=f"{self.account_index}")
  102. logger.info(f"账户状态: {account}")
  103. async def _handle_waiting_init(self):
  104. """处理等待初始化状态"""
  105. # 初始化完成后转到空闲监听状态
  106. self.state = StrategyState.IDLE_MONITORING
  107. logger.info("状态转换: WAITING_INIT -> IDLE_MONITORING")
  108. async def _handle_idle_monitoring(self, market_data):
  109. """处理空闲监听状态 - 监控价差"""
  110. # TODO: 实现价差监控逻辑
  111. pass
  112. async def _handle_executing_trade(self, market_data):
  113. """处理执行交易状态"""
  114. # TODO: 实现交易执行逻辑
  115. pass
  116. async def _handle_waiting_convergence(self, market_data):
  117. """处理等待收敛状态"""
  118. # TODO: 实现等待价差收敛逻辑
  119. pass
  120. async def _handle_closing_position(self, market_data):
  121. """处理平仓状态"""
  122. # TODO: 实现平仓逻辑
  123. pass
  124. async def _handle_position_closed(self):
  125. """处理平仓完成状态"""
  126. # 平仓完成后回到空闲监听状态
  127. self.state = StrategyState.IDLE_MONITORING
  128. logger.info("状态转换: POSITION_CLOSED -> IDLE_MONITORING")