Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Aleksey
248
Aleksey  

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

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

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

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);
}
  
  

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

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

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

pako
3319
pako  
PozitiF:

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

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

тут проще
Файлы:
terminal.mqh 4 kb
Aleksey
248
Aleksey  
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);
}
  
  

//+------------------------------------------------------------------+
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий