Questions des débutants MQL5 MT5 MetaTrader 5 - page 81

 
oldiol: J'écris dans le code : if(!m_Trade.PositionClose(_Symbol,100))//--- nous fermons la position par le symbole actuel. Le résultat est que la position est inversée ! Je vous serais très reconnaissant de me donner des conseils sur la manière de clôturer la position.
La position est inversée car le programme envoie deux requêtes identiques au serveur. Le programme envoie deux demandes identiques au serveur, car son code ne vérifie pas la présence d'une demande envoyée précédemment (et ne vérifie pas le résultat du traitement de cette demande sur le serveur).
 
Yedelkin:
La position est inversée car le programme envoie deux requêtes identiques au serveur. Le programme envoie deux requêtes identiques au serveur car son code ne vérifie pas l'existence d'une requête envoyée précédemment (et ne vérifie pas le résultat du traitement de cette requête sur le serveur).
S'il vous plaît, corrigez mon code avec le bon...
 

Yedelkin écrit : son code ne vérifie pas si une demande a déjà été envoyée. Pouvez-vous me dire quelle fonction est contrôlée ?

 
oldiol: Veuillez corriger mon code pour qu'il soit correct...

Chacun a une compréhension différente du bon code. Vous devez donc écrire le code "correct" à la fin. Et comme autre conseil - essayez de voir si ce code fonctionne de la bonne manière (utilisation schématique du drapeau sentRequest) :

bool sentRequest=false;  //задать на уровне глобальных переменных программы
...

   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      if(!sentRequest)
        {                           
         if(p_close1<buy_stop_level)
           {
            if(!m_Trade.PositionClose(_Symbol,100))
              Print("Метод PositionClose() потерпел неудачу. Код возврата=",m_Trade.ResultRetcode(),". Описание кода: ",m_Trade.ResultRetcodeDescription());
            else
               {
                Print("Метод PositionClose() выполнен успешно. Код возврата=",m_Trade.ResultRetcode()," (",m_Trade.ResultRetcodeDescription(),")");       
                sentRequest=true;
               }
            }  
         }
       else Print("Блок закрытия позиции: имеется POSITION_TYPE_BUY и ранее отосланный запрос на закрытие позиции");        
       }
    else 
      if(sentRequest) sentRequest=false;
 
Yedelkin:

Chacun a une compréhension différente du bon code. Vous devez donc écrire le code "correct" à la fin. Et comme autre conseil - essayez de voir si ce code fonctionne dans la bonne clé (utilisation schématique du drapeau sentRequest) :

Merci beaucoup ! Je l'essaie...

 

Le résultat est le suivant : le code ferme correctement une position longue et n'ouvre pas une position courte... Lors de la réouverture d'une position longue, l'EA ne la ferme pas selon la condition. Il y a des messages dans la fenêtre EA en permanence :

Comment puis-je utiliser ce code dans le corps du conseiller expert, s'il ne fonctionne qu'une fois) ?

 

oldiol: При повторном открытии лонга, эксперт не закрывает больше позу по условию. В окне эксперта всё время идут сообщения:    Как же использовать этот код в теле эксперта, если он работает только 1 раз)?

Cela devrait être assez simple en la matière. Dans le code schématique, l'indicateur sentRequest doit être mis à zéro si la position ouverte n'est pas une position d'achat (dernière ligne de code). Voyez pourquoi ce drapeau n'est pas mis à zéro dans votre code lorsque soit il n'y a pas de position ouverte, soit la position ouverte n'est pas une position d'achat.

 

Hourra ! Cela a marché)))) Supprimé if(sentRequest) sentRequest=false ; Et écrit avant le bloc if(PositionsTotal()==0) sentRequest=false ; Merci beaucoup à Yedelkin pour son aide, BONNE chance !

 
oldiol Supprimé if(sentRequest) sentRequest=false ; Et écrit avant le bloc if(PositionsTotal()==0) sentRequest=false ;
Il n'y avait donc pas de contrôle de position dans le code principal ? J'ajouterais ensuite que la position d'un symbole particulier est sélectionnée à l'aide des fonctions PositionGetSymbol ou PositionSelect.
 

oldiol : Lors de la réouverture d'un long, EA ne ferme plus la position par condition. Il y a des messages dans la fenêtre EA tout le temps : Comment puis-je utiliser ce code dans le corps de l'EA, si cela ne fonctionne qu'une seule fois) ? Désolé, mon erreur... Il y a une autre condition dans le code

if(PositionSelect(_Symbol)==true) // il y a une position ouverte
{

POSITION FERMER BLOC

} // ... donc

if(sentRequest) sentRequest=false;// on le place derrière la parenthèse suivante et tout fonctionne parfaitement. Yedelkin MERCI !