现货连接器 v2.1¶
前提条件¶
在开始设置现货连接器之前,请确保您的系统上已安装 Hummingbot 源码版本。请按照 Hummingbot 安装指南 中提供的详细说明进行操作。
API 清单¶
| 端点(Endpoint) | 必需 | 类型 | 描述 |
|---|---|---|---|
| 获取活跃交易市场 | 是 | 公共 REST | 获取活跃交易对列表的端点(有时称为“代币信息”)。 (示例) |
| 获取最新成交价格 | 是 | 公共 REST | |
| 获取订单簿快照 | 是 | 公共 REST | |
| [TR] 最小名义金额 | 条件性 | 公共 REST | 获取交易规则的端点。 (示例) |
| [TR] 最小订单数量 | 条件性 | 公共 REST | 获取交易规则的端点。 (示例) |
| [TR] 最小价格 | 条件性 | 公共 REST | 获取交易规则的端点。 (示例) |
| [TR] 订单增量 | 条件性 | 公共 REST | 获取交易规则的端点。 (示例) |
| PING 端点 | 是 | 公共 REST | 通常,任何返回信息量较少的端点都可以用于此目的,但 ping 或时间端点是最理想的。 (示例) |
| 获取账户余额 | 是 | 私有 REST | 获取当前账户余额的端点。 (示例) |
| 通过客户端订单 ID 获取订单状态 | 条件性 | 私有 REST | |
| 通过 exchange_order_id 获取订单状态 | 条件性 | 私有 REST | |
| 通过订单 ID 获取交易历史 | 条件性 | 私有 REST | |
| 按时间戳获取交易历史 | 条件性 | 私有 REST | |
| 获取未成交订单 | 是 | 私有 REST | 获取活跃订单的端点 (示例) |
| 创建订单 | 是 | 私有 REST | 创建新订单的端点 (示例) |
| 使用 client_order_id 创建订单 | 条件性 | 私有 REST | 创建新订单的端点 (示例) |
| 通过 exchange_order_id 取消订单 | 是 | 私有 REST | |
| 通过客户端订单 ID 取消订单 | 条件性 | 私有 REST | |
| 订单簿频道(最小深度 100) | 是 | 公共 Websocket | 公开订单频道 (示例) |
| 订单簿差异频道 | 条件性 | 公共 Websocket | 公开订单频道 (示例) |
| 用户订单/交易频道 | 是 | 私有 Websocket | 私有订单更新频道 (示例) 私有订单更新频道 (示例)] |
| 用户余额频道(总余额和可用余额) | False | 私有 Websocket | 私有余额事件频道(如果不存在,则需要配置连接器以根据其活动估算余额) (示例) |
| 身份验证 | 是 | 其他 | 提供 Web 助手逻辑的类,以正确配置对交易所(私有端点)的身份验证请求。它应该是 AuthBase 的子类 (示例) |
| 速率限制 | 是 | 其他 | 每个端点应用的速率限制以及每个 IP/连接的全局限制的文档说明。 (示例) |
| 服务器时间 | 条件性 | 公共 REST |
目录设置¶
连接器¶
在 hummingbot/hummingbot/connector/exchange 目录下创建名为 connector_name 的 connector 文件夹。
注意
connector_name = 连接器名称的小写形式,如有需要则用下划线分隔。
-
无下划线示例:
binance -
含下划线示例:
crypto_com
在 connector 文件夹 中创建以下文件:
- init.py
connector_name_api_order_book_data_source.pyconnector_name_api_user_stream_data_source.pyconnector_name_auth.pyconnector_name_constants.pyconnector_name_exchange.pyconnector_name_order_book.pyconnector_name_utils.pyconnector_name_web_utils.py- dummy.pxd
- dummy.pyx
测试¶
在 hummingbot/test/hummingbot/exchange 目录下创建名为 connector_name 的 test 文件夹。
在 test 文件夹 中创建以下文件:
- init.py
- test_
connector_name_api_order_book_data_source.py - test_
connector_name_api_user_stream_data_source.py - test_
connector_name_auth.py - test_
connector_name_exchange.py - test_
connector_name_order_book.py - test_
connector_name_utils.py - test_
connector_name_web_utils.py
构建流程¶
常量¶
向常量文件中添加以下变量
-
默认域名:检查是否需要添加多个域名,该常量将用于 web_utils 中生成路径 URL。 -
REST_URLS:可以像 ByBit 连接器那样是字典,也可以像 Binance 连接器那样是 f-string,DEFAULT DOMAIN变量将用于选择正确的 URL。 -
速率限制 -
SERVER_TIME_PATH_URL:检查交易所是否要求您的时间戳与服务器时间同步。
网络工具¶
connector_name_web_utils.py 文件- 复制 Binance 连接器的 web_utils 文件。
- 将 Binance 替换为
connector_name,首字母大写。 - 将 binance 替换为
connector_name。 - 编码函数以创建 rest URL,检查是否需要公共和私有 URL,或仅需其中之一。
- 如果需要时间同步:
- 确认你拥有
build_api_factory_without_time_synchronizer_pre_processor函数。 - 检查
get_current_server_time函数是否需要修改(可能需要从响应中提取服务器时间)。 - 使用时间同步器作为 rest_pre_processor 来编码
build_api_factory函数。
- 确认你拥有
- 如果不需要时间同步:
- 删除与时间同步相关的文件,并在不使用时间同步器的情况下编码
build_api_factory函数。
- 删除与时间同步相关的文件,并在不使用时间同步器的情况下编码
工具模块¶
- 在
connector_name_utils.py 文件中编码- 复制 Binance 连接器的 utils 文件。
- 将 Binance 替换为
connector_name,首字母大写。 - 将 binance 替换为
connector_name。 - 使用适当值替换
DEFAULT_FEES。 - 检查是否需要连接其他域名,否则删除相关代码。
订单簿¶
-
connector_name_order_book.py- 复制 Binance 连接器的 order book 文件。
- 将
connector_name中的 Binance 替换为首字母大写的形式。 - 将
connector_name替换为 binance。
目前我们不会实现任何方法,这一步的唯一目的是因为我们需要在
connector_name_api_order_book_data_source.py 中导入这个类,且不希望出现错误。
订单簿数据源¶
-
connector_name_api_order_book_data_source.py- 复制 Binance 连接器的订单簿数据源文件。
- 将
connector_name中的 Binance 替换为首字母大写的形式。 - 将
connector_name替换为 binance。 - 使用适当的值替换
HEARTBEAT_TIME_INTERVAL。
-
test_
connector_name_api_order_book_data_source.py- 复制 Binance 订单簿数据源文件的测试文件。
- 将
connector_name中的 Binance 替换为首字母大写的形式。 - 将
connector_name替换为 binance。
现在我们将开始以测试驱动开发(TDD)的方式实现订单簿数据源的功能。
-
方法开发
-
REST
orderbook- test_get_new_order_book_successful
- _order_book_snapshot
- _request_order_book_snapshot
-
ExchangeOrderBook.snapshot_message_from_exchange - test_get_new_order_book_raises_exception
-
WEBSOCKET
-
listen_for_subscriptions- test_listen_for_subscriptions_subscribes_to_trades_and_order_diffs
- listen_for_subscriptions
- _subscribe_channels
- _process_websocket_messages
- test_listen_for_subscriptions_raises_cancel_exception
- test_listen_for_subscriptions_logs_exception_details
- test_subscribe_channels_raises_cancel_exception
- test_subscribe_channels_raises_exception_and_logs_error
-
监听交易- test_listen_for_trades_successful
- listen_for_trades
- _parse_trade_message
- test_listen_for_trades_cancelled_when_listening
- test_listen_for_trades_logs_exception
-
监听订单簿差异- test_listen_for_order_book_diffs_successful
- listen_for_order_book_diffs
- _parse_order_book_diff_message
- test_listen_for_order_book_diffs_cancelled
- test_listen_for_order_book_diffs_logs_exception
-
监听订单簿快照- test_listen_for_order_book_snapshots_cancelled_when_fetching_snapshot
- listen_for_order_book_snapshots
- _parse_order_book_snapshot_message
- test_listen_for_order_book_snapshots_log_exception
- test_listen_for_order_book_snapshots_successful
-
-
认证¶
-
connector_name_auth.py- 复制 Binance 连接器的认证文件。
- 将
connector_name中的 Binance 替换为首字母大写的形式。
-
test_connector_name_auth.py- 复制 Binance 认证文件的测试文件。
- 将
connector_name中的 Binance 替换为首字母大写的形式。 -
将
connector_name替换为 binance。 -
方法开发
- REST
rest_authenticate-
test_rest_authenticate -
rest_authenticate -
add_auth_to_params -
header_for_authentication -
_generate_signature
-
- WEBSOCKET
-
ws_authenticate
-
- REST
用户流数据源¶
-
connector_name_api_user_stream_data_source.py- 复制 Binance 连接器的用户流数据源文件。
- 将
connector_name中的 Binance 替换为首字母大写的形式。 - 将
connector_name替换为 binance。 - 使用适当的值替换
HEARTBEAT_TIME_INTERVAL。 - 检查是否需要
LISTEN_KEY_KEEP_ALIVE_INTERVAL。
-
test_
connector_name_api_user_stream_data_source.py- 复制 Binance 用户流数据源文件的测试。
- 将
connector_name中的 Binance 替换为首字母大写的形式。 - 将
connector_name替换为 binance。
现在我们将开始以测试驱动开发(TDD)的方式实现用户流数据源的功能。
- 方法开发
- WEBSOCKET
-
如果需要监听密钥:
- test_get_listen_key_log_exception
- _get_listen_key
- test_get_listen_key_successful
- test_ping_listen_key_log_exception
- _ping_listen_key
- test_ping_listen_key_successful
- test_manage_listen_key_task_loop_keep_alive_failed
- _manage_listen_key_task_loop
- test_manage_listen_key_task_loop_keep_alive_successful
-
listen_for_user_stream- test_listen_for_user_stream_get_listen_key_successful_with_user_update_event
- listen_for_user_stream (位于父类中)
- _connected_websocket_assistant
- _subscribe_channels
- _get_ws_assistant
- _on_user_stream_interruption
- test_listen_for_user_stream_does_not_queue_empty_payload
- test_listen_for_user_stream_connection_failed
- test_listen_for_user_stream_iter_message_throws_exception
-
- WEBSOCKET
交易所¶
-
connector_name_exchange.py- 复制 Binance 连接器的交易所文件。
- 将
connector_name中的 Binance 替换为首字母大写的形式。 - 将
connector_name替换为 binance。
-
test_
connector_name_exchange.py- 复制 Binance 交易所文件的测试代码。
- 将
connector_name中的 Binance 替换为首字母大写的形式。 -
将
connector_name替换为 binance。 -
方法开发
-
许多测试已经存在于通用测试类中!但你需要实现一些方法才能使其正常运行。
- 通用测试类所需的方法
- all_symbols_request_mock_response
- latest_prices_request_mock_response
- all_symbols_including_invalid_pair_mock_response
- network_status_request_successful_mock_response
- trading_rules_request_mock_response
- trading_rules_request_erroneous_mock_response
- order_creation_request_successful_mock_response
- balance_request_mock_response_for_base_and_quote
- balance_request_mock_response_only_base
- balance_event_websocket_update
- expected_latest_price
- expected_supported_order_types
- expected_trading_rule
- 预期的错误交易规则日志错误
- 预期的交易所订单 ID
- 服务器是否同步执行取消请求
- 状态更新中是否包含订单成交的 HTTP 更新
- 是否在 WebSocket 订单事件处理期间执行订单成交的 HTTP 更新
- 预期的部分成交价格
- 预期的部分成交数量
- 预期的成交手续费
- 预期的成交交易 ID
- 代币的交易所符号
- 创建交易所实例
- 验证认证凭据是否存在
- 验证订单创建请求
- 验证订单取消请求
- 验证订单状态请求
- 验证交易记录请求
- 配置成功的取消响应
- 配置错误的取消响应
- 配置一个成功一个失败的全部取消响应
- 配置完全成交订单的状态响应
- 配置已取消订单的状态响应
- 配置错误的 HTTP 成交交易响应
- 配置未完成订单的状态响应
- 配置 HTTP 错误订单状态响应
- 配置部分成交订单的状态响应
- 配置部分成交交易响应
- 配置完全成交交易响应
- 新订单的订单事件 WebSocket 更新
- 已取消订单的订单事件 WebSocket 更新
- 完全成交订单事件的 WebSocket 更新
-
完全成交交易事件的 WebSocket 更新
-
需实现的 ExchangePyBase 方法
- 认证器
- 名称
- 限速规则
- 域名
- 客户端订单 ID 最大长度
- 客户端订单 ID 前缀
- 交易规则请求路径
- 交易对请求路径
- check_network_request_path
- 交易对
- 是否取消请求在交易所同步
- 是否需要交易
- 支持的订单类型
- _is_request_exception_related_to_time_synchronizer
- _create_web_assistants_factory
- _create_order_book_data_source
- _create_user_stream_data_source
- _get_fee
- _place_order
- _place_cancel
- _format_trading_rules
- _status_polling_loop_fetch_updates
- _update_trading_fees
- _user_stream_event_listener
- _all_trade_updates_for_order
- _request_order_status
- _update_balances
- _get_last_traded_price
- _initialize_trading_pair_symbols_from_exchange_info
-
更新时间同步器- 测试更新时间同步器成功
- _update_time_synchronizer
- ... [其他方法]
- 测试时间同步器相关请求错误检测
-
更新订单成交记录- 测试从交易中更新订单成交记录会触发已成交事件
- _update_order_fills_from_trades
- ... [其他方法]
- 测试从交易中更新订单成交记录时,重复的成交仅触发一次事件
-
更新订单状态- 测试更新订单状态失败时的情况
- _update_order_status
-
_user_stream_event_listener- 测试用户流更新订单失败事件
- _user_stream_event_listener
-
-
将
connector_name_api_key和connector_name_api_secret添加到conf_global_TEMPLATE.yml