使用 Python 实现加密货币自动化交易:通过 API 获取合约行情详解

·

在加密货币交易中,自动化交易策略能够帮助投资者更高效地捕捉市场机会。本文将深入介绍如何通过 Python 调用交易所 API 实现自动化交易,重点讲解基类的设计与使用,并以获取合约行情为例演示具体操作。

基类代码解析

在构建自动化交易系统时,设计一个稳健的基类至关重要。OkexBaseClient 类封装了与交易所 API 交互的基本操作,包括请求签名、参数构建和 HTTP 方法处理。

初始化设置

类初始化时需要传入 API 密钥和密钥,代理参数可选:

class OkexBaseClient(object):
    def __init__(self, key, secret, proxies=None):
        self.URL = "{0:s}://{1:s}/{2:s}".format(PROTOCOL, HOST, VERSION)
        self.KEY = key
        self.SECRET = secret
        self.PROXIES = proxies

核心方法功能

@property
def _nonce(self):
    return str(int(time.time() * 1000))

def _build_parameters(self, parameters):
    keys = list(parameters.keys())
    keys.sort()
    return '&'.join(["%s=%s" % (k, parameters[k]) for k in keys])

def _sign_payload(self, payload):
    sign = ''
    for key in sorted(payload.keys()):
        sign += key + '=' + str(payload[key]) +'&'
    data = sign+'secret_key='+self.SECRET
    return hashlib.md5(data.encode("utf8")).hexdigest().upper()

除非 API 发生重大改版,这个基类通常不需要修改,可以直接在项目中引用。

发送 GET 请求实战示例

基类封装完成后,我们可以基于它构建具体的功能方法。以获取合约行情为例,演示完整的 API 调用流程。

获取合约行情实现

首先需要在代码中定义相关的 URL 常量和路径:

PROTOCOL = "https"
HOST = "www.okex.com/api"
VERSION = "v1"
PATH_TICKER = "future_ticker.do"  # 获取合约行情的接口路径

然后创建继承自基类的客户端类,并添加特定功能方法:

class OkexClient(OkexBaseClient):
    """
    用于 Okex.com API 的客户端类
    API 文档参见:https://www.okex.com/rest_api.html
    """
    def ticker(self, symbol, contract_type):
        return self._get(self.url_for(PATH_TICKER, 
                        parameters={'symbol': symbol, 
                                   'contract_type': contract_type}))

这个 ticker 方法发送一个简单的 GET 请求,向服务器请求指定合约的行情数据。

方法调用演示

在命令行中可以直接测试这个功能:

>>> from client import OkexClient
>>> client = OkexClient(None, None)
>>> client.ticker('btc_usd', 'this_week')

返回结果分析

调用成功后会返回类似如下的 JSON 数据:

{
    u'date': u'1533958338', 
    u'ticker': {
        u'sell': 6071.2, 
        u'day_low': 0, 
        u'buy': 6067.81, 
        u'last': 6067.81, 
        u'contract_id': 201808170000013, 
        u'vol': 3116946, 
        u'high': 6496.21, 
        u'low': 5950, 
        u'unit_amount': 100, 
        u'coin_vol': 0, 
        u'day_high': 0
    }
}

返回数据中的 date 字段是 Unix 时间戳格式(秒为单位),可以通过 Python 的 datetime 模块进行转换处理。1533958338 对应的时间是 2018年8月11日 11:32:18。

👉 查看实时行情获取工具

常见问题

如何获取 API 密钥和密钥?

通常需要在交易所的网站个人中心创建 API 密钥,生成时会同时提供 key 和 secret,请妥善保管 secret,它只会在生成时显示一次。

请求返回错误状态码怎么办?

首先检查 API 密钥是否正确,然后验证参数格式是否符合 API 文档要求。常见的错误包括权限不足、参数缺失或格式错误。

Unix 时间戳如何转换为可读时间?

可以使用 Python 的 datetime 模块:datetime.datetime.fromtimestamp(1533958338),或者使用在线转换工具进行快速查验。

为什么要对请求进行签名?

签名是为了确保请求的完整性和安全性,防止请求在传输过程中被篡改。交易所通过验证签名来确认请求的合法性。

自动化交易有哪些风险?

包括技术风险(API 故障、网络延迟)、市场风险(价格波动)和系统风险(交易所系统维护)。建议先使用模拟环境进行充分测试。

总结

本文详细介绍了通过 Python 实现加密货币自动化交易的基础搭建过程,从基类设计到具体的 API 调用示例。掌握这些基础知识后,您可以进一步开发更复杂的交易策略,如趋势跟踪、套利交易或做市策略。

记得在实际交易前充分测试所有功能,并始终注意风险管理。👉 获取更多自动化交易策略