既知の制限事項
既知の制限事項
Section titled “既知の制限事項”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 再接続後、サーバーは状態リコンサイリエーションを実行します:
- ブローカーから現在のポジションをリクエスト
- ブローカーのポジションスナップショットを受信
- ローカル状態をブローカー状態と比較
この期間中(通常 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 取引日の慣行に合致しています
- キルスイッチのデイリーロストリガーもこの時刻にリセットされます
- リセットタイミングは設定変更できません
7. シングルブローカー接続
Section titled “7. シングルブローカー接続”各セッションは 1 つのブローカーにのみ接続します:
- TRADE と QUOTE セッションは同じブローカーである必要があります
- マルチテナントモードでは、異なるユーザーが異なるブローカーに同時に接続できます
- 各セッションは独自のポジション、リスク制限、ジャーナルで完全に分離されています
8. オーダーブック / 保留中注文履歴なし
Section titled “8. オーダーブック / 保留中注文履歴なし”サーバーは現在保留中の注文と建玉ポジションのみを追跡します:
- 約定された注文はアクティブ追跡から削除されます
- 取消された注文はアクティブ追跡から削除されます
- 過去の注文データは監査ジャーナルでのみ利用可能です
9. 再接続時のギャップフィルリカバリなし
Section titled “9. 再接続時のギャップフィルリカバリなし”サーバーがブローカーに再接続するとき、セッションは新規に開始されます:
- メッセージシーケンス番号は再接続をまたいで保持されません
- 切断中にブローカーが送信したメッセージはリカバリされません
- サーバーは整合性を確保するためにブローカーからポジションをリコンサイルします
10. ポジションデータの陳腐化
Section titled “10. ポジションデータの陳腐化”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 のための推奨ワークフロー:
get_positionsを呼び出して建玉ポジションの銘柄を発見get_quotes ["EURUSD", "XAUUSD", ...]で各ユニークな銘柄を呼び出す(プライスキャッシュをウォームアップ)- 再度
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://positions、ctrader://orders、ctrader://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 で確認してください。
18. OAuth: HTTPS が必要
Section titled “18. OAuth: HTTPS が必要”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)が必要です。
