优化 cBot¶
optimize 命令会遍历 cBot 参数的不同取值组合, 根据你选择的评估标准找出表现较好的组合。它采用与 cTrader 桌面应用程序 相同的遗传算法或网格搜索方式, 但通过终端和包含参数设置的 JSON 文件执行。它是回测命令在优化任务中的对应功能。
适用范围 ¶
optimize 命令用于优化 cBot 参数。指标和插件各自有专用命令(indicator calculate、indicator history、create、build), 不属于优化范围。
前提条件 ¶
注意
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 文件仍会保存到该目录中。
验证优化是否正确应用 ¶
运行结束后, 请确认实际搜索的参数与预期一致。
- 在
--passes-dir中打开某轮次的.cbotset文件, 确认参与优化的参数在不同轮次之间发生变化, 而固定或未包含在文件中的参数保持不变。 - 如果搜索了不同的时间周期, 请检查每轮
.cbotset文件中的Chart.Period值。该值应与所选时间周期一致。 - 打开
.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 的内部版本或云端版本。 | 未知 | 切换为面向用户的本地版本。 |