跳转至

优化 cBot

optimize 命令会遍历 cBot 参数的不同取值组合, 根据你选择的评估标准找出表现较好的组合。它采用与 cTrader 桌面应用程序 相同的遗传算法或网格搜索方式, 但通过终端和包含参数设置的 JSON 文件执行。它是回测命令在优化任务中的对应功能。

适用范围

optimize 命令用于优化 cBot 参数。指标和插件各自有专用命令(indicator calculate、indicator history、create、build), 不属于优化范围。

前提条件

  • 已安装 cTrader CLI, 且能够登录。
  • cBot 已导出为 .algo 文件, 并针对 .NET 8 完成编译。
  • 准备好指定待优化参数的参数文件。

注意

optimize 命令仅在 cTrader CLI 的本地版本中提供。内部版本和云端版本均不包含此命令。

optimize 命令

ctrader-cli optimize <path-to-algo-file> --params=<path-to-params-file> [options]

第一个参数是 .algo 文件的路径。必须指定 --params 选项。基础时间周期必须通过 --timeframe 或参数文件指定。如果两处均未指定, 命令会报错并停止。

优化选项

只有 --params 是必填选项。下方示例使用的常见可选项包括 --timeframe、--method、--criteria、--optres 和 --passes-dir。

开始之前, 建议了解以下选项:

  • --method - genetic(默认)或 grid。如果参数组合数量较少, 且需要测试所有组合, 请选择 grid; 如果组合数量较多, 使用引导式搜索更高效, 请选择 genetic。
  • --cores - 并行执行每轮优化回测任务的工作进程数量。每个工作进程占用一个 CPU 线程, 因此优化过程中使用的线程数大致与此选项的取值相同。允许使用大于或等于 1 的整数。默认值为处理器数量的一半加一。在配置较低的 VPS 上, 可以减小该值, 为其他任务预留资源; 在专用计算机上, 可以增大该值, 将遗传算法搜索分配到更多线程。
  • --auto-select-best - 优化结束时自动选择表现最佳的轮次, 无需额外操作即可使用相应的 .cbotset 参数文件。

注意

optimize 命令使用 --timeframe, 而不是 --period。 run 和 backtest 命令仍然使用 --period。如果向 optimize 传入 --period, 系统会将其作为未知选项拒绝。

参数文件

--params 指定的文件是一个包含 parameters 数组的 JSON 对象。其结构与 cTrader 桌面应用程序优化界面导出的文件相同, 因此可以直接使用从桌面应用程序导出的文件。

{
  "parameters": [
    { "Name": "SlowPeriods",  "Optimize": true, "Min": "5",  "Max": "50", "Step": "5" },
    { "Name": "StopLossPips", "Optimize": true, "Min": "10", "Max": "60", "Step": "5" },
    { "Name": "MAType",       "Optimize": true, "Values": ["0", "1", "2"] },
    { "Name": "MySymbol",     "Optimize": true, "Values": ["EURUSD", "GBPUSD"] }
  ]
}

字段规则

  • Name 为必填字段, 其值必须与 cBot 的属性名称一致。运行 ctrader-cli metadata <path-to-algo> 以查看可用的属性名称。如果某个名称不在 cBot 的元数据中, 系统会记录日志并跳过该参数, 然后继续优化其他参数。
  • 将 Optimize 设为 true, 即可将该参数纳入搜索。设为 false 则将该参数固定。
  • 对于整数和双精度浮点数等范围型参数, 若要搜索不同取值, 需要设置 Min、Max 和 Step。
  • 对于枚举值和交易品种等离散值参数, 若要搜索不同取值, 需要设置非空的 Values 数组。
  • ParameterType 为可选字段。如果省略此字段, 系统会根据 Name 匹配 cBot 元数据, 推断参数类型。

将参数固定为单一取值

要将参数固定为某个值, 请在文件中添加该参数, 并设置 Optimize: false 和对应的 Value:

{ "Name": "MAType",      "Value": "1", "Optimize": false },
{ "Name": "FastPeriods", "Value": "5", "Optimize": false }

警告

参数文件中的设置具有优先权。应用参数文件之前, cTrader CLI 会重置所有参数, 因此只会搜索文件中明确设置为 Optimize: true 的参数。完全未出现在文件中的参数会保留其默认值, 即使 cBot 默认将该参数设置为参与优化也是如此。要将参数纳入优化, 请在文件中添加该参数并设置 Optimize: true。

优化主要时间周期

除 cBot 参数外, optimize 命令还可以搜索不同的主要时间周期。主要时间周期可以从两个来源获取, 其中 --timeframe 具有优先权。

  • --timeframe <tf> - 指定单个值会固定主要时间周期; 指定以逗号分隔的多个值则可搜索不同的时间周期。
  • 参数文件 - 从桌面应用程序导出的文件已包含用于此目的的合成时间周期参数。

数据的基础时间周期取决于唯一指定的值、固定值, 或参与搜索的最小时间周期。

时间周期与数据模式的兼容性

参与搜索或固定的主要时间周期必须与所选 --data-mode 兼容。

数据模式 有效的主要时间周期
open 必须是同一类型的时间周期, 且为所选最小时间周期的整数倍。
m1 或 m1-csv 支持所有基于时间的时间周期; 不支持 Renko 图和区间柱图等非时间型周期。
ticks 任意非自定义时间周期。

注意

如果组合无效, 命令会在加载数据之前停止, 并显示导致错误的具体值。

评估标准

--criteria 中的每个条目都将一项绩效指标与优化方向 max 或 min 配对, 例如 NetProfit:max。下表列出所有受支持的指标名称及其衡量内容。

指标 衡量内容
NetProfit 以账户货币表示的最终盈利或亏损
ProfitFactor 总盈利除以总亏损
MaxEquityDrawdownPercentages 净值从峰值到谷值的最大百分比回撤
MaxBalanceDrawdownPercentages 余额从峰值到谷值的最大百分比回撤
MaxEquityDrawdown 以账户货币表示的净值最大绝对回撤金额
MaxBalanceDrawdown 以账户货币表示的余额最大绝对回撤金额
WinningTrades 盈利平仓交易的数量
LosingTrades 亏损平仓交易的数量
TotalTrades 已平仓交易总数
AverageTrade 净利润除以已平仓交易数量

如果要最大化净利润, 同时最小化净值最大回撤:

--criteria="NetProfit:max,MaxEquityDrawdownPercentages:min"

要使用自定义排序方式, 请改用 --fitness。 cBot 的 GetFitness 方法会返回评分, 优化过程会保留返回值最高的轮次。 --fitness 和 --criteria 不能同时使用, 请只指定其中一个。

测试环境选项

optimize 沿用 backtest 的测试环境选项。下表列出当前 CLI 支持的选项、各选项的作用, 以及适用时这两个命令之间的区别。

选项 用途 适用命令
--account 交易账户号码。 两者均适用
--symbol 用于测试的交易品种。 两者均适用
--start 测试区间的开始日期和时间。 两者均适用
--end 测试区间的结束日期和时间。 两者均适用
--balance 模拟测试的初始余额。 两者均适用
--data-mode open、m1、m1-csv、tick-csv 或 ticks。 两者均适用
--data-file m1-csv 或 tick-csv 使用的 CSV 文件路径。 两者均适用
--commission 每笔交易的佣金金额。 两者均适用
--spread 以 pip 为单位的点差。 两者均适用
--precise-conversion 在不同货币对之间使用精确汇率换算。 两者均适用
--timeframe 参数搜索的基础时间周期。 仅 optimize
--period 运行测试时使用的基础时间周期。 仅 backtest
--report 保存 HTML 报告的路径。 仅 backtest
--report-json 保存 JSON 报告的路径。 仅 backtest

注意

报告选项不适用于 optimize, 请改用 --optres 和 --passes-dir 保存优化结果。

示例

ctrader-cli optimize "C:/test/Sample Trend cBot.algo" \
  --params=C:/test/optimize-params.json \
  --account=1234567 --symbol=EURUSD --timeframe=h1,h2 \
  --start="01/01/2025" --end="01/02/2025" \
  --balance=100000 --data-mode=open --commission=30 --spread=2 \
  --method=grid \
  --criteria="NetProfit:max,MaxEquityDrawdownPercentages:min" \
  --auto-select-best \
  --optres=C:/test/result.optres \
  --passes-dir=C:/test/result-passes \
  --ctid=letstrade --pwd-file=C:/test/password.pwd

输出

optimize 运行期间会持续在终端显示进度:

Progress | Loading EURUSD, h1 | 42.00 % |
Progress | Optimization | 37.50 % |
  • 摘要 - 优化完成后, cTrader CLI 会在终端输出摘要, 包括轮次总数、运行时间以及最佳轮次及其统计数据。
  • 结果文件 - 指定 --optres 后, cTrader CLI 会将所有轮次的完整结果保存到 .optres 格式的 JSON 文件中。此文件采用与桌面应用程序优化结果相同的格式, 因此可以在桌面应用程序的优化界面中打开或导入。
  • 每轮报告 - 指定 --passes-dir 后, cTrader CLI 会将各轮次的报告文件保存到该目录中。每个轮次都有一个子文件夹, 内含 .html、.txt、.json 和 .cbotset 文件。 .cbotset 文件记录了该轮次所用参数的准确取值。

如果既不指定 --optres 也不指定 --passes-dir, 优化完成后只会显示摘要。

注意

optimize 命令不会生成汇总所有轮次的 HTML 报告。但如果指定了 --passes-dir, 各轮次的 HTML 文件仍会保存到该目录中。

验证优化是否正确应用

运行结束后, 请确认实际搜索的参数与预期一致。

  1. 在 --passes-dir 中打开某轮次的 .cbotset 文件, 确认参与优化的参数在不同轮次之间发生变化, 而固定或未包含在文件中的参数保持不变。
  2. 如果搜索了不同的时间周期, 请检查每轮 .cbotset 文件中的 Chart.Period 值。该值应与所选时间周期一致。
  3. 打开 .optres 文件, 或将其导入桌面应用程序的优化界面, 以便一起查看配置和所有轮次的结果。

参数验证与常见错误

下表的每一行都列出了错误表现、可能原因、发生错误时 cTrader CLI 返回的退出码, 以及建议采取的下一步操作。对于任何参数验证错误, cTrader CLI 都会返回非零退出码, 因此脚本无需解析错误消息, 就能在首次出错时停止。

表中的退出码是 cTrader CLI 返回给 Shell 的值。具体的数字退出码尚未公布。因此, non-zero 表示命令失败, 但没有单独的已公布错误码; unknown 表示内部错误, 需要更换程序版本或联系支持团队。

错误表现 可能原因 退出码 建议操作
验证错误: 缺少 --params 未提供 JSON 参数文件。 非零 指定 --params=<path>。
验证错误: 未知时间周期 --timeframe 的值与任何已识别的标识符都不匹配。 非零 运行 ctrader-cli periods, 并使用列表中的一个标识符。
验证错误: 主要时间周期无效 某个时间周期与所选 --data-mode 不兼容。 非零 选择其他时间周期或其他 --data-mode。
验证错误: 评估标准组合格式有误 绩效指标名称错误, 或方向不是 max 或 min。 非零 使用受支持的绩效指标名称, 并搭配 max 或 min。
验证错误: 未知评估指标 --criteria 中指定的某个名称不在受支持的指标列表中。 非零 使用 Criteria 部分列出的指标名称之一。
验证错误: --method 的值未知 --method 的值不是 genetic 或 grid。 非零 使用 --method=genetic(默认)或 --method=grid。
同时指定了 --fitness 和 --criteria 这两个选项不能同时使用。 非零 只指定 --fitness 或 --criteria 其中一个。
optimize 不可用 当前使用的是 CLI 的内部版本或云端版本。 未知 切换为面向用户的本地版本。