欧易API接口申请教程,使用Python编写简单的量化交易脚本

admin ok快讯 2

目录导读


欧易API接口概述与核心价值

欧易(OKX)作为全球领先的数字资产交易平台,提供了强大且开放的API接口体系,允许开发者通过编程方式获取实时行情、执行交易操作、管理账户资产等,对于量化交易者而言,欧易API接口是实现自动化策略的基础,它支持RESTful与WebSocket两种协议,覆盖现货、合约、期权等多种交易品种,通过API,用户无需手动操作即可让脚本按照预设逻辑在毫秒级别完成买卖决策,大幅提升交易效率与纪律性。

欧易API接口申请教程,使用Python编写简单的量化交易脚本-第1张图片-欧易交易所

欧易API接口申请全流程

步骤1:注册与登录

访问欧易交易所官网完成账户注册,如果您尚未注册,建议通过官方渠道完成实名认证,因为部分高级API权限需要KYC等级支持。

步骤2:进入API管理页面

登录后,点击顶部导航栏“用户中心” – “API管理”,或直接通过账户设置进入API创建界面。

步骤3:创建API密钥

点击“创建API”按钮,系统会要求您选择权限范围:

  • 读取权限:获取账户余额、订单状态、行情数据(推荐勾选)
  • 交易权限:允许脚本下单、撤单(量化交易必备)
  • 提币权限:高风险操作,普通量化脚本建议不勾选

创建成功后,您将获得以下三组关键信息:

  • apiKey(公钥)
  • secretKey(私钥,仅首次显示,请妥善保存)
  • passphrase(访问密码,用于加密传输)

注意:切勿将secretKey泄露给第三方,建议将API绑定特定IP地址以增强安全性,若需欧易交易所下载最新版本APP管理密钥,可通过官网获取官方移动端。

步骤4:权限验证

在控制台可通过“测试连接”按钮验证密钥是否生效,若返回“success”,则表示API申请成功。


编程环境搭建与Python依赖安装

本教程使用Python 3.8+版本,推荐使用虚拟环境管理依赖。

# 创建项目目录
mkdir okx_quant && cd okx_quant
python -m venv venv
source venv/bin/activate  # Linux/Mac
# 或 venv\Scripts\activate  # Windows
# 安装必要库
pip install requests hashlib hmac base64 datetime
pip install python-dotenv  # 用于安全管理密钥

为简化代码,我们将密钥存储在.env文件中(请勿提交至Git):

API_KEY=你的apiKey
SECRET_KEY=你的secretKey
PASSPHRASE=你的passphrase

Python调用欧易API实现行情数据获取

以下代码演示如何通过欧易API接口获取BTC/USDT的实时价格。

import requests
import time
import hmac
import hashlib
import base64
from datetime import datetime
from dotenv import load_dotenv
import os
load_dotenv()
API_KEY = os.getenv('API_KEY')
SECRET_KEY = os.getenv('SECRET_KEY')
PASSPHRASE = os.getenv('PASSPHRASE')
base_url = 'https://www.okx.com'
def get_timestamp():
    return datetime.utcnow().isoformat()[:-3] + 'Z'
def sign(message, secret_key):
    mac = hmac.new(bytes(secret_key, encoding='utf-8'), bytes(message, encoding='utf-8'), digestmod=hashlib.sha256)
    return base64.b64encode(mac.digest()).decode('utf-8')
def get_public_request(uri):
    url = base_url + uri
    response = requests.get(url)
    return response.json()
def get_private_request(uri, method='GET', body=''):
    timestamp = get_timestamp()
    message = timestamp + method + uri + body
    signature = sign(message, SECRET_KEY)
    headers = {
        'OK-ACCESS-KEY': API_KEY,
        'OK-ACCESS-SIGN': signature,
        'OK-ACCESS-TIMESTAMP': timestamp,
        'OK-ACCESS-PASSPHRASE': PASSPHRASE,
        'Content-Type': 'application/json'
    }
    url = base_url + uri
    response = requests.get(url, headers=headers) if method == 'GET' else requests.post(url, data=body, headers=headers)
    return response.json()
# 获取BTC/USDT现货行情
public_uri = '/api/v5/market/ticker?instId=BTC-USDT'
ticker_data = get_public_request(public_uri)
print("当前BTC价格:", ticker_data['data'][0]['last'])

运行上述代码,控制台将打印出实时价格,该代码中的签名算法(HMAC-SHA256)是欧易API的通用安全机制,适用于所有需要身份验证的请求。


编写简单的自动化交易脚本

案例:基于移动平均线的网格交易

以下脚本实现一个基础逻辑:当价格低于5日移动平均线(MA5)时买入,高于MA5时卖出。注意:此为演示脚本,实际使用需增加更多过滤与风控。

import pandas as pd
import time
def get_candles(symbol='BTC-USDT', bar='5m', limit=100):
    uri = f'/api/v5/market/candles?instId={symbol}&bar={bar}&limit={limit}'
    data = get_public_request(uri)
    candles = []
    for item in data['data']:
        candles.append({
            'timestamp': int(item[0]),
            'open': float(item[1]),
            'high': float(item[2]),
            'low': float(item[3]),
            'close': float(item[4]),
            'vol': float(item[5])
        })
    return pd.DataFrame(candles)
def place_order(symbol, side, sz, td_mode='cash'):
    uri = '/api/v5/trade/order'
    body = {
        'instId': symbol,
        'tdMode': td_mode,
        'side': side,
        'ordType': 'market',
        'sz': str(sz)
    }
    return get_private_request(uri, method='POST', body=str(body).replace("'", '"'))
# 主循环(每5分钟执行一次)
while True:
    df = get_candles()
    ma5 = df['close'].rolling(5).mean().iloc[-1]
    current_price = df['close'].iloc[-1]
    if current_price < ma5 * 0.99:  # 跌破MA5 1%则买入
        print("触发买入信号")
        result = place_order('BTC-USDT', 'buy', 0.001)
        print(result)
    elif current_price > ma5 * 1.01:  # 涨破MA5 1%则卖出
        print("触发卖出信号")
        # 获取持仓
        hold_uri = '/api/v5/account/balance?ccy=BTC'
        balance_data = get_private_request(hold_uri)
        btc_balance = float(balance_data['data'][0]['details'][0]['availBal'])
        if btc_balance > 0.0001:
            result = place_order('BTC-USDT', 'sell', btc_balance)
            print(result)
    else:
        print("无交易信号")
    time.sleep(300)  # 暂停5分钟

脚本中所有涉及交易的操作均通过欧易API接口实现,市场订单类型(ordType)选择“market”可确保快速成交,关于欧易交易所下载的移动端,您可配合脚本进行双端监控。


脚本风险控制与异常处理策略

量化交易的核心是风险管理,以下是本脚本建议加入的防御措施:

  1. 限频调用:欧易API对每个endpoint有速率限制(如REST API每秒最多调用20次),建议在请求间添加time.sleep(0.1)
  2. 资产阈值保护:设置每日最大亏损额度或单笔交易金额上限,防止黑天鹅事件。
  3. 订单状态检查:下单后及时查询订单是否成交,避免因网络延迟导致重复提交。
  4. 错误重试机制:捕获请求异常(如requests.exceptions.RequestException),最多重试3次。
def safe_request(func, retries=3):
    for i in range(retries):
        try:
            return func()
        except Exception as e:
            print(f"请求异常: {e}, 第{i+1}次重试")
            time.sleep(1)
    return None

将上述装饰器应用于关键API调用,能显著提升脚本稳定性,若您想深入学习更多策略,可参考欧易交易所官方API文档中的技术指标与合约接口。


常见问题解答(FAQ)

Q1:API密钥创建后无法获取账户余额?
A:请检查密钥权限是否勾选了“读取权限”,并在.env文件中正确填写信息,部分测试网API和生产环境API不通用,请确认请求的base_url正确。

Q2:运行脚本时出现“signature mismatch”错误?
A:时间戳不一致导致,请确保本地系统时间与NTP服务器同步(误差不超过30秒),且签名消息中的timestamp格式为ISO 8601(如2025-04-01T12:00:00.000Z)。

Q3:如何避免脚本频繁触发交易?
A:可以在下单函数内增加状态锁,例如使用全局变量last_trade_time,只有距离上次交易超过30分钟才允许再次执行。

Q4:是否可以用API进行合约交易?
A:可以,只需将实例ID(instId)改为合约格式(如BTC-USD-250418),并将交易模式(tdMode)由“cash”调整为“cross”或“isolated”,需注意合约交易具有更高杠杆风险。

Q5:获取行情数据时返回空数组?
A:检查币对名称是否准确,如BTC/USDT在欧易系统中写作BTC-USDT(短横线连接),且现货与永续合约的instId命名不同。

标签: Python量化脚本

抱歉,评论功能暂时关闭!