見出し画像

【mql】ポジション数およびロット数の合計を計算するコード

本noteでは、私がEAを作成した時に参考になったサイトを紹介します。
ポジション数およびロット数の合計を計算するコードです。
EAやインジケーターを作成している方に役立てば幸いです。

使い方

最大ポジション数やロット数の上限を設定したい時に、本コードを注文や決済関数の手前にコピー&ペーストしてご利用ください。

参考サイト

https://autofx100.com/2015/02/07/175404/

問合せ

ご質問・ご意見は以下メールアドレスへお気軽にご連絡下さい。
gabrielfx2100@gmail.com

公式LINEの友達追加はコチラ
(ガブリエルのFX事情を配信中です)

コード紹介

最大ポジション数が5つの例です。

#define OP_OPEN           6 // ポジション
#define OP_LIMIT          7 // 指値注文
#define OP_STOP           8 // 逆指値注文
#define OP_ALL            9 // 全て
#define SUM_ORDER_NUMBER  1 // 注文数
#define SUM_LOTSIZE       2 // ロット数

extern int MAGIC=1;         //マジックナンバー
extern double lotSize=0.01; //lot
extern int SumTrades=5;     //最大ポジション数

string comment="comment";
int Slippage=3;//スリッページ(point)
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void init()return;
int deinit()return(0);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(★エントリー条件★)
     {
      //最大ポジション以下なら注文
      if(sumOrderNumberOrLotSize(OP_ALL,SUM_ORDER_NUMBER)<SumTrades)
        {
         //買い注文
         reslg=OrderSend(Symbol(),OP_BUY,lotSize,Ask,Slippage,LongSL,LongTP,comment,MAGIC,0,Blue);
        }
     }
  }
//+------------------------------------------------------------------+
//|【関数】指定の注文種類の注文数またはロット数を合計する
//|                            
//|【引数】 IN OUT  引数名      説明    
//|        --------------------------------------------------------- |
//|         ○     aType    注文種別
//|         ○     aKbn     カウント対象
//|                        1: 注文数
//|                        2: ロット数
//|                  
//|【戻値】合計注文数または合計ロット数
//+------------------------------------------------------------------+
double sumOrderNumberOrLotSize(int aType,int aKbn)
  {
   double sumOrder = 0.0;
   double sumLot   = 0.0;
   double num      = 0.0;

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==false)
        {
         break;
        }

      if(OrderSymbol()!=Symbol())
        {
         continue;
        }
      int type=OrderType();
      double lot=OrderLots();

      if(aType==OP_BUY)
        {
         if(type==OP_BUY)
           {
            sumOrder += 1.0;
            sumLot   += lot;
           }
        }
      else if(aType==OP_SELL)
        {
         if(type==OP_SELL)
           {
            sumOrder += 1.0;
            sumLot   += lot;
           }
        }
      else if(aType==OP_BUYSTOP)
        {
         if(type==OP_BUYSTOP)
           {
            sumOrder += 1.0;
            sumLot   += lot;
           }
        }
      else if(aType==OP_SELLSTOP)
        {
         if(type==OP_SELLSTOP)
           {
            sumOrder += 1.0;
            sumLot   += lot;
           }
        }
      else if(aType==OP_OPEN)
        {
         if(type==OP_BUY || type==OP_SELL)
           {
            sumOrder += 1.0;
            sumLot   += lot;
           }
        }
      else if(aType==OP_LIMIT)
        {
         if(type==OP_BUYLIMIT || type==OP_SELLLIMIT)
           {
            sumOrder += 1.0;
            sumLot   += lot;
           }
        }
      else if(aType==OP_STOP)
        {
         if(type==OP_BUYSTOP || type==OP_SELLSTOP)
           {
            sumOrder += 1.0;
            sumLot   += lot;
           }
        }
      else if(aType==OP_ALL)
        {
         sumOrder += 1.0;
         sumLot   += lot;
        }
      else
        {
         Print("sumOrderNumberOrLotSize: 不正な注文種別です。aType = "+(string)aType);
         return(-1);
        }
     }
   if(aKbn==SUM_ORDER_NUMBER)
     {
      num=sumOrder;
        }else if(aKbn==SUM_LOTSIZE){
      num=sumLot;
     }

   return(num);
  }
//+------------------------------------------------------------------+

記事をご覧いただきありがとうございます。 皆様のサポートが次の記事を書くモチベーションに繋がっています! もしよろしければサポートしていただけると嬉しいです!