python-okx 实战:从密钥配置到 WebSocket 行情,OKX v5 交易系统的完整路径 python-okx 实战从密钥配置到 WebSocket 行情OKX v5 交易系统的完整路径【免费下载链接】python-okx项目地址: https://gitcode.com/GitHub_Trending/py/python-okxpython-okx 是 OKX API v5 的 Python 封装库覆盖交易所 REST 交易接口与 WebSocket 行情通道并统一处理请求签名、测试网切换等底层细节。读完本文你能用几十行 Python 代码写出从行情查询、现货限价单、合约平仓到实时行情订阅的完整链路。 项目能力全景职责域模块边界说明交易执行okx/Trade.py下单、撤单、改单、平仓订单与成交明细查询批量下单行情获取okx/MarketData.pyTicker、深度、K线、成交明细全部为公共接口、免密钥账户与风控okx/Account.py余额、持仓、杠杆设置、最大可下单量资金与多账户okx/Funding.py、okx/SubAccount.py主账户余额与划转、子账户列表、子账户间转账实时推送okx/websocket/公共/私有频道订阅多路复用内置断线检测与事件推送算法产品okx/Grid.py、okx/DualInvest.py 等网格策略、双币投资、定投等结构化交易相比裸调 REST核心差异在 okx/okxclient.py 的封装每个私有接口请求自动完成「时间戳 请求方法 路径 请求体」的 HMAC-SHA256 签名拼装 OK-ACCESS-* 四个请求头并附带模拟盘环境标记。你不需要手写签名只靠一个flag参数即可在演示与实盘环境间切换。另外注意业务拒绝余额不足、参数错误时 HTTP 状态码仍是 200库会原样返回{code, msg, data}结构的 JSONcode不为0才算失败。 最小可运行路径先调通一个 ticker 只读查询前提是pip install python-okxPython 3.7 以上。公共行情接口不需要 API 密钥import okx.MarketData as MarketData market_client MarketData.MarketAPI(flag1) # 1演示环境0实盘 ticker_response market_client.get_ticker(instIdBTC-USDT) print(ticker_response)预期输出关键字段{ code: 0, data: [ { instId: BTC-USDT, last: 67821.5, bidPx: 67820.1, askPx: 67821.9 } ] }环境切换只有两处REST 用flag参数1演示 /0实盘WebSocket 用连接地址演示环境换用 wspap.okx.com 域名。能看到非空的data数组说明链路已通。⚡ 按交易场景拆解实操现货限价单全流程前提条件已创建具备交易权限的 API 密钥账户有足额 USDT。import okx.Trade as Trade trade_client Trade.TradeAPI(api_key, secret_key, passphrase, flag1) order_response trade_client.place_order( instIdBTC-USDT, tdModecash, sidebuy, ordTypelimit, px65000, sz0.001 ) order_id order_response[data][0][ordId] order_status trade_client.get_order(instIdBTC-USDT, ordIdorder_id) print(order_status[data][0][state])关键参数参数含义备注tdMode交易模式现货用 cash合约用 isolated / crossordType订单类型limit / market / post_only / fok / iocpx限价限价单必填sz下单数量现货限价买入默认以计价货币计tgtCcysz 单位切换base_ccy / quote_ccy易错点下单被拒时返回的仍是正常 JSON必须显式检查code字段是否为0只靠 try/except 会把业务拒绝吞掉。确认限价单跑通后同一个 trade_client 就能处理合约仓位差别只是需要显式指定杠杆与方向。合约设置杠杆并市价平仓前提条件已开通对应合约并通过get_account_config确认了持仓模式单向 / 双向。account_client Account.AccountAPI(api_key, secret_key, passphrase, flag1) account_client.set_leverage( instIdBTC-USD-SWAP, lever10, mgnModecross, posSidelong ) trade_client.close_positions( instIdBTC-USD-SWAP, mgnModecross, posSidelong )参数含义备注mgnMode保证金模式cross全仓/ isolated逐仓posSide持仓方向仅双向持仓模式使用单向模式不传易错点单向净持仓模式下传了posSide会导致方向不匹配、平仓失败。开仓前先把lever与mgnMode调好避免盘中再调触发额外校验。行情轮询到这里已经够用但策略真正上线时你需要让行情主动推过来。用 WebSocket 订阅 tickers 频道前提条件Python 3.8asyncio 环境websockets 依赖已随库安装。import asyncio, json from okx.websocket.WsPublicAsync import WsPublicAsync async def on_tick(message: str): payload json.loads(message) if payload.get(arg, {}).get(channel) tickers: print(payload[data][0][last]) async def main(): ws_client WsPublicAsync(urlwss://ws.okx.com:8443/ws/v5/public) await ws_client.start() await ws_client.subscribe([{channel: tickers, instId: BTC-USDT}], on_tick) await asyncio.sleep(30) await ws_client.stop() asyncio.run(main())subscribe的入参是列表追加多个 channel 对象即可一次订阅多个标的。私有频道订单、资金用 WsPrivateAsync构造时多传三要素密钥并先完成登录。完整实现见 okx/websocket/。易错点start()返回的是后台收消息任务必须保存返回值否则该任务可能被回收消息会静默中断。 进阶能力与组合技巧断线重连的退避策略这一层该谁做库的consume()在检测到连接断开时会先向你的回调推一条ConnClosed错误事件然后重新抛出ConnectionClosedError——重连本身留给了调用方。设计思路是指数退避加封顶再叠加随机抖动避免多个实例同时冲击服务重连成功后必须重新订阅所有频道因为订阅关系不跨连接保留。backoff 1 while True: try: await run_ws_session() # 连接 订阅 消费 except Exception: await asyncio.sleep(backoff random.uniform(0, 1)) backoff min(backoff * 2, 60)什么时候该用7×24 常驻的生产服务。什么时候不该用跑 30 秒的临时脚本一层异常捕获就够了别为假想需求加复杂度。子账户资金调度主账户密钥可以管理一组子账户先get_subaccount_list拉取账户清单再用subAccount_transfer划转资金。froms/to指定账户层级1主账户2子账户存在多个子账户时fromSubAccount/toSubAccount必须传具体账户名。sub_client SubAccount.SubAccountAPI(api_key, secret_key, passphrase, flag1) transfer_response sub_client.subAccount_transfer( ccyUSDT, amt100, froms1, to2, fromSubAccount, toSubAccountsub1 )适合多个策略实例分仓运行、需要互相隔离资金、且策略停用后要快速把资金拉回主账户的场景单账户运行策略时这层纯属多余开销不必引入。 故障排查速查现象 / 错误码常见原因修复动作code50011 签名错误本地时钟偏差或时间戳格式不对同步系统时钟时间戳需为 ISO8601 毫秒格式code50013 API key 无效密钥未激活或未加 IP 白名单核对 key / secret / passphrase 三要素与 IP 白名单code50102 余额不足可用余额低于下单金额用get_account_balance核对演示环境需先领取模拟资金code51000 参数错误instId 格式或交易模式不匹配核对 instId 全称与 tdMode 是否对应WebSocket 1006 / ConnClosed服务端断连未收到关闭帧按退避策略重连并重新订阅全部频道通用异常处理模板try: order_result trade_client.place_order(instId..., tdMode..., ...) except Exception as exc: print(f网络层异常: {exc}) else: if order_result.get(code) ! 0: print(f业务拒绝: {order_result[code]} {order_result.get(msg)}) 延伸方向接口参数细节、完整错误码列表与演示环境地址清单以 OKX API v5 官方文档为准这是参数定义的第一参考。仓库test/unit/目录按模块拆分了单元测试test/目录有可直接改跑的真实集成用例参数组合不确定时对照测试用例最不容易出错新接口需求也可以直接在仓库提 Issue。值得继续深入的主题把 tick 与 book 频道组合维护本地订单簿再驱动网格或做市类策略的下单决策。【免费下载链接】python-okx项目地址: https://gitcode.com/GitHub_Trending/py/python-okx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考