Почему советник зависает?

 

Здравствуйте! Я пробую написать советник,который подсчитывает количество ордеров каждого вида.При выполнении с функцией  OrderSelect, он почему-то всегда зависает,но когда она закоментированна,все работает. Я работал с функцией  OrderSelect и раньше, и таких проблем не возникало, но этот случай вообще не пробиваемый для меня!Помогите пожалуйста!!!

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net"

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int OrdTotl;  // Всего ордеров
int OrdType;  // Тип ордера
//int sum;      // Сумма всех ордеров

int CountBUY;       // 0
int CountSELL;      // 1
int CountBUYLIMIT;  // 2
int CountSELLLIMIT; // 3
int CountBUYSTOP;   // 4
int CountSELLSTOP;  // 5



int init()
  {
//----
   OrdTotl        = 0;
   
   CountBUY       = 0;
   CountSELL      = 0; 
   CountBUYLIMIT  = 0; 
   CountSELLLIMIT = 0;
   CountBUYSTOP   = 0;  
   CountSELLSTOP  = 0; 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+

  
/////////////////////////////////////////////////////
//// OrdersCounter //////////////////////////////////
/////////////////////////////////////////////////////
void OrdersCounter()  // Счетчик ордеров
{
 int sum = OrdersTotal();
 
  while(sum != 0 )
   {
    OrderSelect(sum-1,SELECT_BY_POS);
    RefreshRates();
    OrdType = OrderType();
       
    switch(OrdType)
    {        
     case 0: 
     CountBUY++;
     break;
          case 1:
          CountSELL++;
          break;
                case 2:
                CountBUYLIMIT++;
                break;
                      case 3:
                      CountSELLLIMIT++;
                      break;
                            case 4:
                            CountBUYSTOP++;
                            break;
                                  case 5:
                                  CountSELLSTOP++;
                                  break;
    default:
    Comment("\n\n                                                   No orders" );
    }
  } 
}

/////////////////////////////////////////////////////
//// OrdersShow /////////////////////////////////////
/////////////////////////////////////////////////////

void OrdersShow()
{
 
 OrdersCounter();
 Comment("\n\n\n                                                   OrdersTotal = ",OrdersTotal(),
         "\n                                                   BUY = ",CountBUY,
         "\n                                                   SELL = ",CountSELL,
         "\n                                                   BUY LIMIT = ",CountBUYLIMIT,
         "\n                                                   SELL LIMIT = ",CountSELLLIMIT,
         "\n                                                   BUY STOP = ",CountBUYSTOP,
         "\n                                                   SELL STOP = ",CountSELLSTOP
        );
}


/////////////////////////////////////////////////////
//// Orders /////////////////////////////////////////
/////////////////////////////////////////////////////  
void Orders()
{
 
 
 
  



} 
 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  
  OrdersShow();
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
DENIS_B:
Здравствуйте! Я пробую написать советник,который подсчитывает количество ордеров каждого вида.При выполнении с функцией  OrderSelect, он почему-то всегда зависает,но когда она закоментированна,все работает. Я работал с функцией  OrderSelect и раньше, и таких проблем не возникало, но этот случай вообще не пробиваемый для меня!Помогите пожалуйста!!!

А где Вы такую конструкцию видели:

  while(sum != 0 )
   {
    OrderSelect (sum-1,SELECT_BY_POS);
    
    sum--;
   }

 А если, уж, очень нравится работать с бесконечными циклами, то не забывайте задавать условие по выходу из оного!!! В данном случае красная строка.

А, если учитывать, что переучиваться сложнее, то изящнее считать так:

int gia_MyOrders[6];
void OrdersCounter (int Magic)  // Счетчик ордеров
{
     int sum = OrdersTotal();
     if (sum == 0) return;
     ArrayInitialize (gia_MyOrders, 0);
     for (int li_ORD = sum - 1; li_ORD <= 0; li_ORD--)
     {
        if (!OrderSelect (li_ORD, SELECT_BY_POS) continue;
        //---- Нужно использовать фильтра для отсечения "не своих" ордеров
        if (OrderSymbol() != Symbol()) continue;
        if (Magic >= 0) if (OrderMagicNumber() != Magic) continue;
        //---- Подсчитываем ордера в массив
        gia_MyOrders[OrderType()]++;
     }
     Comment ("\n\n                                                   No orders" );
} 
 

Вот здесь все работает.

 

//+------------------------------------------------------------------+
//|                       IDT_close_profit_positions.mq4                          |
//|                      Copyright © 2004, Globus                    |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Globus"

#include <stdlib.mqh>
#include <WinUser32.mqh>

#define SLIPPAGE  1   // value of slippage

//+------------------------------------------------------------------+
//| script "intraday trading - close all profit positions"                            |
//+------------------------------------------------------------------+
int CProfit()
  {
  // PlaySound("Tick.wav");
  int sum=OrdersTotal();
  double change=0;
  Print ("Count of ticket ",sum);
 
  while (sum>0 || sum<0)
    {
    OrderSelect(sum-1,SELECT_BY_POS);
    RefreshRates();
      if (OrderProfit()>0 || OrderProfit()<0)
      {
        if (OrderType ()==0)
         {
          OrderClose( OrderTicket(), OrderLots(), Bid, SLIPPAGE);
         }
         if (OrderType ()==1)
         {
          OrderClose( OrderTicket(), OrderLots(), Ask, SLIPPAGE);
         }
        change++;    
       }
 
     sum--;
    
    }
      
  Print ("Count of changes ",change);
  // PlaySound("Ok.wav");
  return(0);
  }
//+------------------------------------------------------------------+
int start()
{

 CProfit();

 return (0);
}
 
Я все понял.
Причина обращения: