跳至内容

Hummingbot 架构 - 第二部分

引言

在本系列的上一篇文章《Hummingbot 架构 - 第一部分》中,我们讨论了 Hummingbot 的设计动机、时钟机制以及市场连接器。今天,我们将探讨交易策略背后的架构——这一组件正是决定 Hummingbot 如何使用您的资金进行交易的核心。我们还将讨论如何在实盘交易中诊断问题并调试 Hummingbot。

策略

如果说市场连接器是 Hummingbot 的手和眼睛,那么策略就是 Hummingbot 的大脑。策略对象负责处理市场信号,并决定何时在市场上下单或撤单。

本文将以 Avellaneda & Stoikov 做市策略为例展开讨论。

像看电影一样观察市场

每个策略类都是 TimeIterator 类的子类——这意味着在正常的实盘交易中,其 c_tick() 函数每秒被调用一次。每次调用 c_tick() 时,策略对象都应基于最新的市场信息进行观察,并决定下一步操作。

你可以想象策略对象就像在观看一部电影,每一秒就是电影的一帧画面——它持续不断地根据“电影”中的新进展做出决策。

请看下面 Hummingbot 中 Avellaneda & Stoikov 做市策略的 c_tick() 函数:

以下是该策略在正确初始化后,每秒所执行操作的概览。

  1. 第 412 行 - 执行市场观察并更新指标

    该函数对市场价格变动和交易员账户当前持仓情况进行观察。具体来说,它会更新价格波动率的滞后指标 _avg_vol,并按周期根据 Avellaneda & Stoikov 论文中的描述更新 _gamma_kappa_eta 参数。

  2. 第 415 行 - 检查时间戳以判断是否创建新订单

    此行查看当前系统时间,判断是否到了在市场上创建新订单的时机。

  3. 第 424 行 - 决定下单价格(如果需要下单)

    该行根据上述计算出的指标和参数,计算用于创建做市订单的价格。

  4. 第 426 至 433 行 - 创建一个中间订单提案,用于后续下单

    中间订单提案指定了待创建订单的价格、数量和方向。但此时尚未考虑市场上是否已存在类似的活跃订单。

  5. 第 435 行 - 撤销已过期的活跃订单,或当新订单提案价格与现有订单不一致时撤销

  6. 第 438 至 443 行 - 执行订单提案

    这些行执行前述逻辑生成的订单提案——向交易所发送订单并对其进行跟踪。

读取价格和订单簿

如果你手动追踪 Avellaneda & Stoikov 策略代码中的 get_price()get_mid_price() 函数,你会发现它们最终指向模块 hummingbot.core.data_type.order_book 中的 OrderBook.c_get_price()

OrderBook 类用于跟踪实时订单簿信息,包括买卖双方的深度、交易和价格,适用于实盘交易所。每个交易所市场的交易对都会拥有一个独立的订单簿。由于许多后置指标通常依赖价格和订单簿深度作为基本输入,因此在每次 c_tick() 迭代中,策略读取的数据往往首先就包含订单簿信息。

后置指标

复杂的交易策略除了当前价格或订单簿深度外,通常还需要一些市场后置指标来辅助决策。这包括大多数技术分析指标,例如 EMA、MACD 和布林带。在 Avellaneda & Stoikov 策略示例中,对象 self._avg_volAverageVolatilityIndicator 的实例,用于衡量近期价格波动率,属于一种后置指标。

让我们来看看它是如何从策略代码中收集新样本的。每次调用 c_tick() 时,c_collect_market_variables() 都会通过 self._avg_vol.add_sample(price) 将最新价格发送给 self._avg_vol

当你查看计算后置指标值的相关代码时,会发现 AverageVolatilityIndicator 会存储固定数量的价格样本,并输出该时间窗口内价格的平滑标准差统计结果。

如果你想编写自定义指标,可以像上面一样继承自 BaseTrailingIndicator,并实现自己的采样和计算逻辑。

社区与开发者友好性

Hummingbot 从设计之初就充分考虑了开发者的需要。加密货币市场不断变化——无论是交易所提供的服务和 API,还是市场参与者及其行为模式——都处于持续变动之中。而开发者恰恰最能适应这种环境,因为他们可以根据市场变化灵活调整和优化自己的策略及连接器代码。

调试控制台

当你开发新的连接器或新策略时,能够观察代码的详细运行行为并在问题发生时进行诊断至关重要。日志功能是开发者可用的一种工具,而 Hummingbot 开发者工具箱中的另一利器则是调试控制台。

Hummingbot 调试控制台默认是关闭的,需要通过编辑 conf/conf_global.py 文件并将 debug_console 设置为 true 来启用。

启用后,你可以通过 telnet 连接到 localhost:8211,访问一个交互式的 Python 控制台,该控制台与正在运行的 Hummingbot 实例共享相同的内存空间。例如,你可以检查当前运行策略对象的实时属性,查看其已创建并正在跟踪的活跃订单。

你可以在 Hummingbot 文档 中了解更多关于调试控制台的信息。

Discord 频道

我们的 Discord 服务器 是寻找其他 Hummingbot 开发者的理想场所,他们可能正像你一样,开发自己的策略、指标或市场连接器。我们设有多个面向开发者的频道,你可以在其中获得社区支持,学习如何对 Hummingbot 进行个性化修改。

贡献

最后,如果你希望报告 Hummingbot 的问题或贡献代码,可以访问我们的 GitHub 页面:https://github.com/hummingbot/hummingbot