教程
你将学到的内容¶
本教程旨在帮助你熟悉创建一个执行简单限价单的基本 Hummingbot 策略的基本概念。
完成本教程后,你应该能够:
- 大致了解作为策略构建基础的基类
- 拥有一个可运行的策略
- 能够从零开始构建新的自定义策略
开始之前¶
请按照安装中的说明,从源码安装 Hummingbot。如果安装成功,之后你应该会看到 Hummingbot 的欢迎界面:

创建一个策略¶
让我们创建一个简单的 LimitOrder 策略,用于下限价单!
策略文件¶
为便于本文说明,我们假设你已将 Hummingbot 安装在 ~/hummingbot-instance 目录下。从该目录进入包含所有策略的 strategy 目录。每个子文件夹代表一个不同的策略。
limit_order 的文件夹,用于存放我们的策略文件: 接下来,进入该文件夹并创建策略所需的四个文件:
这些文件各自有特定用途和命名规范。参阅开发者教程以了解更多关于不同策略的文件结构和命名约定。
最后,我们还需要创建一个策略配置模板,用于定义策略中用户可配置的参数。与策略文件和文件夹一样,模板文件名也遵循命名规范。
让我们逐一查看这些文件。
__init__.py¶
init 文件用于暴露你的策略。使用代码编辑器将以下代码粘贴到文件中:
此处,__all__ 字段用于暴露公共模块 LimitOrder 以供使用。
limit_order_config_map.py¶
config map 文件用于设置用户提示,以配置策略参数。该文件的命名规范为 {strategy_name}_config_map.py。
在你的 config map 文件中使用以下代码:
from hummingbot.client.config.config_var import ConfigVar # 返回一个市场提示,其中包含用户设置的 connector 值 def market_prompt() -> str: connector = limit_order_config_map.get("connector").value return f'请输入在 {connector} 上交易的代币交易对 >>> ' # 策略定义的参数列表 limit_order_config_map ={ "strategy": ConfigVar(key="strategy", prompt="", default="limit_order", ), "connector": ConfigVar(key="connector", prompt="请输入交易所名称 >>> ", prompt_on_new=True, ), "market": ConfigVar( key="market", prompt=market_prompt, prompt_on_new=True, ), } key 参数用于标识字段,prompt 参数用于设置提示信息。如果包含 prompt_on_new,则每次用户创建新策略时都会提示输入;否则仅在用户使用 config 配置参数时显示。
在上面的例子中,strategy 字段标识了交易策略:LimitOrder。类似地,我们使用 connector 字段提示输入交易所名称,使用 market 字段提示输入要交易的交易对。注意,market 的提示使用了一个函数,该函数引用了用户在上一个问题中设置的 connector 值。
此外,你还可以提供验证器(validators)作为参数,以确保只接受有效值;也可以使用 default 参数为参数提供默认值。参阅ConfigVar 文件,了解设置策略参数的所有方式。
start.py¶
start 文件用于初始化策略的配置。将以下代码粘贴到文件中:
from hummingbot.strategy.market_trading_pair_tuple import MarketTradingPairTuple from hummingbot.strategy.limit_order import LimitOrder from hummingbot.strategy.limit_order.limit_order_config_map import limit_order_config_map as c_map def start(self): connector = c_map.get("connector").value.lower() market = c_map.get("market").value self._initialize_markets([(connector, [market])]) base, quote = market.split("-") market_info = MarketTradingPairTuple(self.markets[connector], market, base, quote) self.market_trading_pair_tuples = [market_info] self.strategy = LimitOrder(market_info) 在上述代码中,connector 变量存储交易所名称,而 market 变量存储交易对。这些变量从我们在上一步中定义的 config map 文件中获取所需值。
同样,MarketTradingPairTuple 对象接受交易所名称、交易对、基础资产和报价资产作为其参数。
这些信息使我们能够初始化 LimitOrder 对象。
limit_order.py¶
strategy 文件定义了策略的行为。将以下代码粘贴到文件中:
#!/usr/bin/env python from decimal import Decimal import logging from hummingbot.core.event.events import OrderType from hummingbot.strategy.market_trading_pair_tuple import MarketTradingPairTuple from hummingbot.logger import HummingbotLogger from hummingbot.strategy.strategy_py_base import StrategyPyBase hws_logger = None class LimitOrder(StrategyPyBase): # 我们通过继承 StrategyPyBase 来获得其结构。同时, # 在为类添加构造函数之前,我们先创建一个日志记录器对象。 @classmethod def logger(cls) -> HummingbotLogger: global hws_logger if hws_logger is None: hws_logger = logging.getLogger(__name__) return hws_logger def __init__(self, market_info: MarketTradingPairTuple, ): super().__init__() self._market_info = market_info self._connector_ready = False self._order_completed = False self.add_markets([market_info.market]) # 初始化所需变量后,我们定义 tick 方法。 # tick 方法是策略的入口点。 def tick(self, timestamp: float): if not self._connector_ready: self._connector_ready = self._market_info.market.ready if not self._connector_ready: self.logger().warning(f"{self._market_info.market.name} 尚未准备就绪,请稍候...") return else: self.logger().warning(f"{self._market_info.market.name} 已准备就绪,交易开始") if not self._order_completed: # get_mid_price 方法获取代币的中间价并存储它。该方法来自 MarketTradingPairTuple 类。 # 存储它。该方法继承自 MarketTradingPairTuple 类。 mid_price = self._market_info.get_mid_price() # buy_with_specific_market 方法为你执行交易。 # 该方法继承自 Strategy_base 类。 order_id = self.buy_with_specific_market( self._market_info, # market_trading_pair_tuple Decimal("0.005"), # amount OrderType.LIMIT, # order_type mid_price # price ) self.logger().info(f"已提交限价买入订单 {order_id}") self._order_completed = True # 订单完成后发出日志消息 def did_complete_buy_order(self, order_completed_event): self.logger().info(f"你的限价买入订单 {order_completed_event.order_id} 已执行") self.logger().info(order_completed_event) 查看MarketTradingPairTuple 类以了解更多可添加到机器人的方法。
StrategyPyBase 类和 buy_with_specific_market 方法均继承自策略基类。要了解更多可用的方法,请访问Strategy_base。
conf_limit_order_strategy_TEMPLATE.yml¶
最后,我们还需要在 templates 文件夹中添加一个额外的文件,作为策略参数的占位符。首先,进入 templates 文件夹并创建该文件。运行以下命令:
将以下代码添加到该文件中:
注意
模板文件名的命名规范为 conf_{strategy_name}_strategy_TEMPLATE.yml。
运行我们的策略¶
现在我们已经创建了一个新的交易策略,让我们在纸面交易模式下运行它!
首先,重新编译代码。每次修改代码后重新编译是一个好习惯,以便重建任何更改的 Cython 代码。
现在,启动 Hummingbot:Hummingbot 用户界面¶
你的 Hummingbot 用户界面包含三个部分:
- 主界面
- 日志记录器
- 输入界面

创建策略¶
按照以下步骤使用我们创建的策略。
- 运行命令
create创建一个新机器人 - 当提示“你的做市策略是什么?”时,输入
limit_order - 当提示“请输入交易所名称 >>>”时,输入
binance - 当提示“请输入在 binance 上交易的代币交易对 >>>”时,输入
ETH-USDT - 保存配置文件
运行策略¶
运行 start 以纸面交易模式启动你的机器人。你应该会看到以下日志消息:

你还可以运行 history 命令查看交易结果:

结论¶
恭喜!你刚刚创建了你的第一个交易机器人!这个机器人非常简单,但为你进一步实验提供了基础。你能提示用户更改订单数量或交易类型,或串联一系列交易吗?
很快,你就能使用 Hummingbot 创建结合多个交易所的复杂交易策略!要了解更多关于创建 Hummingbot 策略的信息,请查看我们的开发者教程。