python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python-okx 搭建自动化交易

python-okx 搭建自动化交易的实现示例(从模拟盘下单到均线策略)

作者:蒋闯中Errol

本文介绍使用python-okx库实现OKX交易所的自动化交易,包括模拟盘密钥配置、API签名机制、REST与WebSocket双接口调用、instId单位与精度处理、双均线交叉策略实现,感兴趣的可以了解一下

python-okx 是 OKX v5 REST 与 WebSocket API 的 Python 客户端,几行代码即可打通行情获取、下单撤单与持仓管理链路,适合希望用 Python 实现 OKX 自动化交易的开发者。

最短可运行路径

准备密钥并理解 OKX API 签名

在 OKX 控制台为模拟盘单独创建一组密钥,与实盘密钥分开管理。请求需要 api_key、secret、passphrase 三要素,签名过程已由库内部完成:okxclient.py 在每次私有请求前,将时间戳、请求方法、请求路径与请求体拼接,用 HMAC-SHA256 加 secret 生成摘要,再写入 OK-ACCESS-SIGN 等请求头。业务代码只需要传密钥,不需要手工处理签名细节。行情类公共接口则完全不需要密钥。

发出第一笔模拟盘订单

安装依赖 pip install python-okx 之后,初始化 TradeAPI 并调用 place_order 即可。其中 flag='1' 表示模拟盘、'0' 表示实盘,建议先用 1。place_order 的参数与 OKX v5 下单接口一一对应,必传项为交易标的、保证金模式、买卖方向、订单类型与数量:

import okx.Trade as Trade

trade_api = Trade.TradeAPI(
    api_key='your-api-key',
    api_secret_key='your-api-secret',
    passphrase='your-passphrase',
    flag='1',  # 1 = 模拟盘, 0 = 实盘
)

result = trade_api.place_order(
    instId='BTC-USDT',
    tdMode='cash',
    side='buy',
    ordType='market',
    sz='1',
)
print(result)

返回值是一个列表包裹的结果结构,顶层 code 为 '0' 表示请求成功,data[0] 中携带 ordId 与 sCode、sMsg。判断是否真正成交时应同时检查这两处,而不是只看 HTTP 层面有没有抛异常。

四个核心模块的分工

模块路径职责
TradeAPITrade.py下单、撤单、改单、批量下单,以及订单与成交明细查询
AccountAPIAccount.py账户余额、持仓、杠杆设置、账单与保证金查询
MarketAPIMarketData.py最新成交价、订单簿深度、K 线与历史行情
WebSocketWebSocketFactory.py公共频道行情推送与私有频道订单、持仓状态更新

REST 接口按"请求—响应"同步取数,适合低频轮询;行情订阅或需要实时感知订单状态的场景,则改用 WebSocket 模块,由交易所主动推送,省去高频轮询带来的限流风险。

instId 命名与订单类型选择

字段取值示例说明
instIdBTC-USDT现货交易对
instIdBTC-USDT-SWAP永续合约
instIdBTC-USDT-240329交割合约,尾部为交割日期
tdModecash现货模式,合约则用 cross / isolated
ordTypemarket立即按最优价成交,适合快速建仓平仓,无需传 px
ordTypelimit按指定价格挂单,必须同时传 px
ordTypepost_only只做 maker 挂单,若会立即吃单则直接被拒

需要留意的是 sz 的单位因品种而异:现货以基础币数量计,合约以张数计,下单前建议先通过 PublicData 模块查询对应品种的最小下单量与数量精度,避免因单位或精度问题被拒单。

从均线信号到下单

以双均线交叉为例,整个流程是"取 K 线 → 计算 → 决策 → 下单"的闭环:先用 MarketAPI 拉取 K 线,算出快慢两条均线,金叉发买入信号、死叉发卖出信号,信号再交给 place_order 执行。

获取 K 线数据并计算交叉

get_candlesticks 的 bar 参数控制周期(如 1H、1D),返回数组每行按时间戳、开、高、低、收、成交量排列,收盘价在第 4 位,且默认按时间倒序返回:

import okx.MarketData as MarketData

market_api = MarketData.MarketAPI(flag='1')

def ma_signal(instId, fast=5, slow=20):
    resp = market_api.get_candlesticks(instId=instId, bar='1H', limit=str(slow + 10))
    if resp['code'] != '0':
        return None
    closes = [float(row[4]) for row in resp['data']]
    fast_ma = sum(closes[-fast:]) / fast
    slow_ma = sum(closes[-slow:]) / slow
    return 'buy' if fast_ma > slow_ma else 'sell'

拿到 'buy' / 'sell' 信号后,直接调用上文初始化好的 trade_api.place_order 完成执行。策略落地时还有三条底线值得提前写进代码:单笔下单金额控制在总资金的小比例以内;开仓时通过 attachAlgoOrds 附带条件单作为止损;策略主循环设置最小间隔,K 线等公共接口连续请求之间也加入短暂延迟,避免触发频率限制。

容易踩的三个坑

后续可探索的方向

okx/websocket/ 下的 WsPublicAsync 与 WsPrivateAsync 提供了行情与订单状态的异步订阅,适合作为轮询方案的升级路径;仓库 example/ 目录中还有两份 Jupyter notebook,分别演示入门流程与合约交易,可以作为对照材料。若策略趋于复杂,再把 K 线数据落盘存储、接入回测框架,会比直接在实盘上调参稳妥得多。

到此这篇关于python-okx 搭建自动化交易的实现示例(从模拟盘下单到均线策略)的文章就介绍到这了,更多相关python-okx 搭建自动化交易内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文