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つ使用するため、最適化では指定値とほぼ同じ数のスレッドが使用されます。指定できるのは1以上の整数です。デフォルト値は、プロセッサー数の半分に1を加えた値です。小規模なVPSでは、他の処理用のリソースを確保するために値を小さくしてください。専用マシンでは値を大きくして、遺伝的アルゴリズムによる探索をより多くのスレッドに分散できます。--auto-select-best– 最適化の完了時に最良のパスを自動選択し、最も良い結果を得た設定の.cbotsetファイルを追加操作なしですぐに使用できるようにします。
注意
optimizeコマンドで使用するのは--periodではなく--timeframeです。 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を指定して追加します。
メインの時間枠を最適化する ¶
optimizeコマンドでは、cBotのパラメータだけでなく、メインの時間枠も複数の値で探索できます。メインの時間枠は2つの方法で指定でき、--timeframeが優先されます。
--timeframe <tf>– 値を1つ指定するとメインの時間枠が固定され、カンマ区切りで複数指定すると複数の時間枠が探索対象になります。- パラメータファイル – デスクトップアプリからエクスポートしたファイルには、この目的に使用する時間枠専用の仮想パラメータがすでに含まれています。
データの基準時間枠には、単一の指定値、固定値、または探索対象の中で最も短い時間枠が使用されます。
時間枠とデータモードの互換性 ¶
探索または固定するメインの時間枠は、選択した--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 | pips単位のスプレッド。 | 両方 |
--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は、検証エラーが発生すると必ず0以外の終了コードを返します。そのためスクリプトは、メッセージを解析しなくても最初のエラーで停止できます。
表にある終了コードは、cTrader CLIからシェルに返される値です。具体的な数値コードは公開されていません。そのためnon-zeroは固有の公開コードがないエラーを、unknownはビルドの切り替えやサポートへの問い合わせが必要な内部エラーを示します。
| 症状 | 考えられる原因 | 終了コード | 対処方法 |
|---|---|---|---|
検証エラー:--paramsが指定されていない | JSONパラメータファイルが指定されていません。 | 0以外 | --params=<path>を指定してください。 |
| 検証エラー:不明な時間枠 | --timeframeの値が認識可能な識別子と一致しません。 | 0以外 | ctrader-cli periodsを実行し、一覧にある識別子のいずれかを使用してください。 |
| 検証エラー:無効なメインの時間枠 | 選択した--data-modeと互換性のない時間枠が指定されています。 | 0以外 | 別の時間枠または--data-modeを選択してください。 |
| 検証エラー:評価基準の組み合わせの形式が正しくない | 指標名が正しくないか、方向がmaxでもminでもありません。 | 0以外 | 対応する指標名のいずれかとmaxまたはminを組み合わせて使用してください。 |
| 検証エラー:不明な評価指標 | --criteriaに指定した名前が対応する指標の一覧にありません。 | 0以外 | Criteriaセクションに記載された指標名のいずれかを使用してください。 |
検証エラー:--methodの値が不明 | --methodの値がgeneticでもgridでもありません。 | 0以外 | --method=genetic(デフォルト)または--method=gridを使用してください。 |
--fitnessと--criteriaを同時に指定している | これら2つのオプションは併用できません。 | 0以外 | --fitnessと--criteriaのどちらか一方だけを指定してください。 |
optimizeが使用できない | CLIの内部版またはクラウド版が使用されています。 | 不明 | ユーザー向けのローカル版に切り替えてください。 |