Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 51

 

Ho bisogno dell'aiuto di programmatori esperti!

Ciao a tutti!

Ragazzi, abbiamo bisogno del vostro aiuto! Sto scrivendo un Expert Advisor. Non sono particolarmente bravo a programmare, quindi lo chiedo. Sto facendo una funzione di controllo per impostare un blocco sugli ordini a mercato. Tutti gli ordini sono scritti in un array bidimensionale strutturato. Il primo indice (cella) della matrice [0] sono gli ordini di base (mercato), il secondo indice (cella) [1] sono le chiusure per gli ordini di base. Quindi, la funzione dovrebbe controllare se è impostato un blocco per un ordine di base e se è SÌ, non facciamo nulla e continuiamo a lavorare. Ho scritto la funzione, ma funziona in qualche modo storto. Cioè, se, per esempio, viene aperto un ordine di acquisto a mercato e il terminale emette un messaggio che non è un tipo di ordine di ACQUISTO ma di VENDITA e quindi bisogna impostare un blocco per esso. Ma tutto funziona correttamente con gli ordini SELL. Non riesco a capire nulla. Gli ordini sono scritti correttamente negli array. Ho fatto il controllo appropriato e tutto è perfetto. Tutti i criteri di garanzia sono mostrati correttamente nell'array. Per favore aiutatemi a trovare un errore nel codice o a modificare in qualche modo la mia funzione. Allego la funzione.

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

Ho bisogno dell'aiuto di programmatori esperti!

Ciao a tutti!

Ragazzi, abbiamo bisogno del vostro aiuto! Sto scrivendo un Expert Advisor. Non sono particolarmente bravo a programmare, quindi lo chiedo. Sto facendo una funzione di controllo per impostare un blocco sugli ordini a mercato. Tutti gli ordini sono scritti in un array bidimensionale strutturato. Il primo indice (cella) della matrice [0] sono gli ordini di base (mercato), il secondo indice (cella) [1] sono le chiusure per gli ordini di base. Quindi, la funzione dovrebbe controllare se è impostato un blocco per un ordine di base e se è SÌ, non facciamo nulla e continuiamo a lavorare. Ho scritto la funzione, ma funziona in qualche modo storto. Cioè, se, per esempio, viene aperto un ordine di acquisto a mercato e il terminale emette un messaggio che non è un tipo di ordine di ACQUISTO ma di VENDITA e quindi bisogna impostare un blocco per esso. Ma tutto funziona correttamente con gli ordini SELL. Non riesco a capire nulla. Gli ordini sono scritti correttamente negli array. Ho fatto il controllo appropriato e tutto è perfetto. Tutti i criteri di garanzia sono mostrati correttamente nell'array. Per favore aiutatemi a trovare un errore nel codice o a modificare in qualche modo la mia funzione. Allego la funzione.

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

Puoi provare a metterlo prima di
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) ==OP_SELL)
Metti altro

O mostrare il registro delle vendite.
 
Vladislav Andruschenko:

Prova a mettere
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) ==OP_SELL)
Metti altro

O mostrare il registro non sospeso.

L'ho fatto. Non è cambiato nulla. Ecco la voce del registro eventi:

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-ордер. Необходимо его установить!
 
guardare nella funzione dove si riempie l'arrayInfoOrderNew[1][n].TypeOrder
 
Vladislav Andruschenko:
Guardate nella funzione dove riempite l'arrayInfoOrderNew[1][n].TypeOrder
La funzione che riempie l'array emette tutti i dati correttamente. Posso mostrarvi dal registro come si riempiono le celle. Apriamo un ordine a mercato Buy#1 e piazziamo un lotto SellStop#2 su di esso. Poi apriamo un ordine a mercato Sell#3 e piazziamo anche un blocco BuyStop#4 su di esso. Tutte queste azioni sono mostrate nel registro degli eventi. Mi interessa come l'ordine Buy#1 entra nel ciclo degli ordini Sell! Come può essere? Quindi c'è un errore che mostra che non c'è un ordine di chiusura corrispondente. Ma questo non riguarda Sell#3. La funzione controlla la posizione della serratura e dà il risultato corretto. Qui, controllate voi stessi il rapporto del 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-ордер. Необходимо его установить!
 
Grazie Vladislav Andruschenko per aver partecipato alla ricerca del problema! L'ho più o meno capito. Ho dovuto rielaborare un po' il codice e tutto ha funzionato subito.
 
Сергей:
Grazie Vladislav Andruschenko per aver partecipato alla ricerca del problema! Sembra che io abbia risolto il problema. Ho dovuto rielaborare un po' il codice e tutto ha funzionato subito.

nessun problema

Sono caduto per il fine settimana. :-) È un bene che sia tutto risolto.

 
Vladislav Andruschenko:

nessun problema

Sono caduto per il fine settimana. :-) È un bene che sia stato risolto.

È sorta un'altra domanda:

Come posso azzerare o cancellare le informazioni in qualsiasi cella di una matrice eterogenea strutturata? Il fatto è che il commento dell'ordine è cambiato e ho bisogno di cancellare questo ordine da una cella di una matrice strutturata e definire questo ordine in un'altra matrice. Tutto è più o meno chiaro con un array regolare, ma non sono sicuro di quali operatori o funzioni funzionino, o come elaborare il tutto. E come faccio a copiare un array strutturato in un altro per salvare le informazioni sul precedente riempimento e poi confrontarle con il nuovo? Si prega di consigliare chi sa cosa su questo argomento. Te ne sarei molto grato!

 
L'etichetta del prezzo(OBJ_ARROW_LEFT_PRICE) può avere il proprio testo al posto del prezzo, se sì come?
 
ilnur17021992:
L'etichetta del prezzo(OBJ_ARROW_LEFT_PRICE) può avere il proprio testo al posto del prezzo, se sì come?
Non si può. Potete scrivere qualcosa di simile all'etichetta OBJ_TEXT