OrdersTotal() количество Buy,Sell

 
Подскажите код, с помощью которого можно посчитать общее количество ордеров (по  текущим открытым позициям ) в отдельности количество Buy позиций и количество Sell позиций ?
 
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
Из
//+------------------------------------------------------------------+
//|                                               Moving Average.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
 
Invest777 писал(а) >>
Подскажите код, с помощью которого можно посчитать общее количество ордеров (по текущим открытым позициям ) в отдельности количество Buy позиций и количество Sell позиций ?


https://www.mql5.com/ru/forum/107476/page12#72848 NumberOfOrders b-Orders.mqh 09.04.2008 Количество ордеров
https://www.mql5.com/ru/forum/107476/page18#78397 NumberOfPositions b-Positions.mqh 12.05.2008 Количество позиций
 
yuripk >>:
Из


Большое спасибо ! но вот только при компиляции выдает : 
'(' - function definition unexpected 
'buys' - variable not defined 
'sells' - variable not defined 
  
а если описать "buy"и "sell" как глобальные переменные,то ошибки пропадают,кроме : '(' - function definition unexpected
 
Invest777 >>:


Большое спасибо ! но вот только при компиляции выдает : 
'(' - function definition unexpected 
'buys' - variable not defined 
'sells' - variable not defined 
  
а если описать "buy"и "sell" как глобальные переменные,то ошибки пропадают,кроме : '(' - function definition unexpected 


  Копировать нужно не часть кода, а все что есть. Не нужно эти переменные объявлять как глобальные, да и часть условия, а именно && OrderMagicNumber()==MAGICMA тоже вам придется убрать.
 
дело в том что вот хочу с помощью етой функции OrdersTotal() найти количество ордеров : 
 

int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
  if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
  }
и после етого, получив количество, выполнить условие : (где например,к-ство sell позиций 2)  (ето урывок с кода все)

if (_ExpertOrdersOpen != 0 && _ExpertOrdersLimit < 1 && -sells == 2)
{
i = _ExpertOrdersTotal;
TradeCycleDirectin = iif(StringGetChar(_OrderComment[0],0) == '+',+1,-1);
_OrderType [i] = iif(TradeCycleDirectin > 0,OP_BUYSTOP,OP_SELLSTOP);
_OrderLots [i] = OrderLotsSize[i];
_OrderOpenPrice [i] = _OrderOpenPrice[i-1]+TradeCycleDirectin * OrderLevel[i] *Point;
_OrderStopLoss [i] = _OrderOpenPrice[i] - TradeDirection * Order_1_TakeProfit*Point;
_OrderStopLoss [i] = _OrderOpenPrice[i] - TradeDirection * Order_1_TakeProfit*Point;
_OrderTakeProfit[i] = _OrderOpenPrice[i] + TradeDirection * Order_2_TakeProfit*Point;
_OrderComment [i] = iifStr(TradeCycleDirectin > 0,StringSetChar(OrderCommentMes[i],0,'+'),StringSetChar(OrderCommentMes[i],0,'-'));
_OrderSend();
modify = 1;
return(true)
но функция невыполняется..... почему..?
 
Invest777 >>:
дело в том что вот хочу с помощью етой функции OrdersTotal() найти количество ордеров : 
 

int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
  if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
  }
и после етого, получив количество, выполнить условие : (где например,к-ство sell позиций 2)  (ето урывок с кода все)

if (_ExpertOrdersOpen != 0 && _ExpertOrdersLimit < 1 && -sells == 2)
{
i = _ExpertOrdersTotal;
TradeCycleDirectin = iif(StringGetChar(_OrderComment[0],0) == '+',+1,-1);
_OrderType [i] = iif(TradeCycleDirectin > 0,OP_BUYSTOP,OP_SELLSTOP);
_OrderLots [i] = OrderLotsSize[i];
_OrderOpenPrice [i] = _OrderOpenPrice[i-1]+TradeCycleDirectin * OrderLevel[i] *Point;
_OrderStopLoss [i] = _OrderOpenPrice[i] - TradeDirection * Order_1_TakeProfit*Point;
_OrderStopLoss [i] = _OrderOpenPrice[i] - TradeDirection * Order_1_TakeProfit*Point;
_OrderTakeProfit[i] = _OrderOpenPrice[i] + TradeDirection * Order_2_TakeProfit*Point;
_OrderComment [i] = iifStr(TradeCycleDirectin > 0,StringSetChar(OrderCommentMes[i],0,'+'),StringSetChar(OrderCommentMes[i],0,'-'));
_OrderSend();
modify = 1;
return(true)
но функция невыполняется..... почему..?


Жжешь! Почитай про область видимости переменных https://docs.mql4.com/ru/basis/variables/local. Делай две различных функции которые возвращают BUY или SELL, или процедуру которая собственно будет менять тебе значения этих переменных.
 
да ! спасибо, и вправду надо было просто создать 2 функции,1 на buy,2 на sell 
Только у меня вот еще один вопрос появился.......при данном коде получается, ( выставляется sellstop или buystop с определенной ценой, tp и sl, но когда цена достигает етого стопа,то цикл на скоко я понемаю продолжается и выставляется следующий) как мне етот цикл прекратить, чтоб следующий открывался уже с другими условиями и параметрами?
if (_ExpertOrdersOpen != 0 && _ExpertOrdersLimit < 1 && -sells == 2)
{
i = _ExpertOrdersTotal; 
TradeCycleDirectin = iif(StringGetChar(_OrderComment[0],0) == '+',+1,-1);
_OrderType [i] = iif(TradeCycleDirectin > 0,OP_BUYSTOP,OP_SELLSTOP);
_OrderLots [i] = OrderLotsSize[i];
_OrderOpenPrice [i] = _OrderOpenPrice[i-1]+TradeCycleDirectin * OrderLevel[i] *Point;
_OrderStopLoss [i] = _OrderOpenPrice[i] - TradeDirection * Order_1_TakeProfit*Point; 
_OrderStopLoss [i] = _OrderOpenPrice[i] - TradeDirection * Order_1_TakeProfit*Point; 
_OrderTakeProfit[i] = _OrderOpenPrice[i] + TradeDirection * Order_2_TakeProfit*Point;
_OrderComment [i] = iifStr(TradeCycleDirectin > 0,StringSetChar(OrderCommentMes[i],0,'+'),StringSetChar(OrderCommentMes[i],0,'-'));
_OrderSend(); 
modify = 1;
return(true)
 

Можно обойтись одной функцией

//+------------------------------------------------------------------+
//|     Массив для хранения количества открытых позиций каждого типа |
//|                                Copyright © 2010, Victor Nicolaev |
//|                                            e-mail: vinin@mail.ru |
//+------------------------------------------------------------------+
//| int Order_Count[6];                                              |
//+------------------------------------------------------------------+
int Order_Count[6];

//+------------------------------------------------------------------+
//|       Функция возвращаюшая количество ордеров определенного типа |
//|                                   исхода из заданных ограничений |
//|                                Copyright © 2010, Victor Nicolaev |
//|                                            e-mail: vinin@mail.ru |
//+------------------------------------------------------------------+
//| int Order_Count_Calculate(int lMagic, int lOP=-1);               |
//+------------------------------------------------------------------+
int Order_Count_Calculate(int lMagic, int lOP=-1){
   ArrayInitialize(Order_Count,0);
   for (int i = OrdersTotal() - 1;  i >= 0;  i--) {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol())                   continue;
      if (OrderMagicNumber() != lMagic)                continue;
      Order_Count[OrderType()]++;
   }
   if (lOP!=-1) return(Order_Count[lOP]);
   return(0);
}
Причина обращения: