Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 51

 

Precisa da ajuda de programadores experientes!

Olá a todos!

Rapazes, precisamos de sua ajuda! Estou escrevendo um Conselheiro Especializado. Eu não sou particularmente bom em programação, então estou pedindo por isso. Estou realizando uma função de verificação para fixar um cadeado nas ordens do mercado. Todas as ordens são escritas em uma matriz bidimensional estruturada. O primeiro índice (célula) da matriz [0] é ordens básicas (de mercado), o segundo índice (célula) [1] é o bloqueio para as ordens básicas. Portanto, a função deve verificar se uma fechadura está definida para uma ordem básica e, se for SIM, não fazemos nada e continuamos a trabalhar. Escrevi a função, mas de alguma forma funciona de novo. Isto é, se, por exemplo, uma ordem de compra de mercado for aberta e o terminal emitir uma mensagem de que não é um tipo de ordem de compra, mas de venda e, portanto, uma fechadura deve ser definida para ela. Mas tudo está funcionando corretamente com as ordens de venda. Eu não consigo entender nada. As ordens são corretamente escritas em arrays. Eu fiz a verificação apropriada e tudo está perfeito. Todos os critérios do mandado são mostrados corretamente na matriz. Por favor, ajude-me a encontrar um erro no código ou de alguma forma modifique minha função. Estou anexando a função.

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

Precisa da ajuda de programadores experientes!

Olá a todos!

Rapazes, precisamos de sua ajuda! Estou escrevendo um Conselheiro Especializado. Eu não sou particularmente bom em programação, então estou pedindo por isso. Estou realizando uma função de verificação para fixar um cadeado nas ordens do mercado. Todas as ordens são escritas em uma matriz bidimensional estruturada. O primeiro índice (célula) da matriz [0] é ordens básicas (de mercado), o segundo índice (célula) [1] é o bloqueio para as ordens básicas. Portanto, a função deve verificar se uma fechadura está definida para uma ordem básica e, se for SIM, não fazemos nada e continuamos a trabalhar. Escrevi a função, mas de alguma forma funciona de novo. Isto é, se, por exemplo, uma ordem de compra de mercado for aberta e o terminal emitir uma mensagem de que não é um tipo de ordem de compra, mas de venda e, portanto, uma fechadura deve ser definida para ela. Mas tudo está funcionando corretamente com as ordens de venda. Eu não consigo entender nada. As ordens são corretamente escritas em arrays. Eu fiz a verificação apropriada e tudo está perfeito. Todos os critérios do mandado são mostrados corretamente na matriz. Por favor, ajude-me a encontrar um erro no código ou de alguma forma modifique minha função. Estou anexando a função.

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

Você pode tentar colocá-lo antes de
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) ==OP_SELL)
Coloque mais

Ou mostrar o registro de sub-vendas.
 
Vladislav Andruschenko:

Tente colocar
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) ==OP_SELL)
Coloque mais

Ou mostrar o diário de bordo não-rungido.

Eu fiz. Nada mudou. Aqui estão as entradas do log 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-ордер. Необходимо его установить!
 
veja na função onde VOCÊ preenche oInfoOrderNew[1][n].TypeOrder array
 
Vladislav Andruschenko:
Veja na função onde VOCÊ preenche oInfoOrderNew[1][n].TypeOrder array
A função que preenche a matriz produz todos os dados corretamente. Posso mostrar a partir do registro como as células são preenchidas. Abrimos uma ordem de mercado Buy#1 e colocamos um lote SellStop#2 nele. Em seguida, abrimos uma ordem de mercado Sell#3 e colocamos também um bloqueio BuyStop#4. Todas estas ações são mostradas no Registro de Eventos. Estou interessado em saber como o pedido de Compra#1 entra no ciclo de pedidos de Venda! Como pode ser? Portanto, há um erro que mostra que não há uma ordem de bloqueio correspondente. Mas isto não diz respeito à Venda#3. A função verifica a posição de bloqueio e dá o resultado correto. Aqui, confira você mesmo o relatório 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-ордер. Необходимо его установить!
 
Obrigado Vladislav Andruschenko por ter participado na busca do problema! Eu meio que descobri isso. Tive que retrabalhar um pouco o código e tudo funcionou de uma só vez.
 
Сергей:
Obrigado Vladislav Andruschenko por ter participado na busca do problema! Parece que já resolvi isso. Tive que retrabalhar um pouco o código e tudo funcionou de uma só vez.

sem problemas

Acabei de sair para o fim de semana. :-) É bom que esteja classificado.

 
Vladislav Andruschenko:

sem problemas

Acabei de sair para o fim de semana. :-) É bom que esteja classificado.

Surgiu outra pergunta:

Como faço para zerar ou apagar informações em qualquer célula de uma matriz heterogênea estruturada? A questão é que o comentário da ordem mudou e eu preciso apagar esta ordem de uma célula de uma matriz estruturada e definir esta ordem em outra matriz. Tudo está mais ou menos claro com uma matriz regular, mas não tenho certeza de quais operadores ou funções funcionam, ou como processar tudo isso. E como copiar uma matriz estruturada em outra para salvar informações sobre o preenchimento anterior e depois compará-la com a nova? Por favor, informe quem sabe o quê sobre este assunto. Eu ficaria muito grato!

 
A etiqueta de preço(OBJ_ARROW_LEFT_PRICE) pode ter seu próprio texto em vez do preço, se sim, como?
 
ilnur17021992:
A etiqueta de preço(OBJ_ARROW_LEFT_PRICE) pode ter seu próprio texto em vez do preço, se sim, como?
Você não pode. Você pode escrever algo parecido com a etiqueta de preço OBJ_TEXT