使用aiohttp 异步连接火币websocket 获取数据
目前获取交易所行情数据有两种模式,一种是rest AIP 拉模式,发送相应请示,由交易所返回数据,拉模式效率低,且限制频率。一种是websocket推模式,一次性连接,由交易所主动推送相关数据过来,效率高,无限频,是比较推荐的方式。 量化交易I/O阻塞较多,针对量化交易的编程范式,协程异步是较轻和方便的,特别是涉及高频交易。 一个是使用websocket,一个是使用协程异步,所以我们用aiohttp来解决这个问题,以下以火币ticker数据来做示例,主要是因为太方便了,不用翻墙也不用放到云服务器即可。 直接上代码块了,加了回调是为了后期策略模块中的使用,暂时可以忽略不计。
import aiohttp
import asyncio
import json
import zlib
async def aiohttp_webs(callback):
session = aiohttp.ClientSession()
async with session.ws_connect( "wss://api.hadax.com/ws") as ws:
channel = {'sub': 'market.btcusdt.depth.step1', 'id': 1}
await ws.send_json(channel)
async for message in ws:
data = message.data
msg = json.loads(zlib.decompress(data, 31))
if 'ping' in msg:
await ws.send_json({'pong': msg['ping']})
else:
print(msg)
async def done_callback(mes):
print(mes)
loop = asyncio.get_event_loop()
loop.run_until_complete(aiohttp_webs(done_callback))
|