通过 redis
提供 okex websocket
服务数据。它将 okex websocket
发过来的数据缓存在 redis
中, 程序随时提取。
-
安装 redis
-
ubuntu:
sudo apt-get install redis
-
macOS:
brew install redis
-
-
安装 okws 包
pip install okws
可以以两种方式使用:
-
运行
okws -c okws.yaml
启动服务。配置文件示例如下:# 配置文件示例 settings: REDIS_URL: "redis://localhost" # 最多保存记录数 MAX_ROW: 1000 # 侦听用户指令 LISTEN_CHANNEL: 'trade-ws' # 服务返回信息频道 REDIS_INFO_KEY: 'trade-ws/info' # 广播 okws 信息 OKWS_INFO: 'okws/info' servers: - name: test apiKey: "" secret: "" password: "" subscribes: - server: test channels: - "spot/ticker:ETH-USDT"
以上的配置,会让 okws 启动后,自动连 websocket , 命名为 test, 连接上 test 后,还会执行 subscribes 中的命令,即订阅 ETH-USDT 的 ticker 数据。
-
使用示例
import asyncio import logging import okws.aioclient as aclient logger = logging.getLogger(__name__) okex = await aclient.client() ret = await okex.open_ws('tests',{'apiKey':'','secret':'','password':''}) # 连接到 okex websockets logger.info(ret) # 等待 tests 连接完成 await asyncio.sleep(10) ret = await okex.subscribe('tests', "spot/ticker:ETH-USDT") await asyncio.sleep(1) ret = await okex.get('tests', "spot/ticker", {"instrument_id": "ETH-USDT"}) logger.info(ret)
import okws
import okws.aioclient as aclient
import asyncio
async def client():
okex = await aclient.client()
# 连接到 websocket 服务器
await okex.open_ws('tests', {'apiKey':'','secret':'','password':''})
await asyncio.sleep(1)
await okex.subscribe('tests', "spot/ticker:ETH-USDT")
# 等待服务器完成订阅和接收 ticker 数据
await asyncio.sleep(2)
ticker = await okex.get('tests', "spot/ticker", {"instrument_id": "ETH-USDT"})
print(ticker)
# okws 退出
await okex.server_quit()
# 关闭客户端
await okex.close()
await asyncio.sleep(1)
async def test_server():
await asyncio.gather(
okws.server.run(),
client()
)
if __name__ == '__main__':
asyncio.run(test_server())
-
使用
systemd
修改
okws.service
ln -s okws.service /etc/systemd/system/okws.service sudo systemctl daemon-reload sudo mkdir /var/log/okws sudo chown xxx /var/log/okws sudo systemctl start okws.service
-
MacOs
根据 okw.ex.plist 进行修改
cp okws.ex.plist ~/Library/LaunchAgents/ launchctl load okws.ex.plist
logfile:/usr/local/var/log/okws.log
-
如果要在 websocket 发送数据时获得通知,可以使用 redis 订阅
- 对于在 okex 接收到的对应频道名的数据,会相应转发到 redis 的 key 为 "okex/ws_name/频道名" 上。
- 如果 websocket 返回的是 event, 会转发到 redis 的 key 为 "okex/ws_name/event" 上。
- 用于指示当前 ws 状态,分别会将 'READY','CONNECTED','DISCONNECTED','EXIT','ON_DATA' 发送到 "okex/ws_name/status" 上。
-
K 线数据除了用类似
await okex.get('tests', "spot/candle60s", {"instrument_id": "ETH-USDT",'n':100})
取得外,也可以订阅'okex/name/spot/candle60s:instrument_id'
频道,可以在有新 K 线时得到通知。通知内容为最新确定的 K 线数据。 -
提供了一个简单的客户端用以返问 redis
的数据,用户也可以自己直接从 redis
中获取。
create_control
返回的类有以下几个函数:
-
open_ws(name, auth_params={})
连接到 okex websocket 并命名为 name
-
close_ws(name)
关闭 okex websocket 连接
-
subscribe(name, path)
订阅 websocket 数据,如:
subscribe('tests', "spot/ticker:ETH-USDT")
-
get(name, path, params={})
取得 ws 数据 如:
get('tests', "spot/ticker", {"instrument_id": "ETH-USDT"})
当取 K 线数据时,除了指定instrument_id
外,还可以加参数n
,表示最多取n
条数据。 -
servers()
取得可用的 okex websocket 连接
-
redis_clear(self, path="okex/*")
清除 redis 上的缓存数据