Hummingbot 架构 - 第二部分¶
引言¶
在本系列的上一篇文章 - Hummingbot 架构 - 第一部分 中,我们讨论了 Hummingbot 的设计动机、时钟和市场连接器。今天,我们将讨论交易策略背后的架构 - 这正是决定 Hummingbot 如何用你的资金进行交易的组件。我们还将讨论如何诊断问题和调试实时交易中的 Hummingbot。
策略¶
如果市场连接器是 Hummingbot 的手和眼睛,那么策略就是 Hummingbot 的大脑。策略对象处理市场信号,并决定何时以及如何在市场上下单或撤单。
我们将以 Avellaneda & Stoikov 做市策略作为示例进行讨论。
像看电影一样观察市场¶
每个策略类都是 TimeIterator
类的子类 - 这意味着在正常的实时交易中,它的 c_tick()
函数每秒被调用一次。每次调用 c_tick()
时,策略对象都应该对最新的市场信息进行观察,并决定应该做什么。
你可以想象策略对象像看电影一样观察市场,其中每一秒就是电影的一帧 - 而它不断尝试决定如何处理电影中的任何新发展。
让我们来看看 Hummingbot 中 Avellaneda & Stoikov 做市策略的 c_tick()
函数,如下图:
以下是策略每秒执行的操作概览 - 在正确初始化之后。
-
第 412 行 - 执行市场观察并更新指标
此函数对市场上的价格行为以及交易者账户中的当前库存进行观察。具体来说,它更新价格波动追踪指标
_avg_vol
,并定期更新来自 Avellaneda & Stoikov 论文指定的_gamma
、_kappa
和_eta
参数。 -
第 415 行 - 检查创建新订单的时间戳
此行查看当前时钟时间并确定是否到了在市场上创建新订单的时间。
-
第 424 行 - 决定订单价格(如果创建订单)
此行从上面计算的指标和参数中计算创建做市订单的价格。
-
第 426 到 433 行 - 创建用于稍后创建订单的中间订单提案
中间订单提案指定了待创建订单的价格、数量和方向。但是,它们不考虑市场上是否已经存在类似的活跃订单。
-
第 435 行 - 取消过期的活跃订单,或如果新订单提案的价格与现有订单不同
-
第 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_vol
是AverageVolatilityIndicator
的一个实例,是近期价格波动率的跟踪指标。
让我们来看看它如何从策略代码中收集新样本。每次调用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 中的问题或贡献代码——我们的 Github 页面可以在https://github.com/hummingbot/hummingbot找到。