Questions des débutants MQL4 MT4 MetaTrader 4 - page 51

 

Besoin d'aide de la part de programmeurs expérimentés !

Bonjour à tous !

Les gars, on a besoin de votre aide ! J'écris un conseiller expert. Je ne suis pas particulièrement doué pour la programmation, alors je la demande. Je suis en train de créer une fonction de contrôle pour la mise en place d'un verrouillage sur les ordres de marché. Tous les ordres sont écrits dans un tableau structuré à deux dimensions. Le premier indice (cellule) du tableau [0] correspond aux ordres de base (marché), le second indice (cellule) [1] correspond aux verrous pour les ordres de base. Ainsi, la fonction devrait vérifier si un verrou est défini pour un ordre de base et si c'est OUI, nous ne faisons rien et continuons à travailler. J'ai écrit la fonction, mais elle fonctionne de travers. Par exemple, si un ordre d'achat sur le marché est ouvert et que le terminal émet un message indiquant qu'il ne s'agit pas d'un ordre d' achat mais d'un ordre de vente et que, par conséquent, un verrou doit être mis en place pour cet ordre. Mais tout fonctionne correctement avec les ordres de VENTE. Je ne comprends rien. Les ordres sont correctement écrits dans des tableaux. J'ai fait le contrôle approprié et tout est parfait. Tous les critères du mandat sont correctement affichés dans le tableau. Veuillez m'aider à trouver une erreur dans le code ou à modifier ma fonction. Je joins la fonction.

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

Besoin d'aide de la part de programmeurs expérimentés !

Bonjour à tous !

Les gars, on a besoin de votre aide ! J'écris un conseiller expert. Je ne suis pas particulièrement doué pour la programmation, alors je la demande. Je suis en train de créer une fonction de contrôle pour la mise en place d'un verrouillage sur les ordres de marché. Tous les ordres sont écrits dans un tableau structuré à deux dimensions. Le premier indice (cellule) du tableau [0] correspond aux ordres de base (marché), le second indice (cellule) [1] correspond aux verrous pour les ordres de base. Ainsi, la fonction devrait vérifier si un verrou est défini pour un ordre de base et si c'est OUI, nous ne faisons rien et continuons à travailler. J'ai écrit la fonction, mais elle fonctionne de travers. Par exemple, si un ordre d'achat au marché est ouvert et que le terminal émet un message indiquant qu'il ne s'agit pas d'un ordre d' achat mais d'un ordre de vente et que, par conséquent, un verrou doit être mis en place pour cet ordre. Mais tout fonctionne correctement avec les ordres de VENTE. Je ne comprends rien. Les ordres sont correctement écrits dans des tableaux. J'ai fait le contrôle approprié et tout est parfait. Tous les critères du mandat sont correctement affichés dans le tableau. Veuillez m'aider à trouver une erreur dans le code ou à modifier ma fonction. Je joins la fonction.

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

Vous pouvez essayer de le mettre avant
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) ==OP_SELL)
Mettre autre chose

Ou montrez le journal de la sous-enchère.
 
Vladislav Andruschenko:

Essayez de mettre
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) ==OP_SELL)
Mettre autre chose

Ou montrez le journal non suspendu.

Je l'ai fait. Rien n'a changé. Voici les entrées du journal des événements :

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-ордер. Необходимо его установить!
 
regardez dans la fonction où VOUS remplissez le tableauInfoOrderNew[1][n].TypeOrder
 
Vladislav Andruschenko:
Regardez dans la fonction où VOUS remplissez le tableauInfoOrderNew[1][n].TypeOrder
La fonction qui remplit le tableau sort toutes les données correctement. Je peux vous montrer à partir du journal comment les cellules sont remplies. Nous ouvrons un ordre au marché Buy#1 et plaçons un SellStop#2 lockup contre lui. Ensuite, nous ouvrons un ordre de marché Sell#3 et plaçons un lockup BuyStop#4 sur celui-ci également. Toutes ces actions sont indiquées dans le journal des événements. Je suis intéressé de savoir comment l'ordre d'achat n°1 entre dans la boucle des ordres de vente ! Comment est-ce possible ? Il y a donc une erreur montrant qu'il n'y a pas d'ordre de verrouillage correspondant. Mais cela ne concerne pas Sell#3. La fonction vérifie la position du verrou et donne le résultat correct. Ici, vérifiez vous-même le rapport du journal :
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-ордер. Необходимо его установить!
 
Merci à Vladislav Andruschenko d'avoir participé à la recherche du problème ! J'ai en quelque sorte compris. J'ai dû retravailler un peu le code et tout a fonctionné en même temps.
 
Сергей:
Merci à Vladislav Andruschenko d'avoir participé à la recherche du problème ! Je semble avoir résolu le problème. J'ai dû retravailler un peu le code et tout a fonctionné en même temps.

aucun problème

Je viens de tomber en panne pour le week-end. :-) C'est bien que ce soit réglé.

 
Vladislav Andruschenko:

aucun problème

Je viens de tomber en panne pour le week-end. :-) C'est bien que ce soit réglé.

Une autre question s'est posée :

Comment mettre à zéro ou supprimer des informations dans n'importe quelle cellule d'un tableau hétérogène structuré ? Le problème est que le commentaire de l'ordre a changé et je dois supprimer cet ordre d'une cellule d'un tableau structuré et définir cet ordre dans un autre tableau. Tout est plus ou moins clair avec un tableau ordinaire, mais je ne suis pas sûr des opérateurs ou des fonctions qui fonctionnent, ni de la façon de traiter tout cela. Et comment puis-je copier un tableau structuré dans un autre pour sauvegarder les informations relatives au remplissage précédent et les comparer ensuite avec le nouveau ? Veuillez indiquer qui sait quoi sur ce sujet. Je vous en serais très reconnaissant !

 
L'étiquette de prix(OBJ_ARROW_LEFT_PRICE) peut-elle avoir son propre texte au lieu du prix, si oui comment ?
 
ilnur17021992:
L'étiquette de prix(OBJ_ARROW_LEFT_PRICE) peut-elle avoir son propre texte au lieu du prix, si oui comment ?
Tu ne peux pas. Vous pouvez écrire quelque chose de similaire à l'étiquette de prix OBJ_TEXT
Raison: