main-mexc.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import asyncio
  2. import websockets
  3. import json
  4. # 1. 从扩展库导入代理连接函数和代理类
  5. from websockets_proxy import Proxy, proxy_connect
  6. async def listen_mexc_futures():
  7. uri = "wss://futures.mexc.com/edge"
  8. # 2. 定义你的代理服务器地址和端口
  9. # 请替换成你自己的代理服务器信息
  10. # 支持 http, socks4, socks5
  11. proxy_url = "http://127.0.0.1:7899" # 这是一个HTTP代理的例子
  12. proxy = Proxy.from_url(proxy_url)
  13. # 3. 使用 proxy_connect 替代 websockets.connect
  14. async with proxy_connect(uri, proxy=proxy) as websocket:
  15. print(f"成功通过代理 {proxy_url} 连接到 {uri}")
  16. # 定义异步心跳函数
  17. async def send_subscription():
  18. # 取消订阅增量盘口列表 (通常在开始新的订阅前,先取消旧的)
  19. unsub_tick_list_inc = {"method": "unsub.tick.list.inc", "param": {"timezone": "UTC+8"}}
  20. # await websocket.send(json.dumps(unsub_tick_list_inc))
  21. # 取消订阅全量盘口列表
  22. unsub_tick_list = {"method": "unsub.tick.list", "param": {"timezone": "UTC+8"}}
  23. # await websocket.send(json.dumps(unsub_tick_list))
  24. # 订阅所有合约的基础信息 (例如合约名称、精度等)
  25. sub_contract = {"method": "sub.contract"}
  26. # await websocket.send(json.dumps(sub_contract))
  27. # 订阅个人用户偏好设置
  28. sub_personal_user_preference = {"method": "sub.personal.user.preference"}
  29. # await websocket.send(json.dumps(sub_personal_user_preference))
  30. # 批量订阅多个交易对的最新价(Ticker)信息
  31. sub_tick_batch = {"method": "sub.tick.batch", "param": {"timezone": "UTC+8",
  32. "symbols": ["DOGE_USD", "ETH_USDT", "BR_USDT", "SOL_USDT", "PI_USDT", "XRP_USDT", "ORCA_USDT", "TUT_USDT",
  33. "MUBARAK_USDT", "BUBB_USDT", "SIREN_USDT", "MUBARAKAH_USDT", "TAT_USDT", "BANANAS31_USDT",
  34. "SZN_USDT", "YZYSOL_USDT", "DLC_USDT", "FORM_USDT", "SLING_USDT", "NIL_USDT"]}}
  35. # await websocket.send(json.dumps(sub_tick_batch))
  36. # 订阅单个交易对的深度盘口数据 (按价格步长0.1聚合)
  37. sub_depth_step = {"method": "sub.depth.step", "param": {"symbol": "DOGE_USD", "step": 0.1}}
  38. # await websocket.send(json.dumps(sub_depth_step))
  39. # 订阅单个交易对的实时成交记录
  40. sub_deal = {"method": "sub.deal", "param": {"symbol": "DOGE_USD", "compress": "true"}}
  41. # await websocket.send(json.dumps(sub_deal))
  42. # 订阅单个交易对的资金费率
  43. sub_funding_rate = {"method": "sub.funding.rate", "param": {"symbol": "DOGE_USD"}}
  44. # await websocket.send(json.dumps(sub_funding_rate))
  45. # 订阅单个交易对的合理价格 (也叫标记价格,用于计算未实现盈亏)
  46. sub_fair_price = {"method": "sub.fair.price", "param": {"symbol": "DOGE_USD"}}
  47. await websocket.send(json.dumps(sub_fair_price))
  48. # 订阅单个交易对的指数价格 (通常是多个主流交易所现货价格的加权平均)
  49. sub_index_price = {"method": "sub.index.price", "param": {"symbol": "DOGE_USD"}}
  50. # await websocket.send(json.dumps(sub_index_price))
  51. # 订阅单个交易对的K线数据 (这里订阅的是15分钟K线)
  52. sub_kline = {"method": "sub.kline", "param": {"symbol": "DOGE_USD", "interval": "Min15"}}
  53. # await websocket.send(json.dumps(sub_kline))
  54. while True:
  55. heartbeat_message = {"method": "ping"}
  56. await websocket.send(json.dumps(heartbeat_message))
  57. print(f"发送心跳消息: {heartbeat_message}")
  58. await asyncio.sleep(30)
  59. # 启动异步心跳任务
  60. asyncio.create_task(send_subscription())
  61. while True:
  62. try:
  63. message = await websocket.recv()
  64. print(f"接收到消息: {message}")
  65. data = json.loads(message)
  66. if 'channel' in data and data['channel'] == 'pong':
  67. continue
  68. if 'data' in data and isinstance(data['data'], list) and len(data['data']) > 0:
  69. for deal in data['data']:
  70. print(f"成交价格: {deal['p']}")
  71. except websockets.exceptions.ConnectionClosed as e:
  72. print(f"连接关闭: {e}")
  73. break
  74. except Exception as e:
  75. print(f"发生错误: {e}")
  76. break
  77. async def main():
  78. await listen_mexc_futures()
  79. if __name__ == "__main__":
  80. asyncio.run(main())