Ce qui empêche le conseiller de gagner de l'argent. - page 4

 
FAQ:

... s'il vous plaît :

La plupart de la moitié des variables globales et locales ne sont pas initialisées - je suis sûr qu'elles contiennent beaucoup de déchets à un moment donné.

On ne vérifie jamais si un ordre est sélectionné par OrderSelect(), on ne parle même pas de vérifier s'il est ouvert ou fermé.

Je n'ai pas remarqué de mise à jour des cotations avant les fonctions commerciales...

GetLastError n'est pas remis à zéro avant l'ouverture/la fermeture, mais il est vérifié - là encore, il y aura des cas de déchets dans la variable.

Vous ne vérifiez pas et ne normalisez pas les prix lors de la fermeture.

Voulez-vous continuer ?

Allez-y.

Très utile.

 

Ici https://www.mql5.com/ru/forum/137651/page3 j'ai posté ma fonction de clôture

Remplacer GetInfo() par print, Fun_Error() = ErrorDescription()

 
FAQ:

Vous ne vérifiez jamais si une commande est sélectionnée par OrderSelect(),


Honnêtement, je ne comprends pas bien ce qu'il faut faire si une valeur - false - est renvoyée lorsqu'une commande est sélectionnée.

Est-ce que faux signifie qu'il est absent à 100% parmi les MODE_TRADES ?

J'ai redessiné les codes d'ouverture des ordres selon vos recommandations, franchement, je n'ai pas touché à la configuration de l'Expert Advisor, je suis donc curieux de voir... Va-t-il se vendre ou prendre un autre bénéfice ?

 
valenok2003:


Pour être honnête, je ne comprends pas bien ce qu'il faut faire si false est renvoyé lorsqu'une commande est sélectionnée.

Est-ce que faux signifie son absence à 100% parmi les MODE_TRADES ?


cela signifie à 100% que rien ne peut être fait avec l'ordre car il n'est pas sélectionné.
 
PapaYozh:

cela signifie à 100% que rien ne peut être fait avec elle [la commande] car elle n'est pas sélectionnée.



Bien... Oh, mec... mais s'il n'est pas sélectionné, il y a une erreur, n'est-ce pas ? Il faut faire quelque chose...

Par exemple, voir cette fonction,

//+-------
//+------------------------------------------------------------------+
//|   valenok2003@mail.ru                                05.07.2011
//+------------------------------------------------------------------+
//| check_open_order() ПРОВЕРКА реального открытия рыночного ордера по тикету
//| Требует:
//| - тикет ордера 
//| Возвращает тикет открытого ордера или -1
//+------------------------------------------------------------------+
int check_open_order(int _Ticket)
{  string _Function = "check_open_order(): ";
//-----------------
   if(_Ticket > 0) {  
      OrderSelect(_Ticket,SELECT_BY_TICKET);             
      if(OrderType() <= 1) {  
         output_mov_string(order_type_in_txt(OrderType())+ " успешно открыт!", Clr_Report);
         output_sound(Name_Sound_Open);
         OrderPrint();
//-----------------         
         for(int _n = 0; _n < MAX_ORDERS; _n++)  {
            // Если место свободно
            if(Arr_Tickets[_n] == 0)   {
               // Создаём запись об ордере
               Arr_Tickets[_n] = OrderTicket();
               break;
            }
         }
      }
      else _Ticket = -1;
   }
//-----------------
   return(_Ticket);
}
//+-------------------------------------------------------------------
//+-------
Si l'ordre n'est pas sélectionné, je dois renvoyer -1. Et si elle n'est pas sélectionnée pour une autre raison - par exemple, un échec quelconque, mais que l'ordre est ouvert, que dois-je faire ?
 
valenok2003:


Bien... Merde... Mais s'il n'est pas sélectionné, c'est qu'il y a une erreur, n'est-ce pas ? Il faut faire quelque chose...


Elle peut ne pas être sélectionnée :

1) à cause d'un bug dans le code du conseiller expert ;

2) il a été fermé en raison de circonstances indépendantes de la volonté de l'EA (déclenchement du SL/TP, fermeture manuelle, fermeture par l'EA).

 
valenok2003:


Bien... Oh, mec... mais s'il n'est pas sélectionné, il y a une erreur, n'est-ce pas ? Il faut faire quelque chose...

Tu te moques de moi ou tu es sérieux ?

Faites une pause et sélectionnez à nouveau. Je l'ai organisé de cette façon, ça marche en ligne :

// ------------------------------------------------Ищем наш ордер---------------------------------
   int orderType;
   for (int orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))     continue;
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber)) continue;
      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL)) continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера          
          if (ticket>0)                                    // Если позиция открылась
              {
                while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                Sleep(100);                                 
                double OpenPrice=OrderOpenPrice();
       // Print("OrderTicket()=",OrderTicket(),  "OrderOpenTime()=",OrderOpenTime()); 
       // Print("TimeLocal()=",TimeLocal());                                                                    
                     //---------------------Запоминаем значения сл и тп ордера   
...
...
...
                  
 
Roman.:

Tu te moques de moi ou tu es sérieux ?

Faites une pause et sélectionnez à nouveau. Je l'ai organisé de cette façon, cela fonctionne en ligne :

J'y ai complété mon post.

Combien de fois dois-je choisir ?

 
valenok2003:

J'y ai complété mon post.

Et combien de fois faut-il choisir ?

AVANT. Jusqu'à ce qu'il soit sélectionné dans une boucle :

if (ticket>0)                                    // Если позиция открылась
              {
                while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                Sleep(100);                                 
                double OpenPrice=OrderOpenPrice();
       // Print("OrderTicket()=",OrderTicket(),  "OrderOpenTime()=",OrderOpenTime()); 
       // Print("TimeLocal()=",TimeLocal());                                                                    
                     //---------------------Запоминаем значения сл и тп ордера                     
                if (orderType == OP_BUY) 
                   {                
                     
                   }
            
                if (orderType == OP_SELL) 
                   {        
                   
                   }   
                            
              }
 
PapaYozh:


Elle peut ne pas être sélectionnée :

1) à cause d'un bug dans le code de l'EA ;

c'est très clair

2) elle a été fermée en raison de circonstances indépendantes de la volonté de l'EA (le SL/TP a été déclenché, fermé manuellement, fermé par l'EA)

seulement ces deux raisons ou pourrait-il y avoir autre chose ?
Raison: