| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- import asyncio
- import websockets
- import json
- # 1. 从扩展库导入代理连接函数和代理类
- from websockets_proxy import Proxy, proxy_connect
- async def listen_mexc_futures():
- uri = "wss://futures.mexc.com/edge"
- # 2. 定义你的代理服务器地址和端口
- # 请替换成你自己的代理服务器信息
- # 支持 http, socks4, socks5
- proxy_url = "http://127.0.0.1:7899" # 这是一个HTTP代理的例子
- proxy = Proxy.from_url(proxy_url)
- # 3. 使用 proxy_connect 替代 websockets.connect
- async with proxy_connect(uri, proxy=proxy) as websocket:
- print(f"成功通过代理 {proxy_url} 连接到 {uri}")
- # 定义异步心跳函数
- async def send_subscription():
- # 取消订阅增量盘口列表 (通常在开始新的订阅前,先取消旧的)
- unsub_tick_list_inc = {"method": "unsub.tick.list.inc", "param": {"timezone": "UTC+8"}}
- # await websocket.send(json.dumps(unsub_tick_list_inc))
- # 取消订阅全量盘口列表
- unsub_tick_list = {"method": "unsub.tick.list", "param": {"timezone": "UTC+8"}}
- # await websocket.send(json.dumps(unsub_tick_list))
- # 订阅所有合约的基础信息 (例如合约名称、精度等)
- sub_contract = {"method": "sub.contract"}
- # await websocket.send(json.dumps(sub_contract))
- # 订阅个人用户偏好设置
- sub_personal_user_preference = {"method": "sub.personal.user.preference"}
- # await websocket.send(json.dumps(sub_personal_user_preference))
- # 批量订阅多个交易对的最新价(Ticker)信息
- sub_tick_batch = {"method": "sub.tick.batch", "param": {"timezone": "UTC+8",
- "symbols": ["DOGE_USD", "ETH_USDT", "BR_USDT", "SOL_USDT", "PI_USDT", "XRP_USDT", "ORCA_USDT", "TUT_USDT",
- "MUBARAK_USDT", "BUBB_USDT", "SIREN_USDT", "MUBARAKAH_USDT", "TAT_USDT", "BANANAS31_USDT",
- "SZN_USDT", "YZYSOL_USDT", "DLC_USDT", "FORM_USDT", "SLING_USDT", "NIL_USDT"]}}
- # await websocket.send(json.dumps(sub_tick_batch))
- # 订阅单个交易对的深度盘口数据 (按价格步长0.1聚合)
- sub_depth_step = {"method": "sub.depth.step", "param": {"symbol": "DOGE_USD", "step": 0.1}}
- # await websocket.send(json.dumps(sub_depth_step))
- # 订阅单个交易对的实时成交记录
- sub_deal = {"method": "sub.deal", "param": {"symbol": "DOGE_USD", "compress": "true"}}
- # await websocket.send(json.dumps(sub_deal))
- # 订阅单个交易对的资金费率
- sub_funding_rate = {"method": "sub.funding.rate", "param": {"symbol": "DOGE_USD"}}
- # await websocket.send(json.dumps(sub_funding_rate))
- # 订阅单个交易对的合理价格 (也叫标记价格,用于计算未实现盈亏)
- sub_fair_price = {"method": "sub.fair.price", "param": {"symbol": "DOGE_USD"}}
- await websocket.send(json.dumps(sub_fair_price))
- # 订阅单个交易对的指数价格 (通常是多个主流交易所现货价格的加权平均)
- sub_index_price = {"method": "sub.index.price", "param": {"symbol": "DOGE_USD"}}
- # await websocket.send(json.dumps(sub_index_price))
- # 订阅单个交易对的K线数据 (这里订阅的是15分钟K线)
- sub_kline = {"method": "sub.kline", "param": {"symbol": "DOGE_USD", "interval": "Min15"}}
- # await websocket.send(json.dumps(sub_kline))
- while True:
- heartbeat_message = {"method": "ping"}
- await websocket.send(json.dumps(heartbeat_message))
- print(f"发送心跳消息: {heartbeat_message}")
- await asyncio.sleep(30)
- # 启动异步心跳任务
- asyncio.create_task(send_subscription())
- while True:
- try:
- message = await websocket.recv()
- print(f"接收到消息: {message}")
- data = json.loads(message)
- if 'channel' in data and data['channel'] == 'pong':
- continue
- if 'data' in data and isinstance(data['data'], list) and len(data['data']) > 0:
- for deal in data['data']:
- print(f"成交价格: {deal['p']}")
- except websockets.exceptions.ConnectionClosed as e:
- print(f"连接关闭: {e}")
- break
- except Exception as e:
- print(f"发生错误: {e}")
- break
- async def main():
- await listen_mexc_futures()
- if __name__ == "__main__":
- asyncio.run(main())
|