脚本
脚本是 Hummingbot 策略的入口点。独立脚本可以让新用户自动化基本交易操作,并实现 Hummingbot 策略的简单版本。
它们还使 Hummingbot 用户能够使用 策略 V2 框架构建自定义策略,并通过几行 Python 代码访问 Hummingbot 交易所连接器的全部功能。
注意
如果您的脚本遇到错误,至关重要的是您必须完全退出 Hummingbot,更正或调试有故障的脚本,然后重新启动 Hummingbot。如果遇到错误,stop 命令不会解决问题。为了重新恢复正常,需要完全关闭并随后重新启动 Hummingbot。
更多信息请参见 脚本演练。该详细演练将展示如何运行简单的定向算法交易策略。
脚本示例¶
请参阅 脚本示例 查看 Hummingbot 代码库中的当前示例脚本列表。这些示例展示如何:
- 执行 V2 策略
- 下载订单簿数据
- 下载历史蜡烛图数据
- 下单
- 使用汇率预言机
- 调用交易所 API
- 以及更多!
我们欢迎用户提交新的示例脚本贡献!要提交贡献,请遵循 贡献指南。
配置文件¶
脚本可以创建配置文件或不创建配置文件。
要为您的脚本创建一个配置文件,请执行:
此命令将自动完成 /scripts
本地目录中可配置的脚本。系统将提示您指定策略参数,然后将其保存在 conf/scripts
目录中的 YAML 文件中。要运行脚本,请使用:
自动完成将建议来自本地 /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)