跳至内容

脚本

脚本是 Hummingbot 策略的入口点。独立脚本使新用户能够自动化基本的交易操作,并实现 Hummingbot 策略的简化版本。

它们还允许 Hummingbot 用户使用 Strategy V2 框架构建自定义策略,并通过几行 Python 代码即可调用 Hummingbot 交易所连接器的全部功能。

注意

如果您的脚本出现错误,必须完全退出 Hummingbot,修正或调试有问题的脚本,然后重新启动 Hummingbot。停止命令无法修复错误。要恢复正常运行,必须完全关闭并重新启动 Hummingbot。

如需更多信息,请参阅 脚本入门指南。该详细指南将演示如何运行一个简单的方向性算法交易策略。

脚本示例

请参阅 脚本示例 以查看 Hummingbot 代码库中当前提供的示例脚本列表。这些示例展示了如何:

  • 执行 V2 策略
  • 下载订单簿数据
  • 下载历史 K 线数据
  • 下单
  • 使用行情 oracle
  • 调用交易所 API
  • 以及更多功能!

我们欢迎用户贡献新的示例脚本!如需提交贡献,请遵循 贡献指南

配置文件

脚本可以创建为带或不带 配置文件 的形式。

要为您的脚本创建配置文件,请执行:

create --script-config [SCRIPT_FILE]

此命令将自动补全本地 /scripts 目录中可配置的脚本。系统将提示您指定策略参数,这些参数随后将保存在 conf/scripts 目录下的 YAML 文件中。运行脚本时,请使用:

start --script [SCRIPT_FILE] --conf [SCRIPT_CONFIG_FILE]

自动补全功能将建议来自本地 /conf/scripts 目录的配置文件。

基类

使用 Strategy V2 框架的脚本继承自 StrategyV2Base 类。这些脚本允许用户创建包含参数的配置文件。

其他脚本(包括简单示例和旧版脚本)继承自 ScriptStrategyBase 类。这些脚本在脚本代码中定义参数,不暴露配置参数。

脚本架构

StrategyV2 的入口点是一个继承自 StrategyV2Base 类的 Hummingbot 脚本。

该脚本从市场数据提供者获取数据,并管理每个执行器的行为。可选地,它可以加载一个控制器来管理策略逻辑,而非在脚本中直接定义。请参阅 入门指南 了解其工作原理。

更多 StrategyV2 兼容脚本示例,请参见 示例脚本。

添加配置参数

要在 StrategyV2 脚本中添加用户自定义参数,请在 StrategyV2Base 类中添加一个扩展 StrategyV2ConfigBase 类的配置类。

这将定义一组配置参数,当用户运行 create 命令生成配置文件时会提示输入。仅标记为 prompt_on_new 的问题才会显示。

随后,这些参数将存储在配置文件中。脚本会每隔 config_update_interval(默认:60 秒)检查一次该配置文件,并更新其运行中使用的参数。

class StrategyV2ConfigBase(BaseClientModel):
    """
    Base class for version 2 strategy configurations.
    """
    markets: Dict[str, Set[str]] = Field(
        default="binance_perpetual.JASMY-USDT,RLC-USDT",
        client_data=ClientFieldData(
            prompt_on_new=True,
            prompt=lambda mi: (
                "Enter markets in format 'exchange1.tp1,tp2:exchange2.tp1,tp2':"
            )
        )
    )
    candles_config: List[CandlesConfig] = Field(
        default="binance_perpetual.JASMY-USDT.1m.500:binance_perpetual.RLC-USDT.1m.500",
        client_data=ClientFieldData(
            prompt_on_new=True,
            prompt=lambda mi: (
                "Enter candle configs in format 'exchange1.tp1.interval1.max_records:"
                "exchange2.tp2.interval2.max_records':"
            )
        )
    )
    controllers_config: List[str] = Field(
        default=None,
        client_data=ClientFieldData(
            is_updatable=True,
            prompt_on_new=True,
            prompt=lambda mi: "Enter controller configurations (comma-separated file paths), leave it empty if none: "
        ))
    config_update_interval: int = Field(
        default=60,
        gt=0,
        client_data=ClientFieldData(
            prompt_on_new=False,
            prompt=lambda mi: "Enter the config update interval in seconds (e.g. 60): ",
        )
    )

on_tick 方法

该方法充当策略的心跳,定期被调用,使策略能够实时适应新的市场条件。

def on_tick(self):
    for executor_handler in self.executor_handlers.values():
        if executor_handler.status == ExecutorHandlerStatus.NOT_STARTED:
            executor_handler.start()

format_status 方法

该方法覆盖了标准的 status 函数,提供一个格式化的字符串,表示策略的当前状态,包括策略名称、交易对以及每个执行器的状态。

用户可以自定义此函数以显示其自定义的策略变量。

def format_status(self) -> str:
        if not self.ready_to_trade:
            return "Market connectors are not ready."
        lines = []
        for trading_pair, executor_handler in self.executor_handlers.items():
            lines.extend(
                [f"Strategy: {executor_handler.controller.config.strategy_name} | Trading Pair: {trading_pair}",
                 executor_handler.to_format_status()])
        return "\n".join(lines)