Questions from Beginners MQL4 MT4 MetaTrader 4 - page 51

 

Need help from experienced programmers!

Hi all!

Guys, we need your help! I am writing one Expert Advisor. I am not particularly good at programming, so I am asking for it. I am making a checking function for setting a lock on market orders. All the orders are written in a structured two-dimensional array. The first index (cell) of the array [0] is basic (market) orders, the second index (cell) [1] is locks for the basic orders. So, the function should check if a lock is set for a basic order and if it is YES, we do nothing and continue working. I have written the function, but it works somehow askew. I.e., if, for example, a market Buy order is opened and the terminal issues a message that it is not a BUY order type but SELL and therefore a lock should be set for it. But everything is working correctly with SELL orders. I cannot understand anything. The orders are correctly written into arrays. I have done the appropriate check and everything is perfect. All of the warrant criteria are correctly shown in the array. Please help me find an error in code or somehow modify my function. I am attaching the function.

//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
bool CheckOrders()                                                                              // Есть массив с базовыми ордерами, открытыми по рынку InfoOrderNew[0][200]
  {                                                                                             // Есть массив с лок ордерами, выставленными к базовым InfoOrderNew[1][200]
   int    TypeOrder;
   string Type          = "",
          OrderComm     = "";
   bool   OpenLockOrder = false;                                                                // Флаг на установку лок ордера      
  
   for(int i=OrdersTotal()-1;i>=0;i--)                                                          // Выполняем перебор по рыночн. и отлож. ордерам
     {
      if((OrderSelect(i,SELECT_BY_POS) == true)                                                 // Если есть следующ.
      && (OrderSymbol() == Symbol()))                                                           // .. и наша вал.пара
        {
         OrderComm = OrderComment();                                                            // Выбираем соответствующий комментарий ордера
         TypeOrder = OrderType();                                                               // Выбираем соответствующий тип ордера                                                          
         for(int n=0; n<=199; n++)                                                              // Выполняем прогон по массиву ордеров
            {  
             if(StringFind(OrderComm,"BaseIndex #"+IntegerToString(n)+"_",0)>=0)                // Ищем базовый ордер с индексом в комментарии, соответствующем номеру ячейки в массиве ордеров
               {
                if((TypeOrder == InfoOrderNew[0][n].TypeOrder) == OP_BUY)                       // Если находим и наш ордер в массиве является BUY
                  {
                   if(InfoOrderNew[1][n].TypeOrder == 1 || InfoOrderNew[1][n].TypeOrder == 5)   // Проверяем, выставлен ли к нему лок ордер (SELL или SELLSTOP) в массиве лок ордеров
                     {
                      if(InfoOrderNew[1][n].TypeOrder == 1) Type = "Sell";
                      if(InfoOrderNew[1][n].TypeOrder == 5) Type = "SellStop";
                      if(Debug) Print("Функция CheckOrders(): К ордеру Buy #",InfoOrderNew[0][n].TicketOrder," найден Lock-ордер ",Type," #",InfoOrderNew[1][n].TicketOrder,".");
                      break;                                                                    // Если лок выставлен, то выходим из функции
                     }
                   else                                                                         // Если нет, то
                     {
                      if(Debug) Print("Функция CheckOrders(): К ордеру Buy #",InfoOrderNew[0][n].TicketOrder," не найден Lock-ордер. Необходимо его установить!");
                      OpenLockOrder = true;                                                     // Даем сигнал на установку лока
                     }
                  }  
                if((TypeOrder == InfoOrderNew[0][n].TypeOrder) == OP_SELL)                      // Если наш ордер в массиве является SELL
                  {  
                   if(InfoOrderNew[1][n].TypeOrder == 0 || InfoOrderNew[1][n].TypeOrder == 4)   // Проверяем, выставлен ли к нему лок ордер (BUY или BUYSTOP) в массиве лок ордеров
                     {
                      if(InfoOrderNew[1][n].TypeOrder == 0) Type = "Buy";
                      if(InfoOrderNew[1][n].TypeOrder == 4) Type = "BuyStop";
                      if(Debug) Print("Функция CheckOrders(): К ордеру Sell #",InfoOrderNew[0][n].TicketOrder," найден Lock-ордер ",Type," #",InfoOrderNew[1][n].TicketOrder,".");
                      break;                                                                    // Если лок выставлен, то выходим из функции
                     }
                   else                                                                         // Если нет, то
                    {
                     if(Debug) Print("Функция CheckOrders(): К ордеру Sell #",InfoOrderNew[0][n].TicketOrder," не найден Lock-ордер. Необходимо его установить!");
                     OpenLockOrder = true;                                                      // Даем сигнал на установку лока
                    }
                  }    
               }
            }
        }
     }
   return(OpenLockOrder);                                                                       // Передаем нашей функции полученное значение  
  }
 
Сергей:

Need help from experienced programmers!

Hi all!

Guys, we need your help! I am writing one Expert Advisor. I am not particularly good at programming, so I am asking for it. I am making a checking function for setting a lock on market orders. All the orders are written in a structured two-dimensional array. The first index (cell) of the array [0] is basic (market) orders, the second index (cell) [1] is locks for the basic orders. So, the function should check if a lock is set for a basic order and if it is YES, we do nothing and continue working. I have written the function, but it works somehow askew. I.e., if, for example, a market Buy order is opened and the terminal issues a message that it is not a BUY order type but SELL and therefore a lock should be set for it. But everything is working correctly with SELL orders. I cannot understand anything. The orders are correctly written into arrays. I have done the appropriate check and everything is perfect. All of the warrant criteria are correctly shown in the array. Please help me find an error in code or somehow modify my function. I am attaching the function.

//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
bool CheckOrders()                                                                              // Есть массив с базовыми ордерами, открытыми по рынку InfoOrderNew[0][200]
  {                                                                                             // Есть массив с лок ордерами, выставленными к базовым InfoOrderNew[1][200]
   int    TypeOrder;
   string Type          = "",
          OrderComm     = "";
   bool   OpenLockOrder = false;                                                                // Флаг на установку лок ордера      
  
   for(int i=OrdersTotal()-1;i>=0;i--)                                                          // Выполняем перебор по рыночн. и отлож. ордерам
     {
      if((OrderSelect(i,SELECT_BY_POS) == true)                                                 // Если есть следующ.
      && (OrderSymbol() == Symbol()))                                                           // .. и наша вал.пара
        {
         OrderComm = OrderComment();                                                            // Выбираем соответствующий комментарий ордера
         TypeOrder = OrderType();                                                               // Выбираем соответствующий тип ордера                                                          
         for(int n=0; n<=199; n++)                                                              // Выполняем прогон по массиву ордеров
            {  
             if(StringFind(OrderComm,"BaseIndex #"+IntegerToString(n)+"_",0)>=0)                // Ищем базовый ордер с индексом в комментарии, соответствующем номеру ячейки в массиве ордеров
               {
                if((TypeOrder == InfoOrderNew[0][n].TypeOrder) == OP_BUY)                       // Если находим и наш ордер в массиве является BUY
                  {
                   if(InfoOrderNew[1][n].TypeOrder == 1 || InfoOrderNew[1][n].TypeOrder == 5)   // Проверяем, выставлен ли к нему лок ордер (SELL или SELLSTOP) в массиве лок ордеров
                     {
                      if(InfoOrderNew[1][n].TypeOrder == 1) Type = "Sell";
                      if(InfoOrderNew[1][n].TypeOrder == 5) Type = "SellStop";
                      if(Debug) Print("Функция CheckOrders(): К ордеру Buy #",InfoOrderNew[0][n].TicketOrder," найден Lock-ордер ",Type," #",InfoOrderNew[1][n].TicketOrder,".");
                      break;                                                                    // Если лок выставлен, то выходим из функции
                     }
                   else                                                                         // Если нет, то
                     {
                      if(Debug) Print("Функция CheckOrders(): К ордеру Buy #",InfoOrderNew[0][n].TicketOrder," не найден Lock-ордер. Необходимо его установить!");
                      OpenLockOrder = true;                                                     // Даем сигнал на установку лока
                     }
                  }  
                if((TypeOrder == InfoOrderNew[0][n].TypeOrder) == OP_SELL)                      // Если наш ордер в массиве является SELL
                  {  
                   if(InfoOrderNew[1][n].TypeOrder == 0 || InfoOrderNew[1][n].TypeOrder == 4)   // Проверяем, выставлен ли к нему лок ордер (BUY или BUYSTOP) в массиве лок ордеров
                     {
                      if(InfoOrderNew[1][n].TypeOrder == 0) Type = "Buy";
                      if(InfoOrderNew[1][n].TypeOrder == 4) Type = "BuyStop";
                      if(Debug) Print("Функция CheckOrders(): К ордеру Sell #",InfoOrderNew[0][n].TicketOrder," найден Lock-ордер ",Type," #",InfoOrderNew[1][n].TicketOrder,".");
                      break;                                                                    // Если лок выставлен, то выходим из функции
                     }
                   else                                                                         // Если нет, то
                    {
                     if(Debug) Print("Функция CheckOrders(): К ордеру Sell #",InfoOrderNew[0][n].TicketOrder," не найден Lock-ордер. Необходимо его установить!");
                     OpenLockOrder = true;                                                      // Даем сигнал на установку лока
                    }
                  }    
               }
            }
        }
     }
   return(OpenLockOrder);                                                                       // Передаем нашей функции полученное значение  
  }

You can try to put it before
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) ==OP_SELL)
Put else

Or show the underselling log.
 
Vladislav Andruschenko:

Try putting
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) ==OP_SELL)
Put else

Or show the unrung log.

I did. Nothing has changed. Here are the event log entries:

2017.01.15 18:23:51.062 2017.01.03 04:15:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция SendMarketOrder(): Торговля разрешена, отправляем ордер...
2017.01.15 18:23:51.062 2017.01.03 04:15:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: open #1 buy 0.10 GBPUSD at 1.23020 ok
2017.01.15 18:23:51.062 2017.01.03 04:15:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция SendMarketOrder(): Ордер отправлен успешно! Характеристики ордера: Buy#1; Цена открытия: 0.0; Лот: 0.1; Стоплосс: 0.0; Тейкпрофит: 0.0.
2017.01.15 18:23:51.062 2017.01.03 04:15:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: В работе функция ModifyOrder()
2017.01.15 18:23:51.062 2017.01.03 04:15:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция ModifyOrder()
2017.01.15 18:23:51.062 2017.01.03 04:15:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция ModifyOrder(): Торговый поток свободен!
2017.01.15 18:23:51.062 2017.01.03 04:15:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: modify #1 buy 0.10 GBPUSD at 1.23020 sl: 1.18020 tp: 1.23520 ok
2017.01.15 18:23:51.062 2017.01.03 04:15:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция ModifyOrder(): Модификация ордера выполнена успешно!
2017.01.15 18:23:51.062 2017.01.03 04:15:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: В работе функция SetPendingOrder()
2017.01.15 18:23:51.062 2017.01.03 04:15:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция SetPendingOrder(): Выставленная цена SellStop ордера удовлетворяет условиям брокера.
2017.01.15 18:23:51.062 2017.01.03 04:15:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: open #2 sell stop 0.10 GBPUSD at 1.22020 ok
2017.01.15 18:23:51.062 2017.01.03 04:15:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция SetPendingOrder(): Отложенный ордер выставлен c 1-й попытки! Характеристики ордера: SellStop #2; Цена: 1.2202; Лот: 0.1.
2017.01.15 18:23:51.062 2017.01.03 04:15:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Отложенный SellStop ордер успешно установлен!
2017.01.15 18:23:51.109 2017.01.03 04:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива Lock-ордерами. Ордер Тикет #2; Цена=1.2202; Тип=5; ячейка[0].
2017.01.15 18:23:51.109 2017.01.03 04:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива обычными ордерами. Ордер Тикет #1; Цена=1.2302; Тип=0; ячейка[0].
2017.01.15 18:23:51.109 2017.01.03 04:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество найденных ордеров = 2.
2017.01.15 18:23:51.109 2017.01.03 04:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество рыночных ордеров = 1.
2017.01.15 18:23:51.109 2017.01.03 04:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество Lock-ордеров = 1.
2017.01.15 18:23:51.109 2017.01.03 04:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция CheckOrders(): К ордеру Sell #1 не найден Lock-ордер. Необходимо его установить!
 
look in the function where YOU fill theInfoOrderNew[1][n].TypeOrder array
 
Vladislav Andruschenko:
Look in the function where YOU fill theInfoOrderNew[1][n].TypeOrder array
The function that fills the array outputs all the data correctly. I can show you from the log how the cells are filled. We open a market order Buy#1 and place a SellStop#2 lockup against it. Then we open a Sell#3 market order and place a BuyStop#4 lockup on it as well. All these actions are shown in the Event Log. I am interested how Buy#1 order gets into the loop of Sell orders! How can it be? Hence there is an error showing that there is no corresponding lock order. But this does not concern Sell#3. The function checks the lock position and gives the correct result. Here, check the log report yourself:
2017.01.15 23:09:48.234 2017.01.03 09:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива Lock-ордерами. Ордер Тикет #4; Цена=1.2387; Тип ордера=BuyStop; ячейка[1].
2017.01.15 23:09:48.234 2017.01.03 09:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива обычными ордерами. Ордер Тикет #3; Цена=1.2287; Тип ордера=Sell; ячейка[1].
2017.01.15 23:09:48.234 2017.01.03 09:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива Lock-ордерами. Ордер Тикет #2; Цена=1.2202; Тип ордера=SellStop; ячейка[0].
2017.01.15 23:09:48.234 2017.01.03 09:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива обычными ордерами. Ордер Тикет #1; Цена=1.2302; Тип ордера=Buy; ячейка[0].
2017.01.15 23:09:48.234 2017.01.03 09:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество найденных ордеров = 4.
2017.01.15 23:09:48.234 2017.01.03 09:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество рыночных ордеров = 2.
2017.01.15 23:09:48.234 2017.01.03 09:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество Lock-ордеров = 2.
2017.01.15 23:09:48.234 2017.01.03 09:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция CheckOrders(): К ордеру Sell #3 найден Lock-ордер BuyStop #4.
2017.01.15 23:09:48.234 2017.01.03 09:30:00  Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция CheckOrders(): К ордеру Sell #1 не найден Lock-ордер. Необходимо его установить!
 
Thank you Vladislav Andruschenko for taking part in finding the problem! I kind of figured it out. I had to rework the code a bit and everything worked at once.
 
Сергей:
Thank you Vladislav Andruschenko for taking part in finding the problem! I seem to have solved it. I had to rework the code a bit and everything worked at once.

no problem

I just fell out for the weekend. :-) It's good to get it sorted.

 
Vladislav Andruschenko:

no problem

I just fell out for the weekend. :-) It's good that it's sorted.

Another question has arisen:

How to zero or delete information in any cell of structured heterogeneous array? The thing is, the comment of the order has changed and I need to delete this order from a cell of a structured array and define this order in another array. Everything is more or less clear with a regular array, but I'm not sure what operators or functions work, or how to process it all. And how do I copy one structured array into another to save information about the previous filling and then compare it with the new one? Please advise who knows what on this subject. I would be very grateful!

 
Can the price tag(OBJ_ARROW_LEFT_PRICE) have its own text instead of the price, if so how?
 
ilnur17021992:
Can the price tag(OBJ_ARROW_LEFT_PRICE) have its own text instead of the price, if so how?
You can't. You can write something similar to the OBJ_TEXT price tag
Reason: