コンテンツにスキップ

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つ使用するため、最適化では指定値とほぼ同じ数のスレッドが使用されます。指定できるのは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ファイルがそのディレクトリに保存されます。

最適化が正しく適用されたことを確認する

実行後、意図したパラメータが探索対象になっていたか確認してください。

  1. --passes-dirにある各パスの.cbotsetファイルを開き、最適化対象のパラメータがパスごとに変化し、固定したパラメータやファイルから省略したパラメータは一定のままであることを確認します。
  2. 時間枠も探索した場合は、各パスの.cbotsetファイルにあるChart.Periodの値を確認します。その値は、選択した時間枠と一致している必要があります。
  3. .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の内部版またはクラウド版が使用されています。 不明 ユーザー向けのローカル版に切り替えてください。