python-okx 搭建自动化交易的实现示例(从模拟盘下单到均线策略)
作者:蒋闯中Errol
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 层面有没有抛异常。
四个核心模块的分工
| 模块 | 路径 | 职责 |
|---|---|---|
| TradeAPI | Trade.py | 下单、撤单、改单、批量下单,以及订单与成交明细查询 |
| AccountAPI | Account.py | 账户余额、持仓、杠杆设置、账单与保证金查询 |
| MarketAPI | MarketData.py | 最新成交价、订单簿深度、K 线与历史行情 |
| WebSocket | WebSocketFactory.py | 公共频道行情推送与私有频道订单、持仓状态更新 |
REST 接口按"请求—响应"同步取数,适合低频轮询;行情订阅或需要实时感知订单状态的场景,则改用 WebSocket 模块,由交易所主动推送,省去高频轮询带来的限流风险。
instId 命名与订单类型选择
| 字段 | 取值示例 | 说明 |
|---|---|---|
| instId | BTC-USDT | 现货交易对 |
| instId | BTC-USDT-SWAP | 永续合约 |
| instId | BTC-USDT-240329 | 交割合约,尾部为交割日期 |
| tdMode | cash | 现货模式,合约则用 cross / isolated |
| ordType | market | 立即按最优价成交,适合快速建仓平仓,无需传 px |
| ordType | limit | 按指定价格挂单,必须同时传 px |
| ordType | post_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 线等公共接口连续请求之间也加入短暂延迟,避免触发频率限制。
容易踩的三个坑
- 签名或时间戳报错:常见现象是返回签名错误或时间戳非法,多因本地时钟与服务器偏差过大。对策是先把系统时钟同步到 NTP 时间源,再谈其他排查。
- 模拟盘与实盘密钥混用:模拟盘创建的密钥只对
flag='1'有效,拿去实盘调用会直接鉴权失败。对策是两套密钥物理隔离,并在配置里显式标注用途。 - 数量单位与精度误用:现货
sz按币数、合约按张数,且不同品种的最小下单量与精度不同,填错会导致拒单或仓位偏差。对策是下单前先拉取该品种的合约详情做校验。
后续可探索的方向
okx/websocket/ 下的 WsPublicAsync 与 WsPrivateAsync 提供了行情与订单状态的异步订阅,适合作为轮询方案的升级路径;仓库 example/ 目录中还有两份 Jupyter notebook,分别演示入门流程与合约交易,可以作为对照材料。若策略趋于复杂,再把 K 线数据落盘存储、接入回测框架,会比直接在实盘上调参稳妥得多。
到此这篇关于python-okx 搭建自动化交易的实现示例(从模拟盘下单到均线策略)的文章就介绍到这了,更多相关python-okx 搭建自动化交易内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
