跳转到内容

脚本

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

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

注意

如果您的脚本遇到错误,至关重要的是您必须完全退出 Hummingbot,更正或调试有故障的脚本,然后重新启动 Hummingbot。如果遇到错误,stop 命令不会解决问题。为了重新恢复正常,需要完全关闭并随后重新启动 Hummingbot。

更多信息请参见 脚本演练。该详细演练将展示如何运行简单的定向算法交易策略。

脚本示例

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

  • 执行 V2 策略
  • 下载订单簿数据
  • 下载历史蜡烛图数据
  • 下单
  • 使用汇率预言机
  • 调用交易所 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 的入口点是一个 Hummingbot 脚本,它继承自 StrategyV2Base 类。

此脚本从市场数据提供者获取数据,并管理每个执行器的行为。可选地,它可以加载一个控制器来管理策略逻辑,而不是在脚本中定义。通过 演练 了解其工作原理。

有关 StrategyV2 兼容脚本的更多示例,请参见 示例脚本

添加配置参数

要向 StategyV2 脚本添加用户定义的参数,请添加一个继承自 StrategyV2ConfigBase 类的配置类,该类位于 StrategyV2Base 类中。

这定义了一组配置参数,在用户运行 create 生成配置文件时会提示用户输入。只有标记为 prompt_on_new 的问题才会显示。

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

class StrategyV2ConfigBase(BaseClientModel):
    """
    版本 2 策略配置的基类。
    """
    markets: Dict[str, Set[str]] = Field(
        default="binance_perpetual.JASMY-USDT,RLC-USDT",
        client_data=ClientFieldData(
            prompt_on_new=True,
            prompt=lambda mi: (
                "输入市场格式 '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: (
                "输入蜡烛图配置格式 '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: "输入控制器配置 (逗号分隔的文件路径),若无则留空: "
        ))
    config_update_interval: int = Field(
        default=60,
        gt=0,
        client_data=ClientFieldData(
            prompt_on_new=False,
            prompt=lambda mi: "输入配置更新间隔(秒)(例如 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 "市场连接器尚未准备就绪。"
        lines = []
        for trading_pair, executor_handler in self.executor_handlers.items():
            lines.extend(
                [f"策略: {executor_handler.controller.config.strategy_name} | 交易对: {trading_pair}",
                 executor_handler.to_format_status()])
        return "\n".join(lines)