メインコンテンツまでスキップ

cBot のビルドとバックテスト

ブラウザ内 Monaco IDE から cTrader cBots (C# および Python、両方とも .NET) をビルド、実行、バックテストし、公式 ghcr.io/spotware/ctrader-console イメージで実行します。

ビルド​

  • Builder ページが Monaco エディタをホストします。CBotBuilder はプロジェクトを一時的なコンテナ内で dotnet build でコンパイルします (AppOptions.BuildImage、作業ディレクトリは /work にバインドマウント)。信頼できないユーザーの MSBuild ターゲットがホストに到達しません。NuGet リストア はビルド間で共有ボリュームを経由してキャッシュされます。Web ホストは Docker ソケットアクセスが必要です。
  • C# および Python スターターテンプレートは src/Nodes/Builder/Templates/ に存在します。

実行とバックテスト​

  • Instances = TPH 状態階層 (Run/Backtest × Pending/Scheduled/Starting/ Running/Stopping/Stopped/Failed)。遷移はエンティティを置き換えます (ID が変更)。 コンテナ ID は保持されます。
  • NodeScheduler は最も負荷の低い適格ノードを選択します。ContainerDispatcherFactory はリモートノード HTTP エージェントまたはローカル Docker ディスパッチャーにルーティングします。
  • 完了ポーラーは終了したコンテナを調整します (バックテストコンテナは --exit-on-stop 経由で自動終了します)。レポートが存在 → 完了 (store ReportJson)、存在しない → 失敗。
  • ライブコンテナログは SignalR 経由でブラウザにストリーミングされます。バックテストの株式曲線はレポートから解析されチャート化されます。

バックテストマーケットデータはアカウントごとにキャッシュされます​

cTrader Console は履歴ティック/バーデータを --data-dir にダウンロードします。そのディレクトリはトレーディングアカウント (そのアカウント番号) をキーとした安定した永続キャッシュです。ノードのディスクからそのコンテナパス (/mnt/data) にバインドマウントされ、インスタンスごとの作業ディレクトリから別個の、ネストされていないマウントです。したがって、同じアカウント上のすべてのバックテストは既にダウンロード済みデータを再利用し、実行ごとに再度ダウンロードする代わりになります。(以前、データディレクトリはインスタンスごとの作業ディレクトリ下に存在し、そのディレクトリ ID は実行ごとに変更されていたため、すべてのバックテストで新しいダウンロードが強制されていました)。一時的なインスタンスごとの作業ディレクトリはアルゴリズム、パラメーター、パスワード、レポートを保持します。共有データキャッシュはノードのバックテストデータ使用量に計上され、ノードクリーンアクションによってクリアされます。

バックテスト設定​

Backtest ダイアログは、ユーザーが調整可能な cTrader Console バックテスト設定を公開しているため、コマンドラインに触れる必要はありません。

  • Symbol / Timeframe — タイムフレームはすべての cTrader ピリオドのドロップダウン (t1…t1000、 m1…m45、h1…h12、D1/D2/D3、W1、Month1 および Renko/Range/Heikin ピリオド)。コンソールの正規形式で有効な --period を常に選択できます。
  • From / To — バックテストウィンドウ (--start / --end)。
  • Data mode — 3つの cTrader モードの1つ (--data-mode):Tick data (tick、正確)、 m1 bars (m1、高速)、または Open prices only (open、最速)。
  • Starting balance — 10000 がデフォルト (--balance)。0 の残高は取引を一切行わず、cTrader が空のレポートを生成して (その後クラッシュします) ("Message expected")。ゼロ以外の残高は常に送信されます。
  • Commission — --commission。
  • Spread — --spread、0 以下に落とせない数値フィールド (pips)。Tick data モードでは非表示。cTrader はティックデータ自体から スプレッドを導出します (--spread は送信されません)。

データディレクトリ (--data-file / --data-dir) はアプリ自体で管理され (アカウントごとのキャッシュ、上記参照)、ダイアログに公開されていません。

:::note cTrader が空のバックテストでクラッシュします バックテストが結果を生成しない場合 — 取引がない、または選択した日付/シンボルに対してマーケットデータがない場合 — cTrader Console の独自のレポートライターは Message expected をスローし、レポートなしで終了します。アプリはこの上流のバグを修正することはできませんが、それを検出し、インスタンスをFailed にマークします。生のスタックトレースの代わりに、実行可能な理由 ("選択した範囲に対してバックテスト結果がありません…") が表示されます。選択可能なマーケットデータを持つより広い日付範囲を選択して、再試行してください。 :::

インスタンス詳細ページ​

インスタンスを開く (/instance/{id}) とそのライブステータス、ログ、および — バックテストの場合 — 株式曲線が表示されます。ブラウザタブタイトルは特定のインスタンス (cBot 名 · 種類 · シンボル、例: TrendBot · Backtest · EURUSD) を反映しているため、ライブ実行タブとバックテストタブは一目でわかります。同じ cBot の実行とバックテストは異なる血統 (状態遷移間で保持される安定した血統 ID) として追跡されます。ページは正確に1つのインスタンスのみを追跡し、実行のデータとバックテストのデータを混在させることはありません。

インスタンスライフサイクル制御​

各インスタンス行 (およびその詳細ページ) は状態に適切な制御があります。アクティブな インスタンスは Stop を表示します。終了した もの (Stopped / Completed / Failed) は Start (▶) を表示して、同じ cBot、アカウント、シンボル、タイムフレーム、パラメーターセット、イメージで再度起動します (実行は実行として再開、バックテストはバックテストとして)。Stop をクリックすると "Stopping…" 通知が表示され、それが解決されるまでアイコンは無効化され、新しく作成された実行がリストに即座に表示されます — ページ再読み込みなし。

コンソールログはインスタンスが終了すると永続化されます — 実行の場合 (Stop 時) とバックテストの場合 (完了時) 同様 — そのため前回実行のログは詳細ページで表示可能なままです。また、ログツールバー経由ではクリップボードにコピー (Copy logs アイコン) またはダウンロード (Download logs アイコン) が可能です。コンテナが消失した後でも同様です。両者はオンスクリーン末尾だけではなく、インスタンスの完全なコンソールログに対して動作します。

完了したバックテストは、そのcTrader レポートを両方の形式で永続化します — 生の JSON (株式曲線と AI 分析が読み込む同じもの) および完全な HTML レポート。両者は、バックテスト行および詳細ページから専用アイコン経由でダウンロード可能です。最後の実行のレポートのみが保持され、アイコンはまだ開始されていない、実行中または失敗したバックテストに対して無効化されます (そして実行インスタンスに対しては決して表示されません) — 完了したバックテストのみがダウンロード可能なレポートを持ちます。

アップロードされた .algo はここでビルドされなかったため、cBots ページの Last Build 列は空白です (ブラウザでビルドした cBots にのみビルド時刻を表示します)。

停止したインスタンスを編集して再実行​

停止したインスタンス (実行またはバックテスト) にはEdit 制御があります — リスト内のその行 および 詳細ページの Start/Stop の横にあるアイコン — ダイアログを開きます。現在の構成でプリフィルされています。トレーディングアカウント、シンボル、タイムフレーム、パラメーターセット、イメージタグ (および、バックテストの場合、ウィンドウおよび上記すべてのバックテスト設定)を変更してから、Save & start は新しい設定で再度起動します (停止したインスタンスを置き換えます)。制御はインスタンスがアクティブな間は無効化されます — 停止したインスタンスのみを編集可能です。

コードエディタから実行​

コードエディタで Run をクリックすると、盲目的でハード コード された実行を発行するのではなく、ダイアログが開きます。

  • トレーディングアカウント (必須) — cBot が接続する cTrader アカウント。
  • パラメーターセット (オプション) — 既存のセットを選択するか、cBot の デフォルトパラメーター値で実行するために空白のままにします。セレクターの横の + ボタンは新しいパラメーターセットをインラインで作成し (以下参照)、それを選択します。
  • Symbol / Timeframe のデフォルトは EURUSD / h1 であり、変更可能です。Cancel または Run。

Run 時、エディタは現在のソースを保存+ビルドし、選択されたアカウントで選択されたパラメーターでインスタンスを開始して、ライブコンテナログを末尾に追従します。(ログストリームは署名済みユーザーの認証クッキーを /hubs/logs SignalR ハブに転送するため、Invalid negotiation response received で失敗する代わりに接続します。)

パラメーターセット​

パラメーターセットは、名前付きの再利用可能な cBot パラメーターオーバーライドのセット。フラット JSON オブジェクトとして保存され、各パラメーター名をスカラー値にマッピングします。例: {"Period": 14, "Label": "trend"}。実行/バックテスト時には cTrader params.cbotset ファイルに変換されます ({ "Parameters": { … } })。cBot の Parameter sets ダイアログからセットを作成/編集できます。生の JSON またはRun ダイアログからインラインで。

すべてのパラメーターセットは cBot に属します。新規パラメーターセットダイアログはすべての cBot をリスト表示し、1つを選択する必要があります — cBot が選択されるまで作成はブロックされています。セットの名前は cBot ごとにユニークです。セットの名前を変更して、同じ cBot の別のセットが既に使用している名前にすると、拒否されます (ダイアログの明確なエラー、API で 409 Conflict)。同じ名前は異なる cBot で再利用されます。

JSON は保存時に検証されます。単一のフラットオブジェクトでなければならず、その値はすべてスカラーです (string / number / bool)。非オブジェクトルート、配列、ネストされたオブジェクト、null 値、またはマルフォーム JSON は拒否されます (ダイアログの明確なエラー、API で 400 Bad Request)。空のオブジェクト {} は許可され、"オーバーライドなし" を意味します。

cTrader Console CLI ノート​

バックテストには --data-mode (デフォルト m1) が必要です。日付は dd/MM/yyyy HH:mm として、および params.cbotset JSON 位置引数。run は --data-dir を拒否します (バックテストのみ)。ContainerCommandHelpers を参照してください。

ノードとスケール​

実行容量はノードエージェントを追加することによってスケールします (自動登録+ハートビート)。ノード発見およびスケーリングを参照してください。

トレーディングアカウントが必要です​

cBot を実行またはバックテストするには、接続する cTrader トレーディングアカウントが必要です。Trading accounts の下に追加するまで、Run New cBot / Backtest New cBot ボタンは無効化されます (ツールチップ付き)。ページは生の stream connect failed エラーをアカウントなしの bot から取得することはなくなります。代わりに、アカウント設定へのリンク付きプロンプトを表示します。