MT4|ポジションのpips数を計算する汎用関数【MQL4サンプルコード付き】

スーツ姿のデグーマウスがMT4 EAのコードを指しながら解説しているイラスト。ぷろぐらむFXのデフォルトアイキャッチ。
EAサンプル・ノウハウ
記事内に商品プロモーションを含む場合があります
スポンサーリンク

「ナンピンEAの全ポジションの含み益pipsをまとめて見たい」「単ポジと複数ポジで利確幅を変えたい」──そんなときに毎回ロジックを書くのは面倒ですよね。 本記事では、MT4(MQL4)でポジションのpips数を簡単に計算できる汎用関数を、コピペで使えるサンプルコード+初心者向け解説つきで紹介します。

  • 指定した方向(BUY/SELL)のpipsをまとめて取得する方法
  • 単ポジ/複数ポジで利確条件を変えるサンプル実装
  • マジックナンバーや桁数(Digits)を考慮した実装のポイント
  • ナンピンEAなどへの応用イメージ

はじめに:pips計算を関数化しておくメリット

今回は、MT4の自動売買EAでポジションのpips数をまとめて計算する関数を紹介します。 ナンピンEAを作る際など、全ポジションの合計pips最新ポジション1つだけのpipsを知りたい場面は意外と多いです。

毎回その場しのぎでロジックを書くのではなく、汎用関数としてまとめておくことで、他のEAにも再利用しやすくなります。


【コピペOK】ポジションのpips数を計算する関数

まずは完成形のサンプル関数です。そのままEAにコピペしてお使いください。

//+------------------------------------------------------------------+
//| 【関数】指定ポジション種別のpipsを返す                          |
//|                                                                  |
//| 【引数】type:0=BUY, 1=SELL                                      |
//| 【引数】mode:0=総数, 1=最新1ポジのみ                            |
//| 【引数】magic:EAのマジックナンバー(-1ならすべて対象)          |
//|                                                                  |
//| 【戻値】指定ポジションの合計pips(mode=1のときは最新1ポジ分)   |
//+------------------------------------------------------------------+
double getTotalProfitPips(int type, int mode, int magic)
{
   double totalPips = 0.0;

   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

      // 通貨ペア・注文種別・マジックナンバーでフィルタ
      if(OrderSymbol() != Symbol())                    continue;
      if(OrderType() != OP_BUY && OrderType() != OP_SELL) continue;
      if(type == 0 && OrderType() != OP_BUY)           continue;
      if(type == 1 && OrderType() != OP_SELL)          continue;
      if(magic != -1 && OrderMagicNumber() != magic)   continue;

      double pips = 0.0;

      // BUY/SELLでpipsの向きを計算
      if(OrderType() == OP_BUY)
      {
         pips = Bid - OrderOpenPrice();
      }
      else if(OrderType() == OP_SELL)
      {
         pips = OrderOpenPrice() - Ask;
      }

      // 通貨の桁数に応じたpips換算
      if(Symbol() == "GOLD")
      {
         // 口座仕様によって調整(例:XMのGOLDなど)
         pips *= 10;
      }
      else
      {
         if(Digits == 2 || Digits == 3)
         {
            pips *= 100;
         }
         else if(Digits == 4 || Digits == 5)
         {
            pips *= 10000;
         }
      }

      totalPips += pips;

      // 単ポジモードの場合は1回で抜ける
      if(mode == 1)
      {
         break;
      }
   }

   return totalPips;
}

上記のサンプルでは、マジックナンバー桁数(Digits)も考慮したうえでpips計算ができるようになっています。 特に、"GOLD"のように桁数仕様が特殊な銘柄は、口座ごとに調整が必要になるため注意してください。

スポンサーリンク

関数の引数と戻り値の解説

関数はとてもシンプルで、引数は次の3つだけです。

  • type0=BUY, 1=SELL(どちらの方向のポジションを対象にするか)
  • mode0=総数, 1=最新1ポジのみ(合計pipsか・最新ポジだけか)
  • magic:EAのマジックナンバー(-1ならすべてのマジックを対象)

戻り値は、指定した条件に合致するポジションのpips数です。 mode = 0 の場合は「合計pips」、mode = 1 の場合は「最新1ポジ分のpips」を返します。

呼び出し例

double B_pips = getTotalProfitPips(0, 0, MAGIC_NO);  // BUYポジションの総pips数を取得
double S_pips = getTotalProfitPips(1, 1, MAGIC_NO);  // SELLポジションの最新1ポジpips数を取得

type0=BUY / 1=SELL なので、
getTotalProfitPips(OP_BUY, ...) のように OP_BUY を渡すのではなく、0 / 1 の値を渡す点に注意してください。


単ポジ/複数ポジで利確条件を変える具体例

具体的な使用例として、単ポジと複数ポジションで決済するpips数を変えたい場合を考えてみます。

例えば、次のようなロジックがよくあります。

  • 保有ポジションが1つだけのとき:+20pipsで決済
  • 複数ポジションを持っているとき:全体で+10pipsに達したら決済
int total = OrdersTotal();

if(total > 0)
{
   // 単ポジの場合は +20pips で決済する
   if(total == 1)
   {
      if(getTotalProfitPips(e_type, 1, MAGIC_NO) >= 20)
      {
         // 単ポジ決済処理
      }
   }
   // 複数ポジの場合はトータル +10pips で決済する
   else
   {
      if(getTotalProfitPips(e_type, 0, MAGIC_NO) >= 10)
      {
         // e_type のポジション全決済処理
      }
   }
}

このように、「単ポジはしっかり利を伸ばす」「複数ポジは早めに逃げる」といった調整を簡単に書けるようになります。 ナンピンEAや分割エントリー型のEAで特に使い勝手が良いパターンです。


実装のポイントと注意事項

  • マジックナンバーでEAごとに集計を分ける
    複数EAを同じ口座で動かしている場合、magic引数を使うことで特定EAのポジションだけを集計できます。 すべてのポジションを対象にしたい場合は magic = -1 を指定します。
  • GOLDやCFDなど桁数が特殊な銘柄
    サンプルでは Symbol() == "GOLD" のときに pips *= 10; としていますが、
    これは一例であり、ご利用の口座仕様に合わせて調整が必要です。 テスト口座で必ず確認してから本番運用に使ってください。
  • スプレッドや手数料は考慮していない
    この関数はあくまで価格差ベースのpips計算です。 実際の損益(口座通貨建ての金額)とは、スプレッド・手数料・スワップなどで差が出る点に注意しましょう。

その他注意事項

上記関数をご使用の際は、必ずデモ口座などで動作確認を行ったうえで、自己責任でご利用ください。 ブローカーや口座タイプ(スタンダード/ゼロ口座など)によって、桁数や銘柄仕様が異なる場合があります。


さいごに:EAの「共通パーツ」として使い回そう

以上、『ポジションのpips数を計算する関数(MT4用)』の紹介でした。 一度こうした関数を作っておけば、利確/損切りロジックの検討やナンピンEAの最適化など、様々な場面で使い回しができます。

👉 EAのロジック作成やMQL4の基礎を体系的に学びたい方は、
FX自動売買(EA)の始め方ガイド もあわせてチェックしてみてください。

👉 関数をもっと探したい方は MQL4 関数一覧ページ をどうぞ。

👉 EAロジックやTipsを探したい方は EAプログラミング小ネタ集 も役立ちます。




✅ 他にも多数のEAサンプルを公開中!

今回紹介した内容以外にも、当サイトではさまざまな
FX自動売買EAのサンプルコードを提供しています。

自分に合った戦略のEAを見つけたい方は、ぜひチェックしてみてください。


📊 【2025年最新】FX自動売買EAランキングも公開中!

当サイトの「どのEA(インジ)が実際に勝っているのか?」を知りたい方はこちら👇
PF(プロフィットファクター)や勝率で徹底比較した最新ランキングから、あなたに最適なEA(インジ)を見つけましょう。


EA開発初心者向けに、今後も実践的なMQL4関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!

コメント

タイトルとURLをコピーしました