コピートレーディング
マスター cTraderアカウントを1つ以上のスレーブアカウントにミラーリング — クロスブローカー、クロスcID — 送信先ごとのコントロール + マネーグレード精密調整付き。
コンセプト
- コピープロフィール — 1つのマスター(
SourceAccountId)+ 1つ以上の送信先。ライフサイクル:Draft → Running → Paused → Stopped(失敗時はError)。アグリゲートルート:CopyProfile(CopyDestinationを所有)。 - 送信先 — 1つのスレーブアカウント + マスターがどのようにコピーされるかに関する完全なルールセット。すべてのコンフィグは送信先ごとなので、1つのマスターが保守的なスレーブと積極的なスレーブに同時にフィードできます。
- コピーエンジンホスト — プロフィール用の実行中のワーカー(
CopyEngineHost)。マスター実行ストリームをサブスクライブし、各イベントをすべての送信先に適用します。 - スーパーバイザー —
CopyEngineSupervisor、各ノード上のバックグラウンドサービス。割り当てられたプロフィールをホストし、クラスター全体で自己復旧します(スケーリング参照)。
ミラーリング対象
| マスターイベント | スレーブアクション |
|---|---|
| マーケット/マーケットレンジポジションオープン | サイズ調整されたコピーをオープン(ソースポジションIDでラベル付け) |
| リミット/ストップ/ストップリミット保留中注文 | 一致する保留中注文を発注し、マスターのストップロス/テイクプロフィットを保有 |
| 保留中注文の修正 | ミラーされた保留中注文をインプレースで修正(そのストップロス/テイクプロフィットを含む) |
| 保留中注文のキャンセル/失効 | ミラーされた保留中注文をキャンセル |
| 部分クローズ | スレーブポジションの同じ割合をクローズ |
| スケールイン(ボリューム増加) | 追加ボリュームをオープン(オプトイン) |
| ストップロス/トレーリングストップ変更 | スレーブポジションの保護を修正 |
| 完全クローズ | スレーブコピーをクローズ |
すべてのコピーはソースポジション/注文IDでラベル付け。再接続後、ホストは精密調整から状態を再構築します:マスターが保有しているがスレーブが欠落しているコピーをオープンし、マスターがもはや保有していないスレーブの「孤児」をクローズ — 取引を重複させない。
プロフィールの作成
新規プロフィールでは専用のフルページフォーム(/copy-trading/new)が開きます。ダイアログではなく、オプションセットが大きいため、スマートフォンとデスクトップの両方でページの方が読みやすいです。すべてをあらかじめ収集します:プロフィール名、ソース(マスター)アカウント、送信先(スレーブ)アカウント(すべて選択ボタン付きマルチセレクト;選択されたマスターはスレーブリストから除外)、+ 完全な送信先オプションセット。cTrader Open APIを経由してリンクされたアカウントのみがマスターまたは送信先として選択可能です — コピーはOpen API経由で注文を発注するため、手動で追加された(cIDのみ)アカウントはコピーできず、リストに表示されません。リンクされたアカウントがない場合、ページは取引アカウントを指す通知を表示します。サイジングモード、方向、およびシンボルフィルターは人間が読めるラベルとして、マネーマネジメント ヘルプツールチップのモードごとの箇条書き説明を伴ってレンダリングされます。すべてのコントロールにはヘルプツールチップが付属し、その機能と使用方法を説明します。構造化入力は適切に検証されたコントロールを使用します — 数値/パーセンテージは数値フィールド経由、モード/方向/フィルターはセレクト経由、シンボルフィルターはシンボルチップの追加/削除リスト経由、シンボルマップはソース → 送信先(× 乗数)行の追加/削除テーブル経由 — カンマ区切りのテキストブロブではありません。すべての入力は保存前に検証されます — 欠落している名前/ソース/送信先、非正のサイジングパラメータ、負の/矛盾するロット境界、範囲外のドローダウン%、注文タイプなし、または空のシンボルフィルターはエラーリスト + 保存ブロックとして表示されます。作成時に、プロフィールが作成され、選択されたすべてのスレーブが選択された設定で追加され、ページはコピートレーディングリストに戻ります。
インポート / エクスポート。 設定ブロック全体をJSONファイルにエクスポートして再度インポートし、フォームをプリフィルすることで、調整を再入力せずにプロフィール全体で再利用できます。シンボルマップも同様にCSVファイルとしてエクスポート / インポートできます(Source,Destination,VolumeMultiplier) — スプレッドシートで大きなブローカーシンボルマップを準備し、1ステップでロードします。同じシンボルコントロールとCSVインポート/エクスポートは、コピートレーディングページの送信先ダイアログでも利用可能です。
行アクションはライフサイクルを尊重します:スタートは実行されていないときのみ有効、ストップ + 一時停止は実行されているときのみ、削除は実行中は無効 + プロフィール + 送信先を削除する前に確認を求めます。
新しく開始したプロフィールは、ホストが参照データをロードし、最初の精密調整を実行する間、Starting ステータスを一時的に表示します(緑色のRunningではなく) — それはまだ送信先全体で注文をミラーリングしていません。その最初の精密調整が完了し、エンジンがコピーできる瞬間にRunningにフリップします。Startingは行コントロール用に実行されていますと扱われます(Startは無効、Stopとライブログは有効、編集/削除はブロック)、ウォーミングプロフィールは起動中に再開始または編集できません。ウォームアップフェーズは、プロフィールをホストするノード上でインプロセス追跡されます;別のレプリカでホストされるプロフィール(またはホストできないもの — そのソース/送信先アカウントはOpen API経由でリンクされていません)は、そのプレーンステータスを表示します。
送信先ごとのオプション
新規プロフィールページ、コピートレーディングページの送信先ダイアログ、またはPOST /api/copy/profiles/{id}/destinationsで設定:
- サイジング(
MoneyManagementMode+ パラメータ):固定ロット、ロット/表示金額乗数、バランス/エクイティ/フリーマージンに比例、固定リスク%、固定レバレッジ、自動比例、リスク-%-ストップから(M7)。プラス最小/最大ロット境界 + 強制最小ロット。リスク-ストップからは送信先を、マスターのストップロス距離から派生した独自バランスの設定パーセンテージをリスクするようにサイジングします(マスターリスク2% → スレーブ自動リスク2%):ロット = バランス×% ÷ (ストップ距離 × 契約サイズ)。マスターオープンは、ストップロスなしではサイジングする距離がありません → 設定された最大リスク フォールバック ロットを使用(M7)設定されている場合、そうでなければスキップ(no_stop_loss)推測されません。比例-エクイティ/フリーマージンは実際のアカウントエクイティからサイズオフ(バランス + Σ フローティング P&L、cTrader Open APIで派生。エクイティを提供しないため)、プレーンバランスではなく — したがってマスターがオープン利益/損失で座っているサイズコピーは正しい。使用マージンは精密調整APIによって露出されないため、フリーマージンはエクイティとして扱われます(正直で利用可能な資金プロキシ);他のモードはバランスを読み、追加の再評価ラウンドトリップをスキップします。 - 方向フィルター:両方/ロングのみ/ショートのみ。逆: 側面を反転(+ SL ↔ TP をスワップ)して、逆張りコピーを行います。
- 管理のみ(無視新規取引/クローズオンリー):ミラー閉鎖、部分閉鎖 + 既にコピーされたポジションの保護変更を行いますが、新規ポジション/保留中注文をオープンしない(スキップ
manage_only)。宛先を新規ポジションを開かずに削減するために使用します。 - 同期オープンオンスタート / 同期クローズドオンスタート(デフォルトオン):プロフィールの最初の精密調整で、マスターの事前存在するポジションのコピーをオープンするかどうか、+ マスターがプロフィール停止中にクローズしたコピーをクローズするかどうか。両方は開始時のみ適用 — ミッドラン再接続は常に完全に精密調整されるため、デシンク復旧は関係なく発生します。
- シンボルマップ + シンボルフィルター(ホワイトリスト/ブラックリスト)。各シンボルマップエントリは、オプションのシンボルごとボリューム乗数を搭載(cMAMシンボルごとオーバーライド)送信先のサイジングの上にコピーサイズをスケーリング(1 = 変更なし)。マップ全体はCSVとしてインポート/エクスポート(
GET …/symbol-map.csv、PUT …/symbol-map/csv;列Source,Destination,VolumeMultiplier) — 各行はドメイン値オブジェクトを通じて検証されるため、不正なファイルは無効なマップを作成できません。 - トレーディング時間ウィンドウ(C18) — 送信先ごとの毎日UTC ウィンドウ(
開始/終了分単位;終了排他的;開始 == 終了= 終日)。ウィンドウ外でのニューオープンはスキップ(trading_hours);開始 > 終了のウィンドウは真夜中を越えます(例:22:00–06:00)。既存のポジションは管理されたままです。 - ソースラベルフィルター(C18、MTマジックナンバーフィルターのcTrader相当) — 設定時に、マスター取引をコピーしますが、ラベルが正確に一致します(例:1つのボットの取引、または手動のみラベル);そうでなければスキップ(
source_label)。空 = すべてをコピー。マスターポジション/注文のTradeData.LabelからExecutionEvent.SourceLabelで実行され、精密調整時にも尊重されます。 - アカウント保護(ZuluGuard/グローバルアカウント保護) — 送信先のライブエクイティを監視(
バランス + Σ フローティング P&L、すべてのCopyDefaults.EquityGuardIntervalポーリング)StopEquityフロア以上/またはオプションのTakeEquity天井に対して。侵害時に適用モード:CloseOnly(新しいコピーを停止、既存を継続管理)、Frozen(オープンを停止)、SellOut(送信先上のすべてのコピーを直ちにクローズ)。発動後、送信先はラッチ — ホストが再開始されるまで新規オープンなし — +CopyAccountProtectionTriggeredアラートが上がります。SellOutにはStopEquityが必要;TakeEquityはStopEquityより上に座る必要があります。保証なし警告: セルアウトはマーケット実行を使用 — すべての競合他社の同等として、高速/ギャップマーケットで約定価格を保証できません。 - フラッテンオール パニックボタン(C8) —
POST /api/copy/profiles/{id}/flattenはすべての送信先上のすべてのコピーポジションを直ちにクローズ + ニューオープンに対してロック。ルーティング クロスプロセス:APIフラグを設定、スーパーバイザーは実行中のホストに配信(トークン回転チャネル再利用)、その場で平坦化;フラグはクリア正確に1回発動(CopyFlattenAllアラート)。ユーザーはプロフィールを一時停止/停止します。 - プロップファーム ルールガード(C7) — プロップファーム コピーユーザーが要求する執行。送信先ごと、日次損失上限(日の開始エクイティからの損失)および/またはトレーリング ドローダウン制限(ランニング ピークエクイティからの損失)、両方デポジット通貨。侵害時、送信先が自動フラッテン(すべてのコピーがクローズ)+ ロックUTC日の残り(新規オープンスキップ
prop_lockout);CopyPropRuleBreachedアラートが発動。ロックアウトはUTC日がロールオーバーするとクリア(新規ベースライン/ピーク取得)。アカウント保護と同じライブエクイティポールを共有します。 - 実行ジッター(C11、デフォルトではオフ) — 各コピーを配置する前にランダム
0..Nmsの遅延、ユーザーの独自のアカウント全体でほぼ同一の注文タイムスタンプを相関させ解除します。コンプライアンス警告: コピーを許可するプロップファームの援助 — 許可しないファームを回避するツールではなく;ファームのルール内に留まることはあなたの責任です。 - 設定ロック(C9) — 期間に対する送信先の設定をフリーズ(
POST …/destinations/{id}/lock分付き)。ロック中に、送信先を削除できません(アグリゲートはCopyDestinationConfigLockedで拒否) — ドローダウン中の衝動的な変更に対する意図的なガード。ロックはそのタイムスタンプで自動的に期限切れになります。 - 一貫性事前アラート(C10) — 警告(UTC日ごとに1回)送信先の日次利益が日の開始エクイティの設定パーセンテージに到達するとき(
CopyConsistencyThresholdApproaching)、プロップファーム一貫性ルールがその前に尊重されます**トリップ。利益側、損失側ロックアウトから独立;プロップルールガードと同じ日ベースラインから実行されます。 - 注文タイプフィルター — マスター注文タイプをコピーするかを正確に選択:マーケット、マーケットレンジ、リミット、ストップ、ストップリミット(
CopyOrderTypesフラグ;デフォルトすべて)。cMAMスタイルの選択性。 - コピーSL / コピーTP — ミラーマスターのストップロス/テイクプロフィット、または保護を独立管理。オープンポジションと保留中注文の両方に適用 — リミット/ストップ/ストップリミットコピーはマスター注文のSL/TP付きで発注・修正されます(逆では交換),保護は保留中が填補されるその瞬間に添付されます、その後だけではなく。
- コピートレーリングストップ、ミラー部分クローズ、ミラースケールイン — それぞれ独立切り替え可能。
- コピー保留中の失効(デフォルトオン) — ミラーマスター保留中注文のGood-Till-Date失効タイムスタンプ。
- コピーマスタースリッページ(デフォルトオン) — マーケットレンジ + ストップリミット注文、スレーブ注文をマスターの正確なスリッページインポイントで配置(ベース価格はスレーブのライブスポットから取得)。
- ガード:最大ドローダウン%、日次損失上限、最大コピー遅延、スリッページフィルター(マスターエントリーから価格がNピップ以上動いた場合、コピーをスキップ)。最大コピー遅延は注入
TimeProvider経由のマスターイベントの実際のサーバータイムスタンプ(ExecutionEvent.ServerTimestamp)に対して測定:設定された最大ラグより古いシグナルがスキップされるため、古いコピーは決して遅く配置されません(以前は遅延常にゼロ + ガード無効)。 - SL/TP精度正規化(M6) — コピーされたストップロス/テイクプロフィット価格は修正前に送信先シンボルの桁精度に丸め(ポジションおよび保留中注文の発注/修正で)、マスター価格がより細い精度(またはクロスブローカー桁不一致)は、サーバーの
INVALID_STOPLOSS_TAKEPROFITをトリップしません。 - リジェクション サーキットブレーカー / フォロワーガード(G8) — 送信先が
CopyDefaults.RejectionBudgetオープンをリジェクト行はトリップ:クールダウン期間中の新規オープンなし(CopyDestinationTrippedアラート発動)、リジェクションストームが(プロップファーム)アカウントをハンマリングするのを停止します。既存のポジションは管理されたままトリップ中も + クローズ;ブレーカーはクールダウン後自動リセット + 成功したコピーがカウンターをクリア。 - ロット衛生天井(C14) — 絶対最大コピーサイズおよび/または複数マスター上限。計算されたコピーが絶対上限を超える、または
N×マスター独自のロットサイズを超える場合、ハードブロック(lot_sanityスキップとして表示、cmind.copy.skippedでカウント)配置されない — 破滅的オーバーサイズクラスに対する防御(0.23-ロットマスターが実行ウェイマルチプライヤーまたは丸めバグ経由で各受信機で3ロットに変わる)。両側面デフォルト0(オフ)。
信頼性とエッジケース
エンジンはいつでも何かが失敗する可能性がある現実のために構築:
-
スレーブ保留中フィル相関タイムアウト(C13) — マスター保留中が消えた(静止中も新たに充填中もない)ミラーされたスレーブ保留中は相関タイムアウト後キャンセル、スレーブコピーが相関なく管理されていないポジションに充填できない(
CopyPendingTimedOut)。精密調整もオーダー-IDでラベル付けされた充填保留中孤児をクリーンアップ。 -
クロスブローカー保留中フィルレース — スレーブ独自の保留中は、マスターのフィル/キャンセルイベント処理前の小さなウィンドウで充填できます(その価格ヒット)。それはソース注文 IDでラベル付けされたスレーブポジションを残します、正規のクローズ/SL-TPパス(ソースポジション IDでキー化)はそれを見逃します。マスターフィル時に、初期スレーブフィルは引退し、正規にラベル付けされたマーケットコピーで置換 — 送信先は正確に1つのコピーで終わる、重複したポジションは決してありません;マスターキャンセル時にそれは完全にクローズ(マスターは取引を決して実行しなかった)。両方は直ちに行動、次の精密調整時だけではなく。スレーブ側SL/TPヒットがマスターがまだ保有するコピーをクローズするのはソース駆動で、次の調整の再オープン(エンジンはマスターイベントをミラー;それは送信先側の実行を消費しません)。
-
堅牢なクローズ/フラッテン(M8) — 精密調整で孤児をクローズ、またはガード侵害時にフラッテン、ブローカーが既にクローズした位置を許容(
POSITION_NOT_FOUND):各クローズは独立して実行、1つの古いIDは精密調整をアボートまたはアカウント残りをフラッテンしません。 -
マスターが既に取引中に開始 — 開始時、ホストは精密調整 + マスターの既存ポジションのコピーをオープン。
-
接続ドロップ/デシンク — 再接続時、ホストは精密調整:欠落しているコピーをオープン、孤児をクローズ、ペンディングを再ラベル。重複注文なし。
-
注文配置失敗 — 1つの送信先での失敗はログされ、他の送信先をブロックしない。
-
cIDごと単一有効トークン — cTrader は新しいトークン発行の瞬間cIDの古いアクセストークンを無効化。cMindは実行中のホストのトークンをその場でスワップ(ライブソケット上で再認証)、コピーはストリーム削除なく継続。トークンライフサイクルを参照。
監査可能性
すべてのアクション毎にソース生成ログイベント(LogMessages)発出プロフィールID、送信先cID、注文/ポジションID、+ 値 — 注文配置/スキップ(理由付き)、部分クローズ、保護適用、トレーリング適用、ペンディング配置/修正/キャンセル、失効ミラー、マーケットレンジスリッページミラー、トークンスワップ、精密調整サマリー。これはコンプライアンス + 紛争解決の監査証跡です。
ログと一緒に、エンジンはOpenTelemetryメトリクスをcMind.Copyメーター上に発出(共有OTeelパイプラインに登録、OTLP/Azure Monitor等で他のようにエクスポート):cmind.copy.latency(マスターイベント → ディスパッチ、ms)、cmind.copy.dispatch.duration(すべての送信先にファンアウト、ms)、cmind.copy.slippage.points、cmind.copy.placed(送信先でタグ付け)、cmind.copy.skipped(理由でタグ付け)、+ cmind.copy.failed。これらは遅延/スリッページ回帰をログ行ですみぱい見える — ライブスイート上に対して測定可能にします。
API
GET /api/copy/profiles— リスト。POST /api/copy/profiles— 作成(オプション送信先アカウントID付き)。GET /api/copy/profiles/{id}— すべての送信先オプション含め完全詳細。POST /api/copy/profiles/{id}/destinations— 完全なオプションセット付き送信先を追加。DELETE /api/copy/profiles/{id}/destinations/{destinationId}— 削除。POST /api/copy/profiles/{id}/{start|pause|stop}— ライフサイクル。
テスト
- ユニット(
tests/UnitTests/CopyTrading) — サイジングモード、決定フィルター、注文タイプフィルター、失効コピー、マーケットレンジ/ストップリミットスリッページ、SL/TPトグル、部分クローズ、ペンディング修正/キャンセル、オープンで開始、切断→デシンク→精密調整、その場トークンスワップ、クロスcID無効化。FakeTradingSession、cTrader忠実なインメモリシミュレーターに対して実行。 - 統合(
tests/IntegrationTests/CopyLive) — ノードアフィニティ/リース請求、実際のPostgres上トークンバージョン伝播。 - E2E(
tests/E2ETests) — 送信先オプションラウンドトリップAPI + UI、完全なライフサイクル。 - ストレス / DST(
tests/StressTests) — 決定論的シミュレーションテスト:シード付きランダム化ワークロード + 障害注入(ソケットフラップ、注文リジェクション、マーケットレンジリジェクション、トークン回転、ノード死亡)CopyEngineHostを静止状態に駆動 + 収束不変条件をアサート。テスト/ストレステスト.mdを参照。このスイートは実際の起動レース表面化 + 修正:OnReconnectedは初期参照ロードおよび精密調整の前に配線、ソケットフラップ起動時に2回目の精密調整を同時実行可能 + ホストの非同時状態辞書を破損 — 起動ロード + 最初の精密調整は_stateGate下で実行。 - ライブ — 実際のcTrader デモアカウント;テスト/ライブコピートレーディング.mdを参照。
開発資格情報.mdを参照。ライブ + E2E層読み込み用単一資格情報ファイル。
プロフィールコントロールと送信先管理
スタート/ストップは各プロフィール行のアイコンボタン(アクションが適用されないときは無効)。ソースと送信先アカウントはアカウント番号で表示、内部IDは決して表示されません。プロフィールをクリックすると、送信先アカウントを管理するダイアログが開きます(完全な送信先オプション設定で追加/削除)。