【2025.05.29】 ★03:00 アメリカ・FOMC議事録05月 ★21:30 アメリカ・実質GDP(改定値) ★23:00 アメリカ・中古住宅販売成約指数04月

ポジションのpips数を計算する関数(MT4)

記事内に商品プロモーションを含む場合があります
スポンサーリンク

今回はMT4の自動売買用EAサンプルソース(FX用)を、プログラミング初心者の方向けに解説しています。

はじめに

ナンピンEAを作る際など全ポジションのpips数計算や、単ポジでもpips数を確認したい場合があるのでpips数を計算する機能を関数化しました。

ソースコード

以下サンプルの関数になります。そのままコピペでお使いください。

//+------------------------------------------------------------------+
//| 【関数】指定ポジション種別のpipsを返す                      |
//|                                                                  |
//| 【引数】type:0=BUY, 1=SELL                                     |
//| 【引数】mode:0=総数, 1=最新1ポジのみ                                     |
//| 【引数】magic:EAのマジックナンバー(-1ならすべて対象)         |
//|                                                                  |
//| 【戻値】指定ポジションの合計pips                                |
//+------------------------------------------------------------------+
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)) {
         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;
         if(OrderType() == OP_BUY) {
            pips = Bid - OrderOpenPrice();
         } else if(OrderType() == OP_SELL) {
            pips = OrderOpenPrice() - Ask;
         }

         // 通貨の桁数に応じたPIPS換算
         if(Symbol() == "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;
}

今回はマジックナンバーも考慮した関数となっています。マジックナンバー等が違うと『continue;』で次の繰り返し処理にスキップしています。”GOLD”の桁数を調整していますが、これはXMのGOLDだけDigitsで桁数が合わなかったので決め打ちで調整しています。

スポンサーリンク

解説

とてもシンプルなつくりで、引数は

  • type:0=BUY, 1=SELL
  • mode:0=総数, 1=最新1ポジのみ
  • magic:EAのマジックナンバー(-1ならすべて対象)

の3つです。

呼び出し例

double B_pips = getTotalProfitPips(OP_BUY,0,MAGIC_NO)   //買いポジションの総pips数を取得
double S_pips = getTotalProfitPips(OP_SELL,1,MAGIC_NO)  //売りポジションの単pips数を取得

具体的な使用例

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

   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ポジション全決済処理
         }
      }
   }

その他注意事項

上記関数をご使用の際は、動作確認等を行い自己責任でお使いください。

さいごに

以上、『ポジションのpips数を計算する関数』でした。



※ EAのサンプルソース一覧表へ

コメント