跳至内容

教程

你将学到的内容

本教程旨在帮助你熟悉创建一个执行简单限价单的基本 Hummingbot 策略的基本概念。

完成本教程后,你应该能够:

  • 大致了解作为策略构建基础的基类
  • 拥有一个可运行的策略
  • 能够从零开始构建新的自定义策略

入门

请按照安装中的说明,从源码安装 Hummingbot。如果安装成功,之后你应该会看到 Hummingbot 的欢迎界面:

创建策略

让我们创建一个简单的LimitOrder策略,用于下限价单!

策略文件

为便于本文讲解,我们假设你已将 Hummingbot 安装在 ~/hummingbot-instance 目录中。从该目录进入包含所有策略的 strategy 目录。每个子文件夹代表一个不同的策略。

cd ~/hummingbot-instance cd hummingbot/strategy 
在此目录中,创建一个名为 limit_order 的文件夹,用于存放我们的策略文件:
mkdir limit_order cd limit_order 

接下来,进入该文件夹并创建策略所需的四个文件:

touch __init__.py limit_order_config_map.py limit_order.py start.py 

这些文件各有特定用途和命名规范。参阅开发者教程以了解更多关于不同策略的文件结构和命名约定。

最后,我们还需要创建一个策略配置模板,用于定义策略中用户可配置的参数。与策略文件和文件夹一样,模板文件名也遵循一定的命名规则。

现在我们逐一查看这些文件。

__init__.py

init 文件用于暴露你的策略。使用代码编辑器将以下代码粘贴到文件中:

# 初始化项目 from .limit_order import LimitOrder __all__ = [limit_order] 

此处,__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,  ), } 
此文件中的参数以键值对形式映射。每个字段使用ConfigVar方法接收参数。ConfigVar 是一种变量,可用于控制机器人的交易行为。

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 文件夹并创建该文件。运行以下命令:

cd ~/hummingbot-instance cd hummingbot/templates touch conf_limit_order_strategy_TEMPLATE.yml 

将以下代码添加到该文件中:

template_version: 1 strategy: null connector: null market: null 

注意

模板文件名的命名规范为 conf_{strategy_name}_strategy_TEMPLATE.yml

运行我们的策略

现在我们已经创建了一个新的交易策略,让我们在纸面交易模式下运行它!

首先,重新编译代码。每次修改代码后重新编译是一个良好习惯,以便重建任何更改的 Cython 代码。

cd ~/hummingbot-instance ./compile 
现在,启动 Hummingbot:
./start 

Hummingbot 用户界面

你的 Hummingbot 用户界面由三个部分组成:

  1. 主界面
  2. 日志记录器
  3. 输入界面

创建策略

请按照以下步骤使用我们创建的策略。

  1. 运行 create 命令以创建一个新的机器人
  2. 当提示“你的做市策略是什么?”时,输入 limit_order
  3. 当提示“请输入交易所名称 >>>”时,输入 binance
  4. 当提示“请输入在 binance 上交易的代币交易对 >>>”时,输入 ETH-USDT
  5. 保存配置文件

运行策略

运行 start 命令以在纸面交易模式下启动你的机器人。你应该会看到以下日志消息:

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

结论

恭喜!你刚刚创建了你的第一个交易机器人!这个机器人虽然很简单,但为你进一步实验提供了基础。你能尝试提示用户更改订单数量或交易类型,或者串联一系列交易吗?

很快,你就能使用 Hummingbot 创建结合多个交易所的复杂交易策略!要了解更多关于创建 Hummingbot 策略的信息,请查看我们的开发者教程