Подскажите локальная или глобальная переменная?

 

Скажите если я в советнике пишу

if(OrdersTotal() == 0)
 {ЧТО-ТО тут}

при этом у меня в данном терминале запущено 2-3 этих же советника на других парах

данная функция проверяет наличие ордеров на данной паре или вообще в терминале?

Так как я видела что для проверки делают и иное

Вот пример

int OrdersTotals()
  {
   int O;
   for(int i = OrdersTotal() - 1; i>0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrdersTotal() >= 0)
              {
               O = 1;
              }
            else
               O=0;
           }
        }
     }


   return O;
  }
 

У вас отслеживается условие правильно, по символу и номеру, но потом перебивает условие 

OrdersTotal()

Которое выдает всё что есть в терминале

 
Volodymyr Zubov #:

У вас отслеживается условие правильно, по символу и номеру, но потом перебивает условие 

Которое выдает всё что есть в терминале

Нет у меня сейчас стоит только

if(OrdersTotal() == 0)
              

И именно про это я и спросила.
Но поняла по вашему ответу, что нужно использовать иной вариант
так как if(OrdersTotal() == 0) отслеживает все что происходит в терминале
             

 

вот функция возращает количество и работает безошибочно.

//+----------------------------------------------------------------------------+                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1)
  {
   int i, k=OrdersTotal(), kp=0;

   if(sy=="0")
      sy=_Symbol;
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==sy || sy=="")
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                     kp++;
                 }
              }
           }
        }
     }
   return(kp);
  }
//End
 
Volodymyr Zubov #:

вот функция возращает количество и работает безошибочно.

Спасибо большое за столь развернутый ответ!
 
Volodymyr Zubov #:

вот функция возращает количество и работает безошибочно.

Более компактное решение

//+------------------------------------------------------------------+
//| Подсчет ордеров по символу и типу                                |
//+------------------------------------------------------------------+
int OP(int type=-1){
   int i,res=0;
   for(i=OrdersTotal()-1; i>=0; i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic||Magic==0)) {
   if(OrderType()==type || type<0) res++;}
return(res);}

if (OP(0) == 0) //Buy ордеров нет по символу

if (OP(1) == 0) //Sell ордеров нет по символу

if (OP(-1) == 0) //Всех типов ордеров нет по символу

 

и избегайте условий, которые не будут выполняться так, как написано

а выполнятся в точности по алгоритму

for(int i = OrdersTotal() - 1; i>0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrdersTotal() >= 0)

в Вашем случае i никогда не будет 0

то есть то что написано ниже >=0 можно уже не читать

 
FXwin #:

Более компактное решение

if (OP(0) == 0) //Buy ордеров нет по символу

if (OP(1) == 0) //Sell ордеров нет по символу

if (OP(-1) == 0) //Всех типов ордеров нет по символу

Спасибо большое отличное решение не только более компактное, но и более информативное.
 
Natalya Smirnova:

Скажите если я в советнике пишу

при этом у меня в данном терминале запущено 2-3 этих же советника на других парах

данная функция проверяет наличие ордеров на данной паре или вообще в терминале?

Так как я видела что для проверки делают и иное

Вот пример

Наличие позиций по символу можно проверить проще

bool OrdersTotals(const int magic,
                  const string symbol,
                  const int type)
  {
   for(int i = 0; i<OrdersTotal(); i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderMagicNumber() != magic)
         continue;
      if(OrderSymbol() != symbol)
         continue;
      if(OrderType() != type)
         continue;
      return true;
     }
   return false;
  }

Вам ведь просто нужно проверить и все. Тут я прописал проверку типа. Это MT4 поэтому отложки в куче будут. Но можно по другому просто проверить какие вам нужны ордера.
Сам смысл думаю понятен. А дальше ваша фантазия.

Причина обращения: