コンテンツにスキップ

既知の制限事項

1. クォートデータは QUOTE セッションに依存します

Section titled “1. クォートデータは QUOTE セッションに依存します”

サーバーは 2 つの FIX セッション、TRADE(注文/ポジション)と QUOTE(リアルタイム市場データ)をサポートします。

  • QUOTE セッションが有効な場合(デフォルト): get_quote はスプレッド付きのライブビッド/アスク価格を返します
  • QUOTE セッションがない場合: get_quote は最近のトレードからの最終既知約定価格にフォールバックします
  • データが設定された閾値より古い場合、レスポンスに陳腐化警告が含まれます
  • QUOTE セッションには、ブローカーからの別個の Price 認証情報が必要です(多くの場合、同じホスト/パスワード、異なるポート)

ヒント: 古い価格が表示される場合、ctrader://health を確認して QUOTE セッション状態が ACTIVE であることを確認してください。

2. Symbol ID はブローカー固有です

Section titled “2. Symbol ID はブローカー固有です”

FIX Symbol ID は、各ブローカーが独立して割り当てる数値識別子です。

  • EURUSD はあるブローカーでは ID 1、別のブローカーでは ID 100 の場合があります
  • 必ずご自身のブローカーで Symbol ID を確認してください
  • cTrader で Symbol ID を見つけることができます: Active Symbol Panel → Symbol Info
  • 設定されたすべての銘柄とその ID を照会するには、get_symbols または ctrader://symbols リソースを使用してください

3. ペーパーモードは執行しません

Section titled “3. ペーパーモードは執行しません”

paper モードでは:

  • 8 つのリスクチェックすべてが通常通り実行されます
  • 注文は検証され、ジャーナルにログ記録されます
  • 注文はブローカーに送信されません
  • 実際の約定なし、実際の P&L なし
  • シミュレーション一貫性のため、状態はメモリ内で更新されます

ペーパーモードは戦略ロジックとリスク設定のテスト用に設計されており、 シミュレートされた約定によるリアルなバックテストやペーパートレーディング用ではありません。

4. 状態リコンサイリエーション遅延

Section titled “4. 状態リコンサイリエーション遅延”

すべての FIX 再接続後、サーバーは状態リコンサイリエーションを実行します:

  1. ブローカーから現在のポジションをリクエスト
  2. ブローカーのポジションスナップショットを受信
  3. ローカル状態をブローカー状態と比較

この期間中(通常 5〜10 秒):

  • トレーディング操作は RECONCILING エラーでブロックされます
  • FIX セッション状態は RECONCILING を示します
  • トレードする前に状態が ACTIVE に遷移するまで待ってください

自動再接続: サーバーは指数バックオフで最大 10 回自動的に再試行します (5 秒、10 秒、20 秒… 最大 60 秒)。すべての試行が失敗した場合、reconnect_trade_session または reconnect_quote_session を使用して、新規接続を手動でトリガーしてください。

5. マーケットデプス / オーダーブックデータなし

Section titled “5. マーケットデプス / オーダーブックデータなし”

QUOTE セッションはトップオブブックのビッド/アスク価格のみを提供します:

  • マーケットデプス(Level 2 / オーダーブック)データなし
  • ティックごとのトレード履歴なし
  • スナップショットおよびインクリメンタルリフレッシュ更新のみ(ストリーミングティックではありません)
  • 市場データは subscribe_quotes または自動購読で購読された銘柄に限定されます

6. デイリー PnL リセットのタイミング

Section titled “6. デイリー PnL リセットのタイミング”

デイリー PnL は深夜ではなく、17:00 EST(FX 市場ロールオーバー時刻)にリセットされます。

  • これは標準的な FX 取引日の慣行に合致しています
  • キルスイッチのデイリーロストリガーもこの時刻にリセットされます
  • リセットタイミングは設定変更できません

各セッションは 1 つのブローカーにのみ接続します:

  • TRADE と QUOTE セッションは同じブローカーである必要があります
  • マルチテナントモードでは、異なるユーザーが異なるブローカーに同時に接続できます
  • 各セッションは独自のポジション、リスク制限、ジャーナルで完全に分離されています

8. オーダーブック / 保留中注文履歴なし

Section titled “8. オーダーブック / 保留中注文履歴なし”

サーバーは現在保留中の注文と建玉ポジションのみを追跡します:

  • 約定された注文はアクティブ追跡から削除されます
  • 取消された注文はアクティブ追跡から削除されます
  • 過去の注文データは監査ジャーナルでのみ利用可能です

9. 再接続時のギャップフィルリカバリなし

Section titled “9. 再接続時のギャップフィルリカバリなし”

サーバーがブローカーに再接続するとき、セッションは新規に開始されます:

  • メッセージシーケンス番号は再接続をまたいで保持されません
  • 切断中にブローカーが送信したメッセージはリカバリされません
  • サーバーは整合性を確保するためにブローカーからポジションをリコンサイルします

get_positions のポジションデータは、ライブブローカークエリではなくローカルメモリ内状態から取得されます。

ローカル状態がどのように構築されるか:

  • ログオン時: サーバーはブローカーから現在のポジションスナップショットをリクエストして受信
  • セッション中: MCP 起動のトレードからのトレード確認のみで更新

状態が古くなる可能性のあるとき:

  • cTrader UI または他のツールで直接行われたトレードは、再接続まで反映されません
  • Claude チャット間の切り替え: 新しい MCP 接続ごとに新規リコンサイルされますが、長時間実行中の セッションは外部プラットフォームのアクティビティ後に自動リフレッシュされません

新鮮なデータを取得する方法: refresh: true を指定して get_positions を使用してください。これにより、ブローカーから新鮮なポジションデータが取得され、 返す前に状態が再構築されます。

refresh: true を使用するタイミング:

  • このセッション中に cTrader または別のツールで直接トレードを行った
  • ポジションデータが現在のブローカー状態を反映しているか不明
  • コンテキストを切り替えた(別のチャット、ツール再起動)後、セッションがしばらくアクティブだった

すべてのトレードがこの MCP サーバーを通じて発注された場合、デフォルト(refresh: false)で十分です。

11. P&L には通貨変換のために QUOTE セッションが必要です

Section titled “11. P&L には通貨変換のために QUOTE セッションが必要です”

cTrader は建玉ポジションの P&L データを直接提供しません。これは FIX プロトコルの 既知の制限です。

すべての P&L 値は USD で報告されます。 USD 以外でクォートされる商品(例: P&L が JPY ベースの USDJPY)の場合、サーバーは QUOTE セッションからのライブミッドプライスを使用して USD に変換します。透明性のため、USD 値と生のクォート通貨値の両方がすべてのレスポンスに含まれます。

QUOTE セッションがない場合の結果: unrealizedPnL は 0、priceSource: "unavailable" となり、通貨変換は利用できません — pnlCurrency フィールドを確認してください(変換時は “USD”、変換不可の場合は “JPY” などの生のクォート通貨を示します)。

P&L レスポンスフィールド:

  • unrealizedPnL / realizedPnL — USD ベースの主要値
  • unrealizedPnLRaw / realizedPnLRaw — クォート通貨での元の値
  • quoteCurrency — 商品のクォート通貨(例: “JPY”、“GBP”、“USD”)
  • pnlCurrency — 変換時は “USD”、フォールバック時はクォート通貨
  • conversionRate — USD への変換乗数(rawPnL × conversionRate = usdPnL

P&L の計算方法(QUOTE セッションがアクティブな場合):

  • 買いポジション: unrealizedPnL = (bid − entryPrice) × volume → USD に変換
  • 売りポジション: unrealizedPnL = (entryPrice − ask) × volume → USD に変換

正確な P&L のための推奨ワークフロー:

  1. get_positions を呼び出して建玉ポジションの銘柄を発見
  2. get_quotes ["EURUSD", "XAUUSD", ...] で各ユニークな銘柄を呼び出す(プライスキャッシュをウォームアップ)
  3. 再度 get_positions を呼び出す → priceSource: "live_quote"、正確な USD P&L

各ポジションの priceSource フィールドを確認してデータ品質を判断してください:

  • "live_quote" — 現在のビッド/アスクから計算(正確)
  • "broker" — ブローカーが P&L データを直接提供(cTrader では稀)
  • "unavailable" — キャッシュに価格なし、P&L は 0

12. 計算エラーは高額になり得る

Section titled “12. 計算エラーは高額になり得る”

数量と価格の計算を実行する AI エージェントは、実際の財務的結果を持つミスを犯す可能性があります。 数量フィールドの 1 つの誤配置されたゼロは、意図したトレードサイズの 10 倍を意味します。

組み込みの安全装置:

  • サーバーの instructions フィールド: MCP プロトコル経由で接続時に AI エージェントに送信され、 計算をステップバイステップで表示し、トレード前にユーザー確認を得るようエージェントに指示します
  • ツールの annotations: トレーディングツールには destructiveHint: true および idempotentHint: false がマークされ、 これらの操作が不可逆であることを MCP クライアントに通知します
  • 入力検証: 数量は正の数(BTCUSD のような商品では小数も許可)、価格は正、銘柄はパターンに一致する必要があります
  • リスクガード: 資産クラスごとのポジションサイズ制限とデイリーロス制限を含む 8 件の自動チェック

サーバーが強制できないこと:

  • エージェントが正しいロット数 → 単位数を計算したかどうか
  • エージェントが正しいサイド(BUY 対 SELL)を選択したかどうか
  • ユーザーが実際にトレードパラメーターを確認したかどうか

推奨事項: トレードを確認する前に、常にエージェントの計算を確認してください。テストにはペーパーモードを使用してください。 数量変換の式と例については、order-guide トピックを読んでください。

13. HTTP モード: SSRF 許可リストが FIX ホストを制限

Section titled “13. HTTP モード: SSRF 許可リストが FIX ホストを制限”

マルチテナントモードでは、明示的に設定されたブローカーサーバーのみが許可されます:

  • FIX ホストは OAuth フォームのドロップダウン内のサーバーと一致する必要があります
  • 標準 FIX ポートのみが受け入れられます
  • プライベート/ループバック IP は常にブロックされます

ブローカーサーバーがドロップダウンにない場合、サーバー管理者に連絡して追加してもらってください。

14. HTTP モード: FIX セッション状態はメモリ内

Section titled “14. HTTP モード: FIX セッション状態はメモリ内”

テナント FIX セッション状態(ポジション、注文、デイリー P&L)はメモリに保存されます。これは以下を意味します:

  • FIX 状態は再接続ごとにブローカーから再構築されます(ポジションは自動的に再リコンサイルされます)
  • デイリー P&L 追跡はセッション再起動後に新規に始まります

OAuth セッションは持続します — 短時間の中断後に再認可する必要はありません。 FIX セッションのみが再接続およびリコンサイルされます。

15. HTTP モード: ブルートフォースロックアウト

Section titled “15. HTTP モード: ブルートフォースロックアウト”

ブルートフォースロックアウト(5 回失敗 → 15 分ロックアウト)はサーバープロセスごとに強制されます。 サーバーサイドのレート制限により、IP ベースの追加スロットリングが提供されます。

16. HTTP モード: ゲストセッションは読み取り専用

Section titled “16. HTTP モード: ゲストセッションは読み取り専用”

認証情報なしで接続した場合(OAuth 完了前)、サーバーはゲストセッションを作成します:

  • 利用可能なツールは 2 つのみ: get_symbols および get_knowledge
  • 12 のリソースはすべてリストされますが、状態リソース(ctrader://positionsctrader://ordersctrader://health)はセットアップ手順付きの “not_connected” スタブを返します
  • 3 つのプロンプトすべてが動作します(特に有用: setup-guide
  • FIX 接続なし、トレーディングなし、状態追跡なし

ゲストモードでは、AI エージェントが認証情報を提供する前にサーバーの機能を発見し、接続方法を学習できます。完全なトレーディングセッションにアップグレードするには、OAuth フローを完了してください。

17. SL/TP OCO 自動キャンセルはベストエフォート

Section titled “17. SL/TP OCO 自動キャンセルはベストエフォート”

SL/TP 注文は、positionId 経由でポジションにリンクされた STOP および LIMIT 注文として実装されます。 サーバーは OCO(One-Cancels-Other)ロジックを実装します: ポジションがクローズしたとき(数量が 0 に達したとき)、その positionId にリンクされたすべての保留中 注文は自動的にキャンセルされます。

ベストエフォート: FIX セッションが切断されている場合、または注文がすでにキャンセル/約定されている場合、OCO キャンセルは失敗する可能性があります。 失敗はログに記録されますが、約定処理をブロックしません。稀に、リンクされた注文が残ることがあります — 必要に応じて get_orders で確認してください。

OAuth 2.1 はすべてのエンドポイントで HTTPS を要求します。サーバーはすべての接続で HTTPS を要求します。OAuth はプレーン HTTP では動作しません。

19. アカウント残高または有効証拠金データなし

Section titled “19. アカウント残高または有効証拠金データなし”

FIX プロトコルは、アカウント残高、有効証拠金、または証拠金データを提供しません。サーバーは、アカウントにどれだけの資本があるか、または証拠金使用率を計算することができません。

影響:

  • リスク管理は、有効証拠金ベースのメトリクスではなく、ポジションサイズと確定 P&L のみで動作します
  • 残高データなしでは、ピークからのドローダウンおよび証拠金ベースの制限は不可能です
  • デイリーロス制限は、未実現の有効証拠金変化ではなく、確定損失に基づきます

回避策: cTrader プラットフォームまたはブローカーの Web ポータルで直接アカウント残高を確認してください。

20. トレード履歴は MCP 起動のクローズのみを追跡

Section titled “20. トレード履歴は MCP 起動のクローズのみを追跡”

get_trade_history は、この MCP サーバーセッション経由でクローズされたポジションのみを記録します。 cTrader UI、別の MCP チャット、別のツール、またはブローカーのモバイルアプリ経由でクローズされたトレードは キャプチャされません — サーバーは他のチャネルで起動されたトレードのトレード確認を受信しません。

回避策: このサーバーの外でトレードを行った後、refresh: true を指定して get_positions を呼び出して ブローカーからポジションをリコンサイルしてください。ただし、すでにクローズされたポジションは トレード履歴に復元できません — ブローカー状態からも消えています。

監査ジャーナルも同様に、このサーバープロセスで観察されたイベントに限定されます。

21. SenderCompID あたり 1 つの FIX セッション

Section titled “21. SenderCompID あたり 1 つの FIX セッション”

cTrader ブローカーは SenderCompID あたり 1 つのアクティブな FIX 接続という厳格なルールを強制します。これは以下を意味します:

  • 同じブローカーアカウントで 2 つの別個の AI エージェントクライアント(例: Claude と Manus)を同時に実行することはできません — 2 つ目の接続は拒否されます。
  • 再認証時、セッションがアクティブな間、サーバーは検証プローブを開けません。サーバーは、設定が変更されていない場合は検証をスキップし、変更されている場合は既存セッションを先にクローズしてこれを処理します。
  • パスワード変更は異なるサーバーサイドアイデンティティを作成します。セッションがアクティブな間にブローカーで FIX パスワードを変更した場合、サーバーはクローズすべき古いセッションを見つけられません。パスワードを変更する前に reset_session を使用するか、古いセッションのアイドルタイムアウトを待ってください。

複数の AI クライアントを同時に使用するには、別個のブローカーアカウント(異なる SenderCompID)が必要です。