コンテンツにスキップ

MQL5コードの環境互換性ガイド

このページについて

当サイトで配布しているMQL5コード(インジケータ・EA)を、様々なFX業者環境で問題なく動作させるための注意点と対策をまとめています。


よくある環境差異と対策

1. シンボルサフィックス問題

FX業者によって、通貨ペア名にサフィックス(接尾辞)が付く場合があります。

業者 USDJPY の表記例
A社 USDJPY
B社 USDJPY.i
C社 USDJPYm
D社 USDJPY#
E社 USDJPYpro

影響を受けるコード:

  • マルチ通貨インジケータ(Ku-Chart等)
  • 複数通貨ペアにアクセスするEA

対策:

チャートに表示されているシンボル名からサフィックスを自動検出する関数を使用:

C++
string GetSymbolSuffix()
{
   string symbol = _Symbol;
   string stdPairs[] = {"EURUSD", "GBPUSD", "USDJPY", "AUDUSD"};

   for(int i = 0; i < ArraySize(stdPairs); i++)
   {
      int pos = StringFind(symbol, stdPairs[i]);
      if(pos >= 0)
      {
         return StringSubstr(symbol, pos + StringLen(stdPairs[i]));
      }
   }
   return "";
}

// 使用例
string eurusd = "EURUSD" + GetSymbolSuffix(); // → "EURUSD.i" など

当サイトのコードでの対応状況

  • 16_KuChart_Simple.mq5 — ✅ 対応済み(DetectSuffix関数)
  • 15_MultiSymbol_Load.mq5 — ✅ 対応済み(v1.10でサフィックス自動検出追加)

2. 価格桁数の違い(3桁/5桁ブローカー)

業者によって価格の桁数が異なります。

タイプ USDJPYの例 EURUSDの例 _Digits
3桁/5桁業者 156.123 1.12345 3 / 5
2桁/4桁業者 156.12 1.1234 2 / 4

影響を受けるコード:

  • Pips → 価格変換ロジック
  • TP/SL計算

対策:

C++
double PipsToPrice(double pips)
{
   double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
   int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);

   // 3桁/5桁ブローカー対応
   if(digits == 3 || digits == 5)
      return pips * point * 10.0;
   else
      return pips * point;
}

当サイトのコードでの対応状況

  • Ichimoku_Sanyaku_EA_*.mq5 — ✅ 対応済み(PipsToPrice関数で⅗桁対応)

3. サーバータイムゾーンの違い

業者によってMT5サーバーのタイムゾーンが異なります。

業者 GMTオフセット 特徴
A社 GMT+0 イギリス時間
B社 GMT+2 東欧時間
C社 GMT+3 モスクワ時間
D社 GMT+9 日本時間

影響を受けるコード:

  • 時間帯フィルター付きEA
  • 日本時間表示インジケータ

対策:

JPN_Time_SubZero インジケータでは、ユーザーがサーバーのGMTオフセットをパラメータで指定できるようになっています。


4. 注文タイプ(Filling Type)

業者によって対応している注文タイプが異なります。

タイプ 説明
ORDER_FILLING_FOK 全量約定のみ受付
ORDER_FILLING_IOC 部分約定可
ORDER_FILLING_RETURN 残量をキャンセル

対策:

当サイトのEAでは ORDER_FILLING_IOC を標準使用していますが、業者によっては変更が必要な場合があります。

C++
trade.SetTypeFilling(ORDER_FILLING_IOC);

共通ヘルパー関数ライブラリ

様々な環境で動作するための共通関数をまとめたファイルを提供しています。

FXLab_Common.mqh

含まれる関数:

関数 説明
GetSymbolSuffix() サフィックスを自動検出
GetSymbolWithSuffix() 標準シンボル名にサフィックスを付与
PipsToPrice() Pips→価格変換(⅗桁対応)
PriceToPips() 価格→Pips変換
NormalizeLotSize() ロットサイズを適正範囲に正規化

使用方法:

C++
#include "FXLab_Common.mqh"

void OnTick()
{
   string eurusd = GetSymbolWithSuffix("EURUSD");
   double slPrice = PipsToPrice(50);  // 50pipsを価格に変換
}

トラブルシューティング

Q: マルチ通貨インジケータでデータが表示されない

原因: シンボル名が業者と一致していない可能性

対策: 1. 気配値ウィンドウで対象通貨ペアを表示させる 2. シンボル名にサフィックスが必要か確認

Q: EAでエントリーできない

原因: Filling Typeが業者と合っていない可能性

対策:

C++
// 以下のいずれかを試す
trade.SetTypeFilling(ORDER_FILLING_FOK);
trade.SetTypeFilling(ORDER_FILLING_IOC);
trade.SetTypeFilling(ORDER_FILLING_RETURN);

Q: TP/SLが設定できない

原因: 価格の正規化が不足している可能性

対策:

C++
double sl = NormalizeDouble(price - slDistance, _Digits);
double tp = NormalizeDouble(price + tpDistance, _Digits);


ホームに戻る