跳至内容

Hummingbot V1 策略编码入门指南

cover

作者:Ben Smeaton

你好!我断断续续使用 Hummingbot 大约一年了,想分享一下如何真正开始定义自己的策略。我最初接触做市是因为对 Python 编程的业余兴趣,当时我正在尝试自动买卖股票,但结果非常不成功。

Hummingbot 对编程爱好者非常友好,主要因为其代码库基于 Python,并且完全开源(意味着你可以随意修改代码)。虽然自己拼凑出一个策略并不难,但我自己也是经过大量试错才走过来的!我想尽可能简单地介绍如何实现这一点。

最好的起步方式是先了解 Hummingbot 中已有的策略,可以通过深入程序来理解其工作原理。我建议从一个现有策略入手,然后自行进行修改。如果搞砸了(很可能发生),你只需从 GitHub 重新拉取代码覆盖更改即可。另外,如果你使用 Windows,可能需要在 Windows 上搭建源码安装环境来进行开发,这可以很容易地完成,详见:源码安装 - Hummingbot 基金会。显然,当你有了可运行的代码后,就可以轻松将策略文件转移到你的 AWS 服务器或树莓派上并进行编译。

当你从源码安装好软件后,需要进入 hummingbot/hummingbot/strategy 目录下的 strategy 文件夹,然后选择你要编辑的策略。本文将以跨交易所做市策略为例。

各个策略文件夹的结构都类似。其中最重要的文件是扩展名为 .pyx 的文件,这是主策略文件,包含了策略运行的所有指令。关于该文件夹中的其他文件:

  • config_map.py 文件包含你在程序中可配置的参数,你可以在此文件中添加新参数及其提示信息和默认值。

  • start 文件用于初始化主策略中的这些参数(如果你在配置文件中添加了新变量,这里也需要同步更新)。

  • .pdx 文件列出了 .pyx 文件中使用的变量,如果新增了变量,也需要更新此文件(不清楚具体原因,但肯定有其必要性)。

暂时忽略其他文件,打开 .pyx 文件。这个文件包含多个不同功能的函数,共同驱动策略运行。理解这个文件最关键的一点是:页面中间偏下的 c_tick() 函数会被 Hummingbot 每秒调用一次,而该文件中的所有其他函数都会以某种方式被它调用。顺便说一句,不必太在意代码中随处可见的 c_ 前缀和 cdef 关键字,这只是表示使用了 Cython 而非纯 Python;对于你自己新增的部分,直接使用标准 Python 语法即可,效果一样。

通常情况下,策略的工作流程是:先调用 c_tick(),然后依次执行一系列函数,检查交易是否盈利。如果交易有利可图,则通过所有检查,最终在交易所下单。如果已有买卖订单存在,策略会检查这些订单是否仍然盈利,并决定保留还是撤销。

查看 c_tick() 函数,它首先会检查一些标准事项,例如市场是否已准备就绪、交易所上存在哪些活跃订单等,然后将策略的主要逻辑传递给 c_process_market_pair 函数,该函数会跳转到程序下方几行,即此函数开始的位置。

首先,该函数会检查所有活跃订单,判断它们是否仍然盈利,并在需要时取消或调整订单。如果没有活跃的买入单,或者没有活跃的卖出单且没有等待完成的吃单订单,程序将执行到函数末尾,并最终调用 c_check_and_create_new_orders

c_check_and_create_new_orders 位于策略文件的最底部,其功能是:检查交易平台上是否存在当前活跃的买入或卖出订单 > 根据你的输入和当前盘口分布确定订单数量 > 确定下单价格(确保你能从当前吃单价实现所需盈利)> 最后通过 c_place_order 函数下单。

就这样。

我将演示如何对这个策略进行一个简单的修改,以略微改变其功能。我会逐步说明需要修改的各个文件。这次修改非常小,只是在策略中添加一个最小订单量参数,使得当订单金额小于此数值时,策略将不会创建订单。

  1. 我们首先需要创建一个新的参数,以便在程序内部访问,用于设置最小订单量。为此,请打开 config_map.py 文件,并向下滚动到定义 config_map 字典变量的部分,然后插入如下新变量:

"min_order_amount": ConfigVar(

key="min_order_amount",

prompt="买入或卖出订单所需的最小订单金额是多少?",

prompt_on_new=True,

type_str="decimal",

validator=lambda v: validate_decimal(v, Decimal("0"), inclusive=False),

),

  1. 接下来,我们需要将 min_order_amount 参数添加到 start.py 文件中,以确保它在我们的策略中被初始化。向下滚动到 start 函数定义处并粘贴以下代码:

min_order_amount = xemm_map.get("min_order_amount").value

我们还需要将其传入策略文件,在底部的 strategy.init_parameters 列表中添加如下内容:

min_order_amount=min_order_amount

  1. 为了让该变量可在我们的策略中使用,最后我们需要进入 .pyx 文件,并在类定义的 init_params 中添加该变量:

min_order_amount: Decimal = Decimal,

我们还必须在其下方稍远处定义一个实例变量,例如:

self._min_order_amount = min_order_amount

  1. 此时,我们还需要更新另外两个文件。

A. 需要打开 .pxd 文件,并将新变量添加到变量列表中,例如:object _min_order_amount

B. 我们需要更新策略模板文件,位于 hummingbot/hummingbot/Templates 目录下

  1. 我们终于成功将变量引入策略中可以使用了!接下来对策略的修改将非常简单。我将在前面提到的 c_check_and_create_orders 函数中使用该变量,并将以下代码:

if not has_active_bid:

bid_size = self.c_get_market_making_size(market_pair, True)

if bid_size > s_decimal_zero:

修改为:

if not has_active_bid:

bid_size = self.c_get_market_making_size(market_pair, True)

如果 bid_size > self._min_order_amount:

ask 侧也同样如此!

当前函数会检查当前的买方挂单量是否大于 0,以继续下单操作;修改后,要求其必须大于你设置的最小订单金额变量才会执行下单。

现在只需重新编译代码即可,这个过程通常很快。打开 git bash,cd 到 hummingbot 文件夹,然后激活 hummingbot conda 环境并输入 ./compile。就这样!启动 hummingbot(./start)并测试新的参数。

这是一个相当简单的修改,但它基本展示了几乎任何部分都可以被更改和配置。值得指出的是,在你的策略中可以使用许多技巧和信息来源。例如在跨交易所做市策略文件中,market_pair 变量关联了大量可用于策略的信息,它具备多个可使用的属性。

例如

market_pair.maker.market.c_get_price() 可用于获取该交易对当前最高买价或卖价,同时也包含市场和交易对信息。

market_pair.taker.market.c_get_vwap_for_volume() 可利用订单簿,根据指定订单规模计算平均成交价格。

很可能在策略中已经存在某个 hummingbot 函数或属性,能够提供做市所需的各种信息,关键在于探索代码并找到它们。strategy_base.pymarket_base.py 这两个位于 hummingbot 文件夹中的文件值得深入查看。

如果你想了解更多,欢迎在 Discord 上联系我:bsmeat#7510