交易所 API 要求
API 要求¶
具有 REST API 的交易所必须提供:
- 获取交易规则的端点。(示例)
- 检查服务器状态的端点(通常任何返回少量信息的端点都可以用于此目的,但 ping 或时间端点是理想的)。(示例)
- 获取活动订单的端点。(示例)
- 创建新订单的端点。(示例)
- 获取当前账户余额的端点。(示例)
- 每个端点应用的速率限制以及每个 IP/连接的全局限制的文档。(示例)
如果 REST API 提供以下内容是有用的,但可以不提供它们来构建连接器:
- 获取活跃交易对列表的端点(这有时被称为"tokens info")。(示例)
具有 WebSocket API 的交易所必须提供:
如果 Websocket API 也提供以下内容是有用的,但可以不提供它们来构建连接器:
- 私有余额事件频道(如果不存在,则必须配置连接器以根据连接器活动估算余额)(示例)
- 交易事件包含每笔交易收取的费用详细信息(如果不存在,连接器将需要估算费用来操作)。
永续合约连接器的额外要求¶
组件¶
下面,我们描述了创建新连接器需要实现的组件。某些组件可以并行实现,但其他组件有依赖关系。
授权¶
为 web assistant 提供逻辑以正确配置到交易所(私有端点)的身份验证请求的类。它应该是 AuthBase 的子类
依赖项:无
工具¶
Utils 模块通常用于定义在连接器的多个组件中使用的函数。如果连接器在创建请求时不需要特殊行为或没有特殊逻辑来生成订单 ID,则无需添加函数。
需要在此模块中定义连接器的配置,包括:- 默认费用 - 建立连接所需的参数(例如 API 密钥和 API 密钥)。
配置必须为连接器将支持的每个域指定(所有连接器都可以处理多个域,如果配置正确)
依赖项:无
订单簿¶
OrderBook
的子类,用于定义基于数据源接收到的事件创建快照消息、差异消息和交易消息的专门方法
依赖项:无
订单簿数据源¶
OrderBookTrackerDataSource
的子类。它包含通过 websocket 接收所有公共频道更新的所有相关逻辑。该类应该包括:- 提供交易所中一个或多个交易对最新价格的逻辑 - 返回所有支持的交易对的逻辑(例如过滤掉交易所中可能被禁用的任何交易对)- 将交易对从交易所记号转换为客户端记号,以及反向转换的功能 - 获取特定交易对当前订单簿完整副本的方法 - 订阅所需公共频道以及处理接收到的所有事件的逻辑。所需的频道包括:订单簿差异和公共交易事件。它还需要定期进行订单簿完整更新(快照)的方法。
必须为连接器创建一个跟踪器类(OrderBookTracker 的子类)以启动接收事件和更新的后台进程。
示例: - https://github.com/hummingbot/hummingbot/blob/master/hummingbot/connector/exchange/binance/binance_api_order_book_data_source.py - https://github.com/hummingbot/hummingbot/blob/master/hummingbot/connector/exchange/binance/binance_order_book_tracker.py
依赖项: 订单簿(用于创建差异消息、快照消息和交易消息)
用户流数据源¶
UserStreamTrackerDataSource
的子类
该类应该包括:- 订阅私有 websocket 频道以接收订单更新、交易更新和余额更新的逻辑 - 处理每种类型事件的逻辑
必须为连接器创建一个跟踪器类(UserStreamTracker
的子类)以启动接收事件和更新的后台进程。
示例:
- https://github.com/hummingbot/hummingbot/blob/master/hummingbot/connector/exchange/binance/binance_api_user_stream_data_source.py
- https://github.com/hummingbot/hummingbot/blob/master/hummingbot/connector/exchange/binance/binance_user_stream_tracker.py
依赖项:
- 订单簿数据源(仅用于将代币对转换为交易所记号)
- 授权组件
连接器¶
ExchangeBase
的子类(用于交易所连接器)或 ConnectorBase
(用于 Gateway 连接器)。
它应该包括:
- 正确操作所需的所有连接和订阅开始和停止的逻辑。
- 确定连接器是否已准备好运行(所有连接都已建立)以及定期检查状态的方法
- 订单生命周期的功能:创建和取消。为跟踪订单并正确处理,应使用 ClientOrderTracker 的实例
- 向服务器发送 REST 请求(使用 WebAssistant)并正确处理错误结果的方法
- 定期更新交易规则的方法
- 使用 REST API 定期更新余额的逻辑(这是通过 websocket 接收更新的备份)
- 使用 REST API 定期检查订单更新的逻辑(这是通过 websocket 接收更新的备份)
- 正确处理通过用户流接收的私有频道事件的功能
依赖项:
- 订单簿数据源
- 用户流数据源
永续合约连接器的额外要求¶
对于永续合约交易所连接器,连接器组件还应继承 PerpetualTrading
,并必须包含以下功能:
- 从交易所获取当前杠杆并设置杠杆的逻辑
- 提供支持的持仓模式并在交易所中更改(如果交易所允许)
- 获取当前资金信息的方法和定期更新的逻辑
- 保持持仓状态更新的逻辑
单元测试¶
期望之前提到的所有组件都会有单元测试来验证所有方法。这与 QA 测试所做的任何验证是独立的。
所有连接器单元测试不应依赖与交易所的活动连接来执行验证。相反,与交易所的交互应该始终被模拟或仿真。这可以通过使用 aioresponses
库来实现对所有 REST 请求的模拟,以及使用 NetworkMockingAssistant
类来模拟 websocket 交互。
可以在 Binance 和 Binance 永续连接器的单元测试中找到使用示例。
Binance 连接器测试: https://github.com/hummingbot/hummingbot/tree/master/test/hummingbot/connector/exchange/binance
Binance 永续连接器测试: https://github.com/hummingbot/hummingbot/tree/master/test/hummingbot/connector/derivative
特殊考虑¶
当没有 websocket 余额事件可用时的连接器配置¶
当交易所不提供用于余额更新的 websocket 端点时,必须将连接器配置为基于连接器活动来估算余额。
- 将
_real_time_balance_update
变量设置为False
- 使用 REST API 定期更新余额的方法还应使用以下行来更新飞行订单快照:
self._in_flight_orders_snapshot = {k: copy.copy(v) for k, v in self._in_flight_orders.items()}
self._in_flight_orders_snapshot_timestamp = self.current_timestamp
作为示例,请参考 Bybit 连接器:https://github.com/hummingbot/hummingbot/blob/master/hummingbot/connector/derivative/bybit_perpetual/bybit_perpetual_derivative.py