跳转至内容

挂单

如果订单簿另一侧(买盘与卖盘订单簿)的匹配订单已被成交,则此功能使订单保持"挂单"状态(即不被取消并继续留在订单簿中)。

配置变量

hanging_orders_enabled

启用后,与已成交订单相对一侧的订单保持活跃状态。

** 提示:**

Do you want to enable hanging orders? (Yes/No)
>>> Yes

hanging_orders_cancel_pct

当价差超过此值时取消挂单。请注意,除了hanging_orders_cancel_pct之外,没有其他参数可以取消挂单。

** 提示:**

At what spread percentage (from mid price) will hanging orders be canceled?
>>>

工作原理

挂单是一个功能,它指示 Hummingbot 将同一订单的买入和卖出视为一对。如果一侧被成交,机器人会保留配对的另一侧,从而创造该侧最终被成交的可能性:

在上面的示例中,第一对的买入订单已被成交。但由于启用了挂单模式,在刷新周期(第 2 期)期间不会取消第一对的原始卖出订单,并保持挂单状态。同时,机器人继续创建新订单(参见第 2 至第 5 期)。在示例中,价格改变方向,最终在某个时点,挂单的卖出订单在第 5 期左右被成交。

这种策略的好处是创造了配对"完成"和平衡的可能性。

通常,在单订单模式下订单以对的形式下放(1 个买入订单和 1 个卖出订单),当买入或卖出订单被成交时,另一个订单会被取消。参数hanging_orders_enabled允许 Hummingbot 在任一侧被成交时使另一侧订单保持挂单状态(不被取消)。

挂单将在以下条件下被取消:

  1. 价差超过指定的hanging_orders_cancel_pct
  2. 发送stopexit命令

输入config hanging_orders_enabledconfig hanging_orders_cancel_pct来设置这些参数的值。

示例说明 - 挂单的重要性

示例 1(基础)

假设您正在为ETH-USDT交易对做市,中间价格为 200 美元(\(t_0\))。您将买盘价差和卖盘价差设置为 1%。因此,买盘价格为 198 美元,卖盘价格为 202 美元。

现在假设一个市场接盘者(在市场上建仓的人)认为以太坊价格将上涨,因此他们成交了您的 202 美元卖单(\(t_1\))。

在下一个订单刷新周期,通常 Hummingbot 会取消 198 美元的买单并创建 2 个新的买单和卖单。但是,如果将hanging_orders_enabled设置为 True,则买单不会被取消并保持在订单簿上直到被成交。请注意,如果开放挂单的价差超过hanging_orders_cancel_pct参数,挂单将被取消。

示例 2(高级)

假设你再次为 ETH-USDT 交易对做市。买价和卖价价差设置为 1%。考虑以下两种策略,前者为默认策略,后者带有挂单。中心的白线是 USDT 中间市场价格;中间价格上方的虚线是活跃的卖单;中间价格下方的点线是活跃的买单。

市场没有挂单

Advanced Market With No Hang

在此策略中,hanging_orders_enabled 参数为 False。在每个间隔 \(t_i\),订单要么被取消,要么被成交,然后用新的一组买卖订单重新刷新(每个订单与中间市场价格有 1% 的价差)。一次只有两个订单,一个卖单和一个买单。这是一个很好的默认策略,然而,吃单者需要愿意以相对接近你选择的价差来成交订单。这可能需要你收紧价差以获得更多的吃单者来成交你的订单。

市场挂单

Advanced Market With Hanging Orders

在此策略中,hanging_orders_enabled 参数为 True。我们将 hanging_orders_cancel_pct 参数设置为 2%,并假设当价差在 0.55% 以内时,订单会被市场吃单者成交。当买单被成交或取消时,与默认情况不同,卖单会保持开放。同样,当卖单被成交或取消时,买单会保持开放。如上所示,从 \(t_0\)\(t_{10}\),买单通常会"挂单",直到它们与中间市场价格线的价差超过 2%(或被成交)。从 \(t_0\)\(t_{10}\),卖单在它们与中间市场价格线的价差在 0.55% 范围内时被成交。从 \(t_{10}\)\(t_{20}\) 情况相反,买单在它们与中间市场价格线的价差在 0.55% 范围内时被成交,而卖单则"挂单",直到它们的价差超过 2% 时被取消。

这种策略允许在取消百分比参数和吃单者成交你的订单(可能在订单价格更接近中间市场价格时)之间存在一系列价差。最终,这是一种更灵活的策略,可以捕获在没有挂单时错失的盈利交易。例如,在上面的示例市场中,在 \(t_8\) 开始的紫色买单如果不允许作为挂单就会错失,而在第二张图表中,该买单在 \(t_{13}\) 被成交。

示例配置

让我们看看这个配置在以下场景中如何工作:

- filled_order_delay: 60.0
- hanging_orders_enabled: True
- hanging_orders_cancel_pct: 2

hanging orders

当买单完全成交时,不会取消卖单。60 秒后,Hummingbot 将创建新的一组买卖订单。status 输出将显示所有活跃订单,同时指明哪些订单是挂单。

hanging orders

挂单将保持未成交状态,如果其价差超过我们在 hanging_orders_cancel_pct 中指定的 2%,将会被取消。

hanging orders

多订单级别的挂单

当一侧的订单(买或卖)被成交时,另一侧的所有活跃订单都会保持挂单。

- hanging_orders_enabled: True
- order_levels: 3

根据上面的示例配置,机器人放置了 3 个买单和 3 个卖单。

Orders:
   Level  Type  Price Spread Amount (Orig)  Amount (Adj)       Age
       3  sell 239.75  2.49%          0.05          0.05  00:00:01
       2  sell 237.41  1.49%          0.05          0.05  00:00:01
       1  sell 235.07  0.49%          0.05          0.05  00:00:01
       1   buy  233.9  0.01%          0.05          0.05  00:00:01
       2   buy 231.56  1.01%          0.05          0.05  00:00:01
       3   buy 229.22  2.01%          0.05          0.05  00:00:01

买单 1 被成交。

Maker BUY order 0.05000000 ETH @ 233.90000000 USDT is filled.

这使得 3 个卖单在下次刷新时的新订单之上保持挂单状态。

Orders:
  Level  Type  Price Spread Amount (Orig)  Amount (Adj)       Age
   hang  sell 239.75  2.50%                        0.05  00:01:08
      3  sell 239.73  2.49%          0.05          0.05  00:00:01
   hang  sell 237.41  1.50%                        0.05  00:01:08
      2  sell 237.39  1.49%          0.05          0.05  00:00:01
   hang  sell 235.07  0.50%                        0.05  00:01:08
      1  sell 235.05  0.49%          0.05          0.05  00:00:01
      1   buy 233.88  0.01%          0.05          0.05  00:00:01
      2   buy 231.54  1.01%          0.05          0.05  00:00:01
      3   buy  229.2  2.01%          0.05          0.05  00:00:01

HangingOrdersTracker

本节提供了面向开发者的 HangingOrdersTracker 辅助类概述,旨在帮助策略管理 hanging orders。它自动化了大部分流程,包括续订过期订单和取消偏离市场价格过远的订单。

其使用示例可在 PureMarketMakingStrategyAvellanedaMarketMakingStrategy 策略中找到。

基本概念

需要了解的一个重要基本概念是,跟踪器通过维护 候选 挂单列表来运行。本文将把该列表称为"候选列表"。调用 update_strategy_orders_with_equivalent_orders 方法将执行检查,确保候选列表与交易所上的订单同步,并将开始跟踪挂单。

最基本的方法集合是 add_orderremove_order,它们分别向挂单的候选列表中添加和移除订单。然而,add_order 函数最可能会在策略初始化期间使用,当从数据库中检索挂单并将其注册到跟踪器时,而 remove_order 函数可能根本不需要使用,因为移除已跟踪挂单的职责被转移到了跟踪器并实现自动化。

注册跟踪器

在初始化阶段,HangingOrdersTracker 必须与策略使用的连接器进行注册,以接收关于订单的更新并履行其职责。这可以通过简单地调用 register_events 方法并传递相关连接器的列表来实现。当停用策略时,必须调用跟踪器的 unregister_events 以优雅地从连接器中注销跟踪器。

挂单创建流程

创建新订单时,使用名为 add_current_pairs_of_proposal_orders_executed_by_strategy 的方法,通过传递 CreatedPairOfOrders 来注册订单对。跟踪器随后开始监听已成交的订单并相应更新订单对。

一旦当前周期结束,策略准备取消当前订单并替换为一组新订单时,调用 update_strategy_orders_with_equivalent_orders 将从当前活动的 CreatedPairOrders 中检测挂单并将其添加到候选订单列表。随后,如 基本概念 部分所述,调用 update_strategy_orders_with_equivalent_orders 方法将确保候选订单列表的完整性并开始跟踪挂单。

执行此步骤后,策略可以继续执行当前周期结束流程中想要取消的订单。它只需通过调用 is_order_id_in_hanging_orders 方法询问跟踪器给定订单是否为挂单。如果是,则策略不再需要担心该订单。如果否,则策略可以继续取消该订单。

管理流程

最后,为了使追踪器执行其任务,必须在每个策略 tick 时调用 process_tick 方法。当调用该方法时,HangingOrdersTracker 会执行两个任务:首先,移除具有 极值价差 的挂单;其次,更新已超过最大订单年龄的订单。为了启用旧订单的更新,策略必须实现 max_order_age 属性。