Web Lukes
📄

⚠️【非推奨】FIX APIでゴールド注文失敗「証拠金不足」の原因→ Python cBotを使おう

公開日: 2026/1/8

🚨 重要:FIX APIは非推奨です

この記事で紹介しているFIX APIは、以下の理由から非推奨です:

  • 😱 17個のハマりポイントがあり、ドキュメントに書いてない罠が多すぎる
  • 💀 実装に1週間以上かかる(Python cBotなら数時間)
  • 🤯 800行以上のコードが必要(Python cBotなら数十行)
  • ❌ コントラクトサイズ等の情報が取得できない

🐍 代わりにPython cBotを使いましょう!

cTrader 5.4以降、ネイティブPythonサポートが追加されました。

👉 Python cBot入門ガイド - 1行で注文できる世界へ

👉 cTrader 5.4 Python完全ガイド - 環境構築から実践まで


以下の内容は参考資料として残しています。FIX APIをどうしても使いたい方のみお読みください。


😭 事件発生:04:00のエントリーが通らない

2026年1月6日、朝4時。

ゴールドロールオーバーBotが稼働開始。

Code
04:00:00 [INFO] エントリー実行 (2026-01-06 04:00:00)
04:00:00 [INFO] 新規注文: BUY 0.01ロット SymbolID=41
04:00:00 [INFO] [STATUS] OPEN | ポジ:なし

…ポジ:なし?

注文したのにポジションが立ってない。

ExecutionReport(約定レポート)も来ない。

何が起きた? 🤔


🔍 調査開始:テストスクリプトで検証

テスト1: GBPUSD(通貨ペア)

Python
# GBPUSD 0.01ロット BUY
symbol_id = 2
qty = int(0.01 * 100000) # = 1000

結果:

Code
38=1000
約定成功 @ 1.35311 ✅

通貨ペアは問題なし。


テスト2: XAUUSD(ゴールド)

Python
# XAUUSD 0.01ロット BUY
symbol_id = 41
qty = int(0.01 * 100000) # = 1000

結果:

Code
38=1000
58=NOT_ENOUGH_MONEY:Not enough funds ❌

え? 証拠金不足?

口座残高を確認。

2,499,945円

250万円あるのに証拠金不足???


😱 衝撃の真実:OrderQtyの単位が違った

FIX APIのOrderQty (タグ38) の仕様

調べてみると、OrderQtyはロット数じゃない。

Volume(基準単位)で指定する。

商品基準単位1ロット0.01ロットOrderQty
FX通貨100,0001,00038=1000
ゴールドオンス100138=1
シルバーオンス5,0005038=50
原油バレル1,0001038=10

何が起きていたか

Code
【送信した内容】
38=1000(1000オンス)
【ブローカーの解釈】
1000オンス ÷ 100オンス/ロット = 10ロット
【必要証拠金】
$4,450/oz × 1000oz ÷ 100(レバレッジ) = $44,500
約667万円
【口座残高】
250万円
【結果】
NOT_ENOUGH_MONEY 💀

0.01ロットのつもりが、10ロットの注文になっていた!!


🔧 修正:商品別のOrderQty計算

Before(間違い)

Python
# 全商品で同じ計算
qty = int(quantity * 100000)
# 0.01 * 100000 = 1000

After(正解)

Python
def calculate_order_qty(symbol_id: int, lot_size: float) -> int:
"""商品タイプに応じたOrderQty計算"""
# ゴールド (XAUUSD)
if symbol_id == 41:
return int(lot_size * 100) # 0.01 lot = 1
# シルバー (XAGUSD)
elif symbol_id == 42:
return int(lot_size * 5000) # 0.01 lot = 50
# 原油 (USOIL)
elif symbol_id == 43:
return int(lot_size * 1000) # 0.01 lot = 10
# FX通貨ペア (デフォルト)
else:
return int(lot_size * 100000) # 0.01 lot = 1000

✅ 修正後のテスト

テスト3: XAUUSD(修正版)

Python
# XAUUSD 0.01ロット BUY
symbol_id = 41
qty = int(0.01 * 100) # = 1

結果:

Code
38=1
約定成功 @ 4452.02 ✅
ポジションID: 1001179

やっと通った! 🎉


😈 さらなる罠:コントラクトサイズが取得できない

「じゃあコントラクトサイズをAPIで取得すればいいじゃん」

できません。

cTraderフォーラムの公式回答:

"Unfortunately this information is not available in FIX API. You can consider Open API instead."

FIX APIではコントラクトサイズ情報を取得できない!

取得できる情報 vs 取得できない情報

SecurityListRequest(35=x)で取得可能:

  • シンボルID(Tag 55)
  • シンボル名(Tag 1007)← これは取れる!
  • 桁数/Digits(Tag 1008)

取得不可能(Open APIでのみ):

  • コントラクトサイズ ← 今回の問題
  • ロットステップ
  • スワップレート

つまり「XAUUSD」という名前は分かるけど、「1ロット=100オンス」という情報は取れない。

事前にブローカーの仕様を調べるか、Open APIを使うしかない。

これが14個目のハマりポイントだ。


📋 FIX APIハマりポイント(2026-01-08更新)

#ハマりポイント今回の事件
1CTIDパスワードを使用-
21セッションで全部やろうとした-
3シンボルを文字列で指定-
4TargetSubID忘れ-
5SecurityListRequestType=4-
6ポジション照会に標準タグ使用-
7ハートビート遅延-
8シーケンス番号ミス-
9UTC時刻フォーマット間違い-
10BodyLength計算ミス-
11Checksum計算ミス-
12数量の単位変換忘れ-
13SSL証明書検証-
14商品別OrderQty単位← 今回の事件!
15コントラクトサイズ取得不可← 今回発覚
16ロガー設定漏れ-
17メンテナンス時間差← 2026-01-08追加

17個のハマりポイント。

ドキュメントには書いてない。


🔥 もう1つの問題:約定確認してなかった

問題

注文送信後、約定を確認せずに次の処理に進んでいた。

Python
# 修正前
new_order(symbol_id, "BUY", 0.01)
# 約定確認なし!次の分を待つ…

ネットワーク遅延で約定が遅れても、リトライしない。

解決策:リトライ機能追加

Python
# 修正後
new_order(symbol_id, "BUY", 0.01)
for retry in range(10):
time.sleep(1)
if has_position:
log.info(f"✅ ポジション確認OK (リトライ{retry}回)")
break
else:
log.warning(f"⚠️ ポジション未確認 - リトライ {retry+1}/10")
if retry < 9 and is_spread_ok():
new_order(symbol_id, "BUY", 0.01)

金融取引では「送信したら終わり」じゃない。

  1. 注文送信
  2. ExecutionReport待機
  3. 約定確認
  4. 失敗ならリトライ

この流れを実装しないと、注文が通らなかったことに気づかない。


📊 デバッグにかかった時間

作業時間
問題発見10分
ログ解析30分
原因調査2時間
修正実装1時間
テスト30分
合計4時間

0.01ロットの注文1つに4時間。


🆚 Python cBotなら?

Python
# Python cBotでの注文
api.ExecuteMarketOrder(TradeType.Buy, "XAUUSD", 1000)
# ↑ これだけ。ロット計算も約定確認も全自動。

4時間のデバッグ vs 1行のコード。

どっちがいい?


📝 教訓まとめ

教訓1: NOT_ENOUGH_MONEYは数量を疑え

「証拠金不足」は本当に資金が足りない場合だけじゃない。

数量のフォーマットが間違っている可能性がある。

桁を間違えると、意図した100倍や1000倍の注文になる。

教訓2: 商品ごとにOrderQtyの単位が違う

商品計算式
FXlot × 100,000
ゴールドlot × 100
シルバーlot × 5,000
原油lot × 1,000

教訓3: FIX APIは情報が足りない

コントラクトサイズすら取得できない。

事前に調べるか、Open APIを併用するしかない。

教訓4: 約定確認とリトライは必須

送信して終わりじゃない。

確認して、失敗ならリトライ。

教訓5: テストスクリプトを作れ

本番コードで試すより、小さなテストスクリプトで検証。

  • test_order.py - 注文テスト
  • close_position.py - 決済テスト

🎯 結論

FIX APIの現実

Code
知識ゼロからXAUUSD注文が通るまで:
- ハマりポイント: 17個
- デバッグ時間: 4時間(今回だけで)
- 累計開発時間: 1週間以上
- コード量: 800行以上
- 精神的ダメージ: 甚大

Python cBotの現実

Python
api.ExecuteMarketOrder(TradeType.Buy, "XAUUSD", 1000)
Code
- ハマりポイント: 0個
- 開発時間: 数分
- コード量: 1行
- 精神的ダメージ: なし

🔥 最後に

250万円あるのに「証拠金不足」。

原因は0.01ロットが10ロットになっていた。

OrderQtyの単位が商品ごとに違うなんて、ドキュメントに書いてない。

FIX APIは地獄。

Python cBotは天国。

同じ結論に何度でも辿り着く。


📚 関連記事


FIX APIで消耗するのは、もうやめよう。 😭

質問・同じ経験した人はコメントで!

🎁おすすめツール・サービス

FX自動売買VPSなら50%OFF

キャンペーンで月1,790円〜。MT4/MT5プリインストール済み、自動復旧機能付き。14日間無料お試し。

シンクラウドデスクトップ for FX
ゴトー日EAを探しているならソースコード付

4年で資金4.7倍のバックテスト実績。ソースコード付きで自由にカスタマイズ可能。

ゴトー日EA Ultimate版(3,980円)

※上記リンクにはプロモーション(広告)が含まれています

🔮
MEMBERSHIP

量子相場謀略|ホソノP

ブログでは書けない本音のトレード戦略とEA開発の裏側を公開。 データに基づいた検証で、再現性のある手法だけをお届けします。

✓EAソースコード公開
✓バックテスト生データ共有
✓リアルタイム相場分析
✓メンバー限定記事
メンバーシップに参加する※ noteアカウントで簡単登録

📚あわせて読みたい

📄

⚠️【非推奨】FIX API入門②|PythonでLogon→ Python cBotを使おう

【非推奨】FIX APIは17個のハマりポイントがあり初心者には推奨しません。代わりにPython cBotを使いましょう。この記事は参考資料として残しています。

fx2026/1/8
📄

🚨【結論】FIX APIは非推奨!Python cBotを使いましょう - 17個の地獄を経験した結論

FIX APIは17個のハマりポイントがあり非推奨です。cTrader 5.4以降のPython cBotなら1行で注文可能。FIX APIで813行書いた経験者が断言します。

fx2026/1/8
📄

⚠️【非推奨】FIX API入門①|FIXプロトコルとは?→ Python cBotを使おう

【非推奨】FIX APIは17個のハマりポイントがあり初心者には推奨しません。代わりにPython cBotを使いましょう。この記事は参考資料として残しています。

fx2026/1/8
📄

🚨【結論】cTrader API比較:FIX APIは非推奨→Python cBotを使おう

【FIX APIは非推奨】cTrader 5.4以降はPython cBotがベスト。Open APIよりもさらに簡単。FIX APIで17個のハマりポイントを踏んだ経験者が断言します。

fx2026/1/8
📄

🚀【Fundora自動売買計画】ゴールドロールオーバー戦略をPython cBotで完全自動化する

FIX APIで813行のコードを書いた経験を活かし、Python cBotで50行の自動売買システムを構築。Fundoraの好条件(スプレッド30pt・スワップフリー)でゴールドロールオーバー戦略を回す完全計画書。

fx2026/1/5
📄

😲 Pythonで30通貨ペア×1万通りを全探索!スプレッド拡大を考慮したら結果が激変した話

FXアノマリー自動探索装置で保有期間1〜10時間を検証。最初は『朝6時ショート最強!』と思ったら、スプレッド拡大を考慮したら全部消えた...本当に使える戦略はゴールドのロングだった

fx2026/1/20