跳至内容

挂单

此功能会在订单簿另一侧(买方与卖方订单簿)的匹配订单成交时,保留订单“挂起”(不取消,继续留在订单簿中)。

配置变量

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 美元的买单,并创建两个新的买卖订单。然而,若将 hanging_orders_enabled 设为 True,则买单不会被取消,而是继续留在订单簿中,直至成交。请注意,若挂起订单的价差超过 hanging_orders_cancel_pct 参数设定值,该挂单将被取消。

示例 2(高级)

假设你再次为 ETH-USDT 配对做市,买价和卖价价差均设为 1%。考虑以下两种策略:前者为默认策略,后者启用了挂单功能。中心的白色线表示以美元计的中间市场价格;中间价格上方的虚线为活跃的卖单;中间价格下方的点线为活跃的买单。

挂单的市场

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%(或被成交)。在此期间,卖盘订单因价差在中间市场价格线 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 辅助类概览,该类旨在协助策略管理 挂单。它自动化了大部分流程,包括更新过期订单和取消偏离市场价格过远的订单。

其用法的两个示例可在 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属性。