Вопрос по массиву, подскажите почему не работает

 

Уже весь код перерыл, написано вроде как правильно, но работать не хочет, вообще не понимаю уже ничего (

ошибка скорей всего глупая какая нибудь ( но сам победить не могу.

вот сам код, должен учитывать ордера.

PS: Пробовал смотреть цены ордеров, их он тоже в массив не помещает, ни цены, ни лоты.

//------------------- Входные параметры советника -------------------+
extern int       MagicNumber = 95293;
//------------------ Глобальные переменные советника ----------------+
double Data_Orders[31][9];                                                 // Массив учёта ордеров.
//--------------------- Подключаемые библиотеки ---------------------+
#include      <stdlib.mqh>                                                 // Стандартная библиотека МТ4

//+------------------------------------------------------------------+
//| #############--- expert initialization function ---############# |
//+------------------------------------------------------------------+
int init()
{
//----
   
//----
   return(0);
}
//+------------------------------------------------------------------+
//| ###########--- expert deinitialization function ---############# |
//+------------------------------------------------------------------+
int deinit()
{
//----
   
//----
   return(0);
}
//+------------------------------------------------------------------+
//| ##############---  expert start function ---#################### |
//+------------------------------------------------------------------+
int start()
{
//---------------- Проверка флагов советника ------------------------+

//----------------- Variable Initialization -------------------------+
   double prew_op_buy, prew_op_sell, prew_bs, prew_ss;
   string st;
   //int i = 2;
//----

   // Заполняем массив данными выставленных ордеров.
   // [0][0 - количество открытых ордеров BUY]
   // [0][1 - количество открытых ордеров SELL]
   // [0][2 - предыдущее кол-во открытых ордеров BUY]
   // [0][3 - предыдущее кол-во открытых ордеров SELL]
   // [0][4 - количество отложенных ордеров Buy Stop]
   // [0][5 - количество отложенных ордеров Sell Stop]
   // [0][6 - предыдущее кол-во отложенных ордеров ордеров Buy Stop]
   // [0][7 - предыдущее кол-во отложенных ордеров ордеров Sell Stop]
   // [0][8 - общий профит позиций Buy]
   // [0][9 - общий профит позиций Sell]
   //
   // [1][0 - курс откр. ордера   (абсолютное знач. курса)]
   // [1][1 - StopLoss ордера     (абсолютное знач. курса)]
   // [1][2 - TakeProfit ордера   (абсолютное знач. курса)]
   // [1][3 - Ticket order]
   // [1][4 - колич. лотов ордера (абсолютное знач. курса)]
   // [1][5 - тип ордера 1=Buy,2=Sell,3=BuyLimit,4=SellLimit,5=BuyStop,6=SellStop]
   // [1][6 - Magic number]
   // [1][7 - Профит ордера в пунктах]
   
   if(OrdersTotal() > 0) {
      prew_op_buy = Data_Orders[0][2];                                              // Сохраняем в переменные, предыдущее кол-во открытых ордеров.
      prew_op_sell = Data_Orders[0][3];
      prew_bs = Data_Orders[0][6];
      prew_ss = Data_Orders[0][7];
      
      
      ArrayInitialize(Data_Orders,0);      
      for(int i = 0; i < OrdersTotal(); i++)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true){
            if(OrderMagicNumber() == MagicNumber) {
               switch(OrderType()) {
                  case OP_BUY: Data_Orders[0][0] ++;
                  case OP_SELL: Data_Orders[0][1] ++;
                  case OP_BUYSTOP: Data_Orders[0][4] ++;
                  case OP_SELLSTOP: Data_Orders[0][5] ++;
               }
            
               Data_Orders[i+1][0] = NormalizeDouble(OrderOpenPrice(), Digits);
               Data_Orders[i+1][1] = NormalizeDouble(OrderStopLoss(), Digits);
               Data_Orders[i+1][2] = NormalizeDouble(OrderTakeProfit(), Digits);
               Data_Orders[i+1][3] = OrderTicket();
               Data_Orders[i+1][4] = OrderLots();
               Data_Orders[i+1][5] = OrderType();
               Data_Orders[i+1][6] = OrderMagicNumber();
               if(Data_Orders[i+1][5] == 0) {
                  Data_Orders[i+1][7] =  (Bid - Data_Orders[i+1][0])/Point ;   // Профит в пунктах ордера Buy
                  if(Data_Orders[i+1][5] == 1) Data_Orders[i+1][7] =  (Data_Orders[i+1][0] - Ask)/Point;    // Профит в пунктах ордера Sell
               }
               else Data_Orders[i+1][7] = 0;
            }
         }
      }
      //Помещаем в массив предыдущее кол-во ордеров.
      Data_Orders[0][2] = prew_op_buy;
      Data_Orders[0][3] = prew_op_sell;
      Data_Orders[0][6] = prew_bs;
      Data_Orders[0][7] = prew_ss;
   }
   else ArrayInitialize(Data_Orders,0);                                       // Если ордеров нет, то обнуляем массив.
   
   //---- Блок вывода информации.
   st =   "\n количество открытых ордеров Buy: " +          DoubleToStr(Data_Orders[0][0], Digits)
         +"\n количество открытых ордеров Sell: " +         DoubleToStr(Data_Orders[0][1], Digits)
         +"\n предыдущее кол-во открытых ордеров Buy: " +   DoubleToStr(Data_Orders[0][2], Digits)
         +"\n предыдущее кол-во открытых ордеров Sell: " +  DoubleToStr(Data_Orders[0][3], Digits)
         +"\n количество отложенных ордеров Buy Stop: " +   DoubleToStr(Data_Orders[0][4], Digits)
         +"\n количество отложенных ордеров Sell Stop: " +  DoubleToStr(Data_Orders[0][5], Digits)
         +"\n предыдущее кол-во отложенных ордеров ордеров Buy Stop: " +   DoubleToStr(Data_Orders[0][6], Digits)
         +"\n предыдущее кол-во отложенных ордеров ордеров Sell Stop: " +  DoubleToStr(Data_Orders[0][7], Digits)
         +"\n общий профит позиций Buy: " +  DoubleToStr(Data_Orders[0][8], Digits)
         +"\n общий профит позиций Sell: " + DoubleToStr(Data_Orders[0][9], Digits)
         +"\n Количество ордеров: " + OrdersTotal()
         ;
    Comment(st);


//----
   return(0);
}
  
  

//+------------------------------------------------------------------+
 
Треба помощь, самому уже никак ( а массивчик такой оч нужон, кто знает ткните носом, что неправильно.
 

Блин переработал ( вобщем ошибка заключалась в том, что я ордера открывал вручную )) естественно без магика, а в условие стоит сравнение с магиком. Нда надо отдыхать побольше.

В этом коде есть ещё несколько косячков, например не показывает сколько ордеров было до, доработаю не забуду если так выложу.

 
PozitiF:

Блин переработал ( вобщем ошибка заключалась в том, что я ордера открывал вручную )) естественно без магика, а в условие стоит сравнение с магиком. Нда надо отдыхать побольше.

В этом коде есть ещё несколько косячков, например не показывает сколько ордеров было до, доработаю не забуду если так выложу.

тут проще
Файлы:
terminal.mqh  4 kb
 
charony:
тут проще

Ну я бы не сказал чтоб прям так проще, у меня 1 массив всего используется. Да и код выглядит только большим.

вот теперь выполняет то что от него и требуется, считает типы ордеров, их профит и общий профит в пунктах, в валюте депозита.

PS: Для тестов, проверка магика была закоментирована.

//------------------- Входные параметры советника -------------------+
extern int       MagicNumber = 95293;
//------------------ Глобальные переменные советника ----------------+
double Data_Orders[31][12];                                                 // Массив учёта ордеров.
//--------------------- Подключаемые библиотеки ---------------------+
#include      <stdlib.mqh>                                                 // Стандартная библиотека МТ4

//+------------------------------------------------------------------+
//| #############--- expert initialization function ---############# |
//+------------------------------------------------------------------+
int init()
{
//----
   
//----
   return(0);
}
//+------------------------------------------------------------------+
//| ###########--- expert deinitialization function ---############# |
//+------------------------------------------------------------------+
int deinit()
{
//----
   
//----
   return(0);
}
//+------------------------------------------------------------------+
//| ##############---  expert start function ---#################### |
//+------------------------------------------------------------------+
int start()
{
//---------------- Проверка флагов советника ------------------------+

//----------------- Variable Initialization -------------------------+
   double prew_op_buy, prew_op_sell, prew_bs, prew_ss;
   string st;
//----

   // Заполняем массив данными выставленных ордеров.
   // [0][0 - количество открытых ордеров BUY]
   // [0][1 - количество открытых ордеров SELL]
   // [0][2 - предыдущее кол-во открытых ордеров BUY]
   // [0][3 - предыдущее кол-во открытых ордеров SELL]
   // [0][4 - количество отложенных ордеров Buy Stop]
   // [0][5 - количество отложенных ордеров Sell Stop]
   // [0][6 - предыдущее кол-во отложенных ордеров ордеров Buy Stop]
   // [0][7 - предыдущее кол-во отложенных ордеров ордеров Sell Stop]
   // [0][8 - общий профит в пунктах позиций Buy]
   // [0][9 - общий профит в пунктах позиций Sell]
   // [0][10 - общий профит в валюте депозита позиций Buy]
   // [0][11 - общий профит в валюте депозита Sell]
   //
   // [1][0 - курс откр. ордера   (абсолютное знач. курса)]
   // [1][1 - StopLoss ордера     (абсолютное знач. курса)]
   // [1][2 - TakeProfit ордера   (абсолютное знач. курса)]
   // [1][3 - Ticket order]
   // [1][4 - колич. лотов ордера (абсолютное знач. курса)]
   // [1][5 - тип ордера 1=Buy,2=Sell,3=BuyLimit,4=SellLimit,5=BuyStop,6=SellStop]
   // [1][6 - Magic number]
   // [1][7 - Профит ордера в пунктах]
   
   if(OrdersTotal() > 0) {
      prew_op_buy = Data_Orders[0][0];                                              // Сохраняем в переменные, предыдущее кол-во открытых ордеров.
      prew_op_sell = Data_Orders[0][1];
      prew_bs = Data_Orders[0][4];
      prew_ss = Data_Orders[0][5];
      
      ArrayInitialize(Data_Orders,0);
      
      for(int i = 0; i<OrdersTotal(); i++)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true){
            //if(OrderMagicNumber() == MagicNumber) {
               switch(OrderType()) {      
                  case  OP_BUY: Data_Orders[0][0] ++; break;
                  case  OP_SELL: Data_Orders[0][1] ++; break;
                  case  OP_BUYSTOP: Data_Orders[0][4] ++; break;
                  case  OP_SELLSTOP: Data_Orders[0][5] ++; break;
               }
               
               Data_Orders[i+1][0] = NormalizeDouble(OrderOpenPrice(), Digits);
               Data_Orders[i+1][1] = NormalizeDouble(OrderStopLoss(), Digits);
               Data_Orders[i+1][2] = NormalizeDouble(OrderTakeProfit(), Digits);
               Data_Orders[i+1][3] = OrderTicket();
               Data_Orders[i+1][4] = OrderLots();
               Data_Orders[i+1][5] = OrderProfit();
               Data_Orders[i+1][6] = OrderType();
               Data_Orders[i+1][7] = OrderMagicNumber();
               if(OrderType() == OP_BUY) {
                  Data_Orders[i+1][8] =  (Bid - Data_Orders[i+1][0])/Point;                     // Профит в пунктах ордера Buy
                  Data_Orders[0][8] = Data_Orders[0][8] + Data_Orders[i+1][8];                  // Общий профит в пунктах Buy;
                  Data_Orders[0][10] = Data_Orders[0][10] + Data_Orders[i+1][5];                // Общий профит в валюте депозита Buy;
               }
               if(OrderType() == OP_SELL) {
                  Data_Orders[i+1][8] =  (Data_Orders[i+1][0] - Ask)/Point;                     // Профит в пунктах ордера Sell
                  Data_Orders[0][9] = Data_Orders[0][9] + Data_Orders[i+1][8];                  // Общий профит в пунктах Sell
                  Data_Orders[0][11] = Data_Orders[0][11] + Data_Orders[i+1][5];                // Общий профит в валюте депозита Sell;
               }
            //}
         }
      }
      //Помещаем в массив предыдущее кол-во ордеров.
      Data_Orders[0][2] = prew_op_buy;
      Data_Orders[0][3] = prew_op_sell;
      Data_Orders[0][6] = prew_bs;
      Data_Orders[0][7] = prew_ss;
   }
   else ArrayInitialize(Data_Orders,0);                                       // Если ордеров нет, то обнуляем массив.
   
   //---- Блок вывода информации.
   st =   "\n количество открытых ордеров Buy: " +          DoubleToStr(Data_Orders[0][0], Digits)
         +"\n количество открытых ордеров Sell: " +         DoubleToStr(Data_Orders[0][1], Digits)
         +"\n предыдущее кол-во открытых ордеров Buy: " +   DoubleToStr(Data_Orders[0][2], Digits)
         +"\n предыдущее кол-во открытых ордеров Sell: " +  DoubleToStr(Data_Orders[0][3], Digits)
         +"\n количество отложенных ордеров Buy Stop: " +   DoubleToStr(Data_Orders[0][4], Digits)
         +"\n количество отложенных ордеров Sell Stop: " +  DoubleToStr(Data_Orders[0][5], Digits)
         +"\n предыдущее кол-во отложенных ордеров ордеров Buy Stop: " +   DoubleToStr(Data_Orders[0][6], Digits)
         +"\n предыдущее кол-во отложенных ордеров ордеров Sell Stop: " +  DoubleToStr(Data_Orders[0][7], Digits)
         +"\n общий профит позиций Buy: " +  DoubleToStr(Data_Orders[0][8], Digits)
         +"\n общий профит позиций Sell: " + DoubleToStr(Data_Orders[0][9], Digits)
         +"\n общий профит в валюте позиций Buy: " + DoubleToStr(Data_Orders[0][10], Digits)
         +"\n общий профит в валюте позиций Sell: " + DoubleToStr(Data_Orders[0][11], Digits)
         +"\n Количество ордеров: " + OrdersTotal()

         ;
    Comment(st);


//----
   return(0);
}
  
  

//+------------------------------------------------------------------+