🗂

MQL5で現在のポジション数、オーダー数を数える方法

2023/10/07に公開

MT5はポジション数の他にオーダー数を数える必要があります。

また成行注文も待機注文へ一時回るので成行注文でもオーダー数をカウントする必要があります。

例)ポジション数が0でかつオーダー数が0の時にエントリー注文を出す

bool A = PositionsTotal() == 0;//ポジション数が0
bool B = OrdersTotal() == 0;//オーダー数が0

if(A && B){
position_entry(0);
}

https://www.mql5.com/ja/docs/trading

ポジション数をカウントする

int position_count(ENUM_ORDER_TYPE order_type)
  {
   int count =0;
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
     if("" != PositionGetSymbol(i))
        {
         if(PositionGetInteger(POSITION_TYPE)==order_type)
           {
            if(Symbol()==PositionGetString(POSITION_SYMBOL))
              {
               if(PositionGetInteger(POSITION_MAGIC)==MagicNumber)
                 {
                  count++;
                 }
              }
           }
        }
     }
   return count ;
  }

オーダー数をカウントする

int order_count()
  {
   int count =0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(OrderGetTicket(i)))
        {
         if(Symbol()==OrderGetString(ORDER_SYMBOL))
           {
            if(OrderGetInteger(ORDER_MAGIC)==MagicNumber)
              {
                  count++;
              }
           }
        }
     }


   return count ;
  }

成行注文のオーダー数をカウントする

int market_order_count()
  {
   int count =0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(OrderGetTicket(i)))
        {
         if(Symbol()==OrderGetString(ORDER_SYMBOL))
           {
            if(OrderGetInteger(ORDER_MAGIC)==MagicNumber)
              {
               long orderType = OrderGetInteger(ORDER_TYPE);
               if(orderType == ORDER_TYPE_BUY || orderType == ORDER_TYPE_SELL)  // ここで成行注文のみをチェック
                 {
                  count++;
                 }
              }
           }
        }
     }


   return count ;
  }

使い方

void OnTick()
  {
bool A = position_count(ORDER_TYPE_BUY) == 0;//BUYポジション 0
bool B = position_count(ORDER_TYPE_SELL) == 0;//SELLポジション 0
bool C = order_count() == 0;//オーダー数 0

}

Discussion