🚀 TradeCopierBot — 高速でクリーン、ブローカーに強いトレードコピー(ローカル/VPS)🔁✨
トレードを MASTER アカウントから1つ以上の SLAVE アカウントへ、実際の取引環境向けに設計された軽量でイベント駆動型のコピーツールでコピーします: 異なるブローカー、異なるシンボル名、異なるロットルール。
マルチアカウント実行に最適、リスクスケーリング、および 戦略配布—詳細なデバッグログ付きで、常に何が起きているか把握できます。🧠📈
✅ ローカル/VPS セットアップ(同一マシン)に最適化。
❌ cTrader Cloudには対応していません(インスタンスが分離されているため、シグナルを共有できません)。☁️🚫
注意:異なるcTraderアカウントが2つある場合は、2つのcBotを購入する必要があります。そうしないとコピーできません。ご不明な点はお気軽にお問い合わせください。
🧠 動作の仕組み(MASTER → SLAVE)🧩
🔁 1) シグナル転送(トレードの「移動」方法)
このコピーツールは cTrader LocalStorage(デバイススコープ) を共有の「メッセージバス」として使用します。
✅ MASTER
- ポジションイベントを監視: オープン / 修正 / クローズ
- シグナル
TradeSignalを作成(OPEN / MODIFY / CLOSE) - それを signalsリスト に追加(LocalStorageScope.Device内)
- SLAVEがすぐに読めるように Flush() を呼び出す
✅ SLAVE
- 一定間隔で タイマー を実行(ポーリング間隔 秒ごと)
- Reload() を呼び出す
- シグナルリストを読み込む
- 新しいシグナルのみ処理(
_lastSignalIndexProcessedを使用)
🧷 2) ポジションマッピング(CLOSEが機能するために)
SLAVEがトレードをオープンするとき、以下を保存します:
🧩 MasterPositionId → SlavePositionId
このマッピングはLocalStorageにも保存され、再起動後も保持されます:
- ✅ 再起動後もCLOSEが機能
- ✅ MODIFYも正しいポジションを見つける
🧭 3) シンボル変換(MASTERシンボル → SLAVEシンボル)
🗺️ シンボルマップ(MASTER=SLAVE;...)
ブローカーやアカウント間でシンボル名が異なる場合に使用。
フォーマット:
MASTER=SLAVE;MASTER2=SLAVE2;...
例(あなたの場合):
- MASTERが
USTECをオープン - SLAVEは
US100を取引する必要がある
➡️ USTEC=US100
✅ 左側 = MASTERから届くシンボル
✅ 右側 = SLAVEブローカーのシンボル
📏 4) ボリュームロジック(重要な部分)🔥
✅ ロット/数量単位で動作(小数点対応)
小数点(0.10、0.01など)を扱うために、SLAVEは:
- 希望の ロット数 を計算
- 乗数 / 最小値 / ステップを適用
- ロットを ボリューム に変換(
QuantityToVolumeInUnits(lots)を使用) - double型のボリュームを受け入れるオーバーロードを使って注文を送信 ✅
これにより、ブローカーが異なるロット精度ルールを強制しても堅牢に動作します。
⚙️ パラメータ説明(アイコン付き)
🧩 コア
- 🧭 モード
-
Master= シグナルを発行Slave= シグナルを読み取りトレードをコピー
- 🧷 コピーグループID
-
- 通信チャネル。MASTERとSLAVEで一致させる必要があります(例:
DEFAULT)
- 通信チャネル。MASTERとSLAVEで一致させる必要があります(例:
- ⏱️ ポーリング間隔(秒)
-
- SLAVEが新しいシグナルをN秒ごとにチェック
- 🐞 デバッグモード
-
- 詳細なログを出力(セットアップ時に推奨)
🗺️ シンボル変換
- 🧾 シンボルマップ(MASTER=SLAVE;...)
-
- 例:
USTEC=US100;XAUUSD=GOLD;NAS100=USTEC
- 例:
🎚️ ボリュームスケーリング(最重要)✅
🔢 グローバル乗数
- ➗ ボリューム乗数
-
- コピーされたすべてのロットをスケール
desiredLots = masterLots * VolumeMultiplier
🎛️ シンボルごとの乗数(主なツール)
- 🧷 ボリューム乗数マップ(SYM=mult;...)
-
- シンボルごとに乗数を上書き(SLAVE側シンボル)
- 例:
-
US100= 0. 10- イタリア式フォーマットもOK:
US100=0,10
✅ これにより、以下を実現できます: MASTERの1.00 → SLAVEの0.10
🧱 ブローカーのロット制約(最小値とステップ)
- 🧱 最小数量デフォルト(0=オフ)
-
- 有効時のグローバル最小ロット数
- 🧱 最小数量マップ(SYM=val;...)
-
- シンボルごとの最小ロット数
- 例:
US100=0. 10
- 🪜 数量ステップデフォルト(0=オフ)
-
- 有効時のグローバルステップ
- 🪜 数量ステップマップ(SYM=val;...)
-
- シンボルごとのステップ
- 例:
US100=0. 10→ 許容値:0.10、0.20、0.30…
🧯 セーフティ動作
- 🧷 最小数量を固定ロットとして使用
-
- もし
trueなら:SLAVEはマスターのサイズを無視し、常にMinQty(固定サイズ)を使用
- もし
- ⚠️ BelowMin動作
-
UseMin= 最小未満なら最小に引き上げるSkip= 最小未満ならオープンしない
- 🔁 BadVolume試行
-
- ブローカーがBadVolumeを返した場合、小さな調整を最大N回試みる
🎯 SL/TPコピーのロジック
- 🛡️ シンボルが異なる場合、SL/TPを距離としてコピー
-
- MASTERとSLAVEのシンボルが異なる場合:
- SL/TPは絶対価格ではなく エントリーからの距離 としてコピーされる
- これにより、異なる銘柄間でもリスク管理が一貫する
✅ 推奨設定(USTEC → US100、SLAVEロット=0.10)
SLAVE側で:
🗺️ シンボル変換:
Symbol Map=USTEC=US100
🎛️ ボリュームスケーリング:
Volume Multiplier Map=US100=0,10
🧱 ブローカー制約:
Min Qty Map=US100=0,10Qty Step Map=US100=0,10
結果:
- ✅ MASTERの1.00 → SLAVEのUS100で0.10
☁️ 重要:ローカル/VPSのみ(クラウドは不可)❌
🖥️ ローカル/VPS ✅
MASTERとSLAVEが同じ LocalStorageScope.Device(同一マシン/環境)を共有しているため動作します。
☁️ cTrader Cloud ❌
Cloudインスタンスは 分離されているため動作しません。LocalStorageを共有せず、SLAVEはMASTERのシグナルを認識できません。
✅ 結論:
- ✔️ 同一PCまたは両方のインスタンスが同時に動作するVPSで使用してください
- ❌ クラウドの場合は外部リレー(HTTP/WebSocketサーバー)が必要です
5 | 67 % | |
4 | 0 % | |
3 | 33 % | |
2 | 0 % | |
1 | 0 % |