「ナンピン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つだけです。
- type:
0=BUY,1=SELL(どちらの方向のポジションを対象にするか) - mode:
0=総数,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数を取得 type は 0=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関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!









コメント