Hummingbot V1 策略编码入门指南¶
作者:Ben Smeaton
你好!我断断续续使用 Hummingbot 已经大约一年了,想简单概述一下如何实际定义你自己的策略。我之所以进入做市领域,是因为对 Python 编码的兴趣爱好,当时我正在研究如何自动买卖股票,结果惨败。
Hummingbot 对于业余编码人员来说非常易用,因为它主要是基于 Python 的代码库,而且全部是开源的(意味着你可以随意折腾代码)。拼凑出自己的策略相当容易,虽然我自己走了很多弯路!我想用最简单的方式给你们一个基本概念,告诉你如何实现这一点。
最好的开始方式是了解 Hummingbot 中已有的策略,这可以通过深入研究程序来实现,并了解它的工作原理。我建议从一个现有的策略开始,然后自己进行调整。如果一切变糟(很有可能)你只需从 Github 重新拉取代码并覆盖你的更改。另外,如果你使用 Windows,你可能需要在 Windows 的源码安装环境下开发代码,这可以很轻松地完成,具体参见:Source - Hummingbot Foundation。显然,当你有了可用的代码后,你可以很轻松地将策略文件传输到你的 AWS 服务器或 RPI 并在那里编译。
当你从源码安装了软件后,需要前往 hummingbot/hummingbot/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 function
,该函数会跳转到程序下方几行,即此函数的开始位置。
首先,该函数会检查活跃订单以了解它们是否仍然有利可图,如需要则会取消和调整。如果没有活跃的买方订单或没有活跃的卖方订单且没有等待完成的吃单订单,程序将到达函数底部并最终调用c_check_and_create_new_orders
。
c_check_and_create_new_orders
位于策略文件的最底部,它会检查交易所在当前是否还有活跃的买方或卖方订单> 根据您的输入和当前订单簿分布来确定订单数量 > 确定设置订单价格(通过确保从当前吃单价格实现所需盈利能力)并最终使用c_place_order
函数下单。
就是这样。
我将展示如何向此策略添加一个简单的变更来稍微改变其功能。我将逐一介绍我们需要修改的不同文件。这个变更是非常细微的,即在策略中创建一个最小订单规模,以便当订单金额小于此数值时,策略不会创建订单。
- 我们首先将创建一个可在程序内部访问的新参数,这将设置最小订单规模。为此,请打开
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),
),
- 接下来我们需要将
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
- 为了让此变量在我们的策略中可用,我们最终需要进入
.pyx
文件并在类定义init_params
中添加此变量。
min_order_amount: Decimal = Decimal,
我们还必须在稍下的位置定义一个实例变量,如:
self._min_order_amount = min_order_amount
- 此时我们还需要更新另外两个文件。
A. 需要打开.pxd 文件并将我们的新变量添加到变量列表中,如:object _min_order_amount
B. 我们需要更新hummingbot/hummingbot/Templates
中策略的模板文件
- 我们终于将变量添加到策略中了!这将是对策略非常简单的变更,我将在之前查看的
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)
if bid_size > self._min_order_amount:
在卖方侧也是如此!
当前函数检查当前买方规模是否大于 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 函数或属性可以获取市场做市所需的所有信息,这只是探索代码并找到它们的问题。hummingbot 文件夹中的strategy_base.py
和market_base.py
文件值得探索。
如果你想了解更多,请随时在 Discord 上联系我:bsmeat#7510