挂单¶
如果订单簿另一侧(买盘与卖盘订单簿)的匹配订单已被成交,则此功能使订单保持"挂单"状态(即不被取消并继续留在订单簿中)。
配置变量¶
hanging_orders_enabled
¶
启用后,与已成交订单相对一侧的订单保持活跃状态。
** 提示:**
hanging_orders_cancel_pct
¶
当价差超过此值时取消挂单。请注意,除了hanging_orders_cancel_pct
之外,没有其他参数可以取消挂单。
** 提示:**
工作原理¶
挂单是一个功能,它指示 Hummingbot 将同一订单的买入和卖出视为一对。如果一侧被成交,机器人会保留配对的另一侧,从而创造该侧最终被成交的可能性:
在上面的示例中,第一对的买入订单已被成交。但由于启用了挂单模式,在刷新周期(第 2 期)期间不会取消第一对的原始卖出订单,并保持挂单状态。同时,机器人继续创建新订单(参见第 2 至第 5 期)。在示例中,价格改变方向,最终在某个时点,挂单的卖出订单在第 5 期左右被成交。
这种策略的好处是创造了配对"完成"和平衡的可能性。
通常,在单订单模式下订单以对的形式下放(1 个买入订单和 1 个卖出订单),当买入或卖出订单被成交时,另一个订单会被取消。参数hanging_orders_enabled
允许 Hummingbot 在任一侧被成交时使另一侧订单保持挂单状态(不被取消)。
挂单将在以下条件下被取消:
- 价差超过指定的
hanging_orders_cancel_pct
值 - 发送
stop
或exit
命令
输入config hanging_orders_enabled
和config 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 中间市场价格;中间价格上方的虚线是活跃的卖单;中间价格下方的点线是活跃的买单。
市场没有挂单¶
在此策略中,hanging_orders_enabled
参数为 False。在每个间隔 \(t_i\),订单要么被取消,要么被成交,然后用新的一组买卖订单重新刷新(每个订单与中间市场价格有 1% 的价差)。一次只有两个订单,一个卖单和一个买单。这是一个很好的默认策略,然而,吃单者需要愿意以相对接近你选择的价差来成交订单。这可能需要你收紧价差以获得更多的吃单者来成交你的订单。
市场有挂单¶
在此策略中,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}\) 被成交。
示例配置¶
让我们看看这个配置在以下场景中如何工作:
当买单完全成交时,不会取消卖单。60 秒后,Hummingbot 将创建新的一组买卖订单。status
输出将显示所有活跃订单,同时指明哪些订单是挂单。
挂单将保持未成交状态,如果其价差超过我们在 hanging_orders_cancel_pct
中指定的 2%,将会被取消。
多订单级别的挂单¶
当一侧的订单(买或卖)被成交时,另一侧的所有活跃订单都会保持挂单。
根据上面的示例配置,机器人放置了 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 被成交。
这使得 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。它自动化了大部分流程,包括续订过期订单和取消偏离市场价格过远的订单。
其使用示例可在 PureMarketMakingStrategy
和 AvellanedaMarketMakingStrategy
策略中找到。
基本概念¶
需要了解的一个重要基本概念是,跟踪器通过维护 候选 挂单列表来运行。本文将把该列表称为"候选列表"。调用 update_strategy_orders_with_equivalent_orders
方法将执行检查,确保候选列表与交易所上的订单同步,并将开始跟踪挂单。
最基本的方法集合是 add_order
和 remove_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
属性。