Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 51

 

¡Necesito ayuda de programadores experimentados!

Hola a todos.

Chicos, ¡necesitamos vuestra ayuda! Estoy escribiendo un Asesor Experto. No se me da especialmente bien programar, así que me lo pido. Estoy haciendo una función de comprobación para establecer un bloqueo en las órdenes de mercado. Todos los pedidos se escriben en una matriz bidimensional estructurada. El primer índice (celda) de la matriz [0] son las órdenes básicas (de mercado), el segundo índice (celda) [1] son los bloqueos de las órdenes básicas. Por lo tanto, la función debería comprobar si se ha establecido un bloqueo para una orden básica y si es SÍ, no hacemos nada y seguimos trabajando. He escrito la función, pero funciona de alguna manera torcida. Es decir, si, por ejemplo, se abre una orden de compra de mercado y el terminal emite un mensaje de que no es un tipo de orden de COMPRA sino de VENTA y, por lo tanto, debe establecerse un bloqueo para ella. Pero todo funciona correctamente con las órdenes de VENTA. No puedo entender nada. Las órdenes se escriben correctamente en arrays. He hecho la comprobación correspondiente y todo está perfecto. Todos los criterios de garantía se muestran correctamente en la matriz. Por favor, ayúdenme a encontrar un error en el código o a modificar de alguna manera mi función. Adjunto la función.

//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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);                                                                       // Передаем нашей функции полученное значение  
  }
 
Сергей:

¡Necesito ayuda de programadores experimentados!

Hola a todos.

Chicos, ¡necesitamos vuestra ayuda! Estoy escribiendo un Asesor Experto. No se me da especialmente bien programar, así que me lo pido. Estoy haciendo una función de comprobación para establecer un bloqueo en las órdenes de mercado. Todos los pedidos se escriben en una matriz bidimensional estructurada. El primer índice (celda) de la matriz [0] son las órdenes básicas (de mercado), el segundo índice (celda) [1] son los bloqueos de las órdenes básicas. Por lo tanto, la función debería comprobar si se ha establecido un bloqueo para una orden básica y si es SÍ, no hacemos nada y seguimos trabajando. He escrito la función, pero funciona de alguna manera torcida. Es decir, si, por ejemplo, se abre una orden de compra de mercado y el terminal emite un mensaje de que no es un tipo de orden de COMPRA sino de VENTA y, por lo tanto, debe establecerse un bloqueo para ella. Pero todo funciona correctamente con las órdenes de VENTA. No puedo entender nada. Las órdenes se escriben correctamente en arrays. He hecho la comprobación correspondiente y todo está perfecto. Todos los criterios de garantía se muestran correctamente en la matriz. Por favor, ayúdenme a encontrar un error en el código o a modificar de alguna manera mi función. Adjunto la función.

//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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);                                                                       // Передаем нашей функции полученное значение  
  }

Puedes intentar ponerlo antes de
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) ==OP_SELL)
Ponga otra cosa

O mostrar el registro de malvendidos.
 
Vladislav Andruschenko:

Intenta poner
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) ==OP_SELL)
Ponga otra cosa

O mostrar el tronco sin colgar.

Lo hice. Nada ha cambiado. Aquí están las entradas del registro de eventos:

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-ордер. Необходимо его установить!
 
busque en la función donde se rellena el arrayInfoOrderNew[1][n].TypeOrder
 
Vladislav Andruschenko:
Mira en la función donde rellenas el arrayInfoOrderNew[1][n].TypeOrder
La función que rellena el array emite todos los datos correctamente. Puedo mostrarte desde el registro cómo se llenan las celdas. Abrimos una orden de mercado Buy#1 y le colocamos un lote SellStop#2. A continuación, abrimos una orden de mercado Sell#3 y colocamos también un bloqueo BuyStop#4. Todas estas acciones se muestran en el registro de eventos. Me interesa saber cómo la orden Buy#1 entra en el bucle de las órdenes de venta. ¿Cómo puede ser? Por lo tanto, hay un error que muestra que no hay una orden de bloqueo correspondiente. Pero esto no afecta a Sell#3. La función comprueba la posición de la cerradura y da el resultado correcto. Aquí, compruebe usted mismo el informe de registro:
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-ордер. Необходимо его установить!
 
Gracias a Vladislav Andruschenko por participar en la búsqueda del problema. Me lo imaginaba. Tuve que rehacer un poco el código y todo funcionó a la vez.
 
Сергей:
Gracias a Vladislav Andruschenko por participar en la búsqueda del problema. Parece que lo he resuelto. Tuve que rehacer un poco el código y todo funcionó a la vez.

no hay problema

Acabo de caer en el fin de semana. :-) Es bueno que se solucione.

 
Vladislav Andruschenko:

no hay problema

Acabo de caer en el fin de semana. :-) Es bueno que se solucione.

Ha surgido otra cuestión:

¿Cómo poner a cero o eliminar información en cualquier celda de un array heterogéneo estructurado? El caso es que el comentario de la orden ha cambiado y necesito borrar esta orden de una celda de un array estructurado y definir esta orden en otro array. Todo está más o menos claro con un array normal, pero no estoy seguro de qué operadores o funciones funcionan, o cómo procesarlo todo. ¿Y cómo copio una matriz estructurada en otra para guardar la información sobre el relleno anterior y luego compararla con la nueva? Por favor, avisen a quien sepa de este tema. Se lo agradecería mucho.

 
¿Puede la etiqueta de precio(OBJ_ARROW_LEFT_PRICE) tener su propio texto en lugar del precio?
 
ilnur17021992:
¿Puede la etiqueta de precio(OBJ_ARROW_LEFT_PRICE) tener su propio texto en lugar del precio?
No se puede. Puede escribir algo similar a la etiqueta de precio OBJ_TEXT
Razón de la queja: