跳转到内容

生命周期与标的池节点

AQS 的生命周期节点和标的池节点,将 AQE 组件模型引入可视化策略图。你可以通过这些节点将策略逻辑模块化,无需手动编辑 .aqmeta 项目中生成的 src/main.rs。

你仍然可以在 Rust 中内联编写这些逻辑。节点用于拆分职责,使图结构更清晰、文件可复用,并更易于在编辑器中配置。

AQS 为此工作流程提供四种模块化节点类型:

  • On Start Logic 创建 OnStartLogic 组件。
  • On Init Logic 创建 OnInitLogic 组件。
  • On Teardown Logic 创建 OnTeardownLogic 组件。
  • Universe Model 创建 UniverseModel 组件。

生命周期逻辑文件使用 .logic.rs 后缀。标的池模型文件使用 .universe.rs 后缀。

项目包含 .aqmeta 文件时,AQS 管理节点图并重新生成 src/main.rs。不要为这些组件手动编辑生成的 src/main.rs。应添加或编辑自定义组件文件,并更新节点配置。

代码生成负责注册:

  • 生命周期逻辑节点转换为 AQE 生命周期包装器;
  • 标的池模型节点转换为 AQE 标的池模型包装器;
  • 构造函数参数会显示为可配置的公共节点属性;
  • 私有结构体字段可能在面板中显示为只读/私有属性;
  • 节点串联时,执行顺序遵循图的拓扑结构。

生命周期节点具有执行时机设置:

  • Before generated:在该生命周期方法的生成方法体之前运行组件。
  • After generated:在该生命周期方法的生成方法体之后运行组件。

前置条件和验证使用 Before generated。逻辑依赖生成的注册或配置已完成时,使用 After generated。

示例:

  • 在 Alpha 模型读取之前,为 ctx.variables() 填充初始状态;
  • 在策略启动前验证必需环境变量;
  • 在资产已知后初始化品种专属元数据;
  • 在收尾后写出运行时诊断数据。

每个节点都有 can_fail 设置。

  • can_fail = false 表示结果不成功时应停止运行。
  • can_fail = true 表示 AQE 记录失败并继续。

启动和初始化逻辑通常应严格处理。收尾逻辑通常可以容忍失败,而不停止其余清理工作。

Universe Model 节点通过程序返回品种代码。当静态交易标的列表过于受限时,它们很有用。

以下场景可使用 Universe Model 节点:

  • 加载自选列表;
  • 按元数据筛选品种;
  • 按日期或市场状态选择品种;
  • 根据账户、经纪商或风险约束选择品种;
  • 在多个策略之间共享相同的标的池选择逻辑。

最终 AQE 标的池是生成策略返回的静态集合与每个已连接模型结果的并集。重复品种会被移除。

因此,可以保留简单的静态标的池节点,再添加 Universe Model 节点来动态补充品种。

节点工作流程不是强制要求。对于小型策略,内联 Rust 往往已经足够:

  • 直接在 on_start 中添加启动代码;
  • 直接在 init 中添加逐资产配置;
  • 直接从 universe 返回品种代码;
  • 直接在 on_teardown 中添加清理代码。

如果代码需要独立文件、需要在 AQS 节点图中展示、需要通过属性面板配置,或需要复用,就可以使用节点。

  • 构造函数参数仅保留用户可调设置。
  • 仅运行时使用的状态放入 ctx.variables(),而不是结构体字段。
  • 生命周期节点用于配置和清理,而不是生成交易信号。
  • 将信号生成保留在 Alpha 模型中。
  • 将仓位计算、提交、取消、平仓和管理逻辑保留在信号处理器中。
  • 需要严格控制执行顺序时,将生命周期节点串联。
  • 返回清晰的 LifecycleResult 和 UniverseResult 消息,使日志和 AQS 界面提供有效信息。

启动阶段:

  1. 将 On Start Logic 连接到策略生命周期端口;
  2. 如果生成的 Alpha 模型或信号处理器注册逻辑依赖该组件,将执行时机设为 Before generated;
  3. 在 ctx.variables() 中填充共享初始状态;
  4. 返回成功的 LifecycleResult。

逐资产初始化:

  1. 将 On Init Logic 连接到初始化生命周期端口;
  2. 使用 asset 参数初始化品种专属状态;
  3. 按组件名称和资产代码存储该状态。

收尾阶段:

  1. 将 On Teardown Logic 连接到收尾生命周期端口;
  2. 除非失败必须使本次运行无效,否则设置 can_fail = true;
  3. 持久化或汇总运行时诊断信息。

标的池选择:

  1. 创建 Universe Model 节点;
  2. 实现 UniverseModel::run(ctx) -> UniverseResult;
  3. 仅返回该模型负责的品种代码;
  4. 由 AQE 将这些品种与静态集合和其他模型结果合并。