教程
你将学到的内容¶
本教程旨在帮助你熟悉创建一个执行简单限价单的基本 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 类。  # 此方法源自 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 策略的信息,请查看我们的开发者教程。
