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

 
Leser: Veuillez indiquer comment et où spécifier dans l'EA la MA appartenant à la fenêtre n°2. Par exemple, j'ai ajouté une MA à MFI et je veux enregistrer cette MA dans mon EA. Je ne sais pas où et comment le faire.
Voulez-vous entrer dans les détails ? Votre Conseiller Expert utilise déjà l'indicateur MFI et vous voulez qu'il utilise le deuxième indicateur - l'indicateur MA ? Ou bien, votre conseiller expert n'utilise aucun indicateur et vous avez besoin qu'il utilise l'indicateur MA ?
 
Yedelkin:

1. Je dirais ceci : utilisez le code de quelqu'un d'autre avec beaucoup de précaution. Parce que le code de quelqu'un d'autre signifie aussi les erreurs de quelqu'un d'autre.

2. Ici(https://www.mql5.com/ru/forum/6343/page64#comment_357008), j'ai suggéré que vous essayiez de mettre correctement à zéro les variables avant de les utiliser. Mais votre code n'a pas encore mis en œuvre cette suggestion. De plus, votre code contient des constructions du type suivant :

Vous voyez, dans cette construction, les variables de demande et de résultat sont remises à zéro non pas avant mais après leur utilisation. De plus, lorsque ces variables locales sont mises à zéro, la fonction cesse de fonctionner, c'est-à-dire que cette mise à zéro n'a aucun sens. En d'autres termes, une telle construction est un bon exemple de la manière dont les variables MqlTradeRequest et MqlTradeResult ne doivent pas être mises à zéro. Donc, si vous êtes impatient, s'il vous plaît, essayez d'effacer les variables correctement. Si quelque chose ne fonctionne pas, veuillez décrire en détail ce qui ne fonctionne pas.

3. La bibliothèque standard possède une classe de commerce"MQL5 Reference / Standard Library / Trade Classes / CTrade". Essayez de trouver comment l'appliquer dans la pratique. Au stade initial de l'immersion dans la langue, ce cours peut être tout à fait suffisant. Par exemple, cette classe a la méthode suivante :"MQL5 Reference / Standard Library / Trade Classes / 2CTrade/ PositionModify". Il est mis en œuvre comme suit :

La ligne "ClearStructures() ;" efface la variable m_request avant de l'utiliser.

Yedelkin,

Merci beaucoup :)

J'ai vérifié et j'ai vu mon erreur.

Je peux le faire de cette façon :

//+------------------------------------------------------------------+
//| Clear structures request,result and check_result                 |
//+------------------------------------------------------------------+
void ClearStructures()
  {
   MqlTradeRequest request;
   MqlTradeResult result;
   MqlTradeCheckResult check_result;
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check_result);
  } 

Mais j'ai aimé vos suggestions :

   MqlTradeRequest request={0};
   MqlTradeResult result={0};
Les résultats sont les mêmes.

Maintenant que le poste n'est pas trouvé, je vais m'épuiser à cette tâche.

Merci.

 

Yedelkin,

Je vous écris parce que vous répondez de manière adéquate.

J'ai deux sors - MT4 et MT5.

Pourquoi cela ne fonctionne-t-il pas sur MT5, ce sont les mêmes.

Dossiers :
MTB_1E.mq4  4 kb
MTB_E.mq5  9 kb
 
mario065: Deux sors-MT4 et MT5. Pourquoi ne fonctionne-t-il pas sur MT5-les deux sont les mêmes.

Malheureusement, je ne comprends pas du tout MT4. Je jetterai un coup d'oeil et si je trouve quelque chose, je vous le ferai savoir.

Addendum. En général, vous attendez l'ouverture du marché et signalez ce qui aurait dû fonctionner, mais n'a pas fonctionné.

 
Yedelkin:

Malheureusement, je ne comprends pas du tout MT4. Je jetterai un coup d'oeil et si je trouve quelque chose, je vous le ferai savoir.

Addendum. En général, vous attendez l'ouverture du marché et décrivez ce qui aurait dû fonctionner, mais qui n'a pas fonctionné.

Je le fais donc pour moi et pour qui, si nécessaire.

Voici les commentaires :

Si l'indication des pips bolshego zéro pour la modification pour deux yazikas (MT4 et MT5) :

if(TradeTrailing>0)

if(MStop > 0)

Si ces pips (Bid - pips) bolshe ouvrir posishon :

if((NormalizeDouble(Bid, Digits)-TradeTrailing)>=OrderOpenPrice())

if(NormalizeDouble(Bid - MStop,4) >= Open)
Si stop = 0 ou Bid - pipsi dal trailing >= de la définition Open Posishon + pips :
if(OrderStopLoss()==0 || (NormalizeDouble(Bid, Digits)-TradeTrailing)>=(OrderStopLoss()+0.0005))

if(SL == 0 || NormalizeDouble(Bid - MStop,4) >= NormalizeDouble(SL + MStop,4))

modification :

ОrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid, Digits)-TradeTrailing,OrderTakeProfit(),0,Blue);

ModifyPosition(Symbol(),NormalizeDouble(Bid - MStop,4),TP);

C'est tout.

Je veux faire une fonction séparée pour la modification.

 
Yedelkin:
Pouvez-vous être plus précis ? Votre Conseiller Expert utilise déjà l'indicateur MFI et vous avez maintenant besoin qu'il utilise le deuxième indicateur - l'indicateur MA ? Ou bien, votre conseiller expert n'utilise aucun indicateur, mais vous avez besoin qu'il utilise l'indicateur MA ?
Mon conseiller expert utilise MFI, mais je n'arrive pas à trouver comment écrire l'indicateur MA ! La principale condition est l'emplacement du MA. La MA n'est pas sur le graphique (fenêtre 1) mais dans la fenêtre avec l'indicateur MFI (fenêtre 2).
 
Leser: Mon conseiller expert utilise MFI, mais je n'arrive pas à trouver comment écrire l'indicateur MA ! La principale condition est l'emplacement de l'AM. La MA n'est pas sur le graphique (fenêtre #1), mais dans la fenêtre avec l'indicateur MFI (fenêtre #2).

Si l'Expert Advisor utilise MFI, alors son code doit contenir une ligne permettant de récupérer le handle de cet indicateur :"MQL5 Reference / Technical Indicators / iMFI". Ainsi, l'utilisation de l'indicateur de moyenne mobile est décrite ici :"MQL5 Reference Guide / Technical Indicators / iMA".

Essayez également de lire l'article"Indicateur par indicateur dans MQL5".

 
mario065: Voici le commentaire : Si un Bid-STOPS_LEVEL est supérieur à zéro pour modification : Si ce Bid-STOPS est supérieur aux Positions Ouvertes : Si Stop = 0 ou Bid-STOPS est trailing >= des Positions Ouvertes + définition des Pips : Modification : C'est tout. Je voudrais créer une fonction distincte pour la modification.

1. Malheureusement, vous n'avez pas précisé ce qui "ne fonctionne pas". Vous avez énoncé la logique du programme (comment il devrait fonctionner), mais vous n'avez pas indiqué où la logique est brisée et comment elle l'est. Sans une description détaillée du problème, vous ne pouvez que faire des commentaires sur le code.

2. La fonction bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit) contient de telles lignes :

   if(!OrderSend(request,result) || result.deal==0)
     {
      Print("Modify error =", GetLastError());
      return(false);
     }

Si vous regardez la description de la structure de MqlTradeResult, vous pouvez voir que le champ deal est décrit comme suit

transaction

Ticket de transaction, si une transaction a été exécutée. Il est signalé lors d'une opération commerciale TRADE_ACTION_DEAL

Puisque votre fonction ModifyPosition() effectue une opération complètement différente, la valeur de result.deal devrait toujours être zéro. Par conséquent, l'opérateur
if(!OrderSend(request,result) || result.deal==0)

sera toujours déclenché, même si la modification a réussi, et il imprimera en même temps un message d'erreur.

2. Regardez les lignes du point précédent 2. Vous y utilisez la fonction GetLastError() qui est destinée à renvoyer le code de la dernière erreur. Mais vous n'effacez pas la variable contenant le code d'erreur avant de l'utiliser. Ainsi, même si la modification est réussie, vous imprimez une erreur qui a pu se produire bien avant l'envoi de la demande de modification de la position. Ça devrait être quelque chose comme ça :

ResetLastError();   
if(!OrderSend(request,result))
   { 
    ... 
    Print("Modify error =", GetLastError());
    ...
   }

3. Regardez ces lignes :

          if(SL == 0 || NormalizeDouble(Bid - MStop,4) >= SL) 
           {
            ModifyPosition(Symbol(),NormalizeDouble(Bid - MStop,4),TP);
           }

Supposons qu'au tick suivant, votre conditionNormalizeDouble(Bid - MStop,4) == SL se déclenche. Supposons que SL==1.11110. Mais alors aussi ModifyPosition(Symbol(),1.11110,TP). C'est-à-dire que cette modification spécifiera les niveaux précédemment définis.

Et que se passera-t-il, si l'égalité NormalizeDouble(Bid - MStop,4) == SL fonctionnera à nouveau au prochain tick ?) Surtout si l'on considère que (a) la normalisation est effectuée sur quatre chiffres, alors qu'il peut y avoir des cotations à cinq chiffres, (b) les demandes de transaction peuvent être exécutées sur le serveur avec un certain retard.

4. Il existe également une propriété de caractère telle que SYMBOL_TRADE_STOPS_LEVEL. Mais ce niveau n'est pas vérifié dans votre code. C'est-à-dire que si le candidat pour un nouveau stop loss pour une position d'achat est spécifié comme SL_new, il serait utile de vérifier la condition if(Bid-STOPS_LEVEL>SL_new).

 

En fait, essayez de chercher dans le manuel de référence la comparaison de nombres réels. Autant que je me souvienne, il déconseille fortement de comparer deux nombres réels comme ceci : if(double_1 == double_2).

 

Yedelkin,

Merci beaucoup. Reshetov m'a aussi montré où se trouve l'erreur.

Voici la fonction elle-même :

//+------------------------------------------------------------------+
//| Modify position.                                                 |
//+------------------------------------------------------------------+
bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit){
//---- обявяване на структурата и резултата на търговското искане
   MqlTradeRequest request={0};
   MqlTradeResult result={0};
//---- структурна инициализация на  търговското искане MqlTradeRequest за модифициране на  позиция
   request.action       = TRADE_ACTION_SLTP;
   request.symbol       = symbol;
   request.sl           = StopLoss;
   request.tp           = Takeprofit;
   string word          = "";
   StringConcatenate(word,
                     "<<< ============ Modifyposition():   Модифицираме позицията  ",
                     symbol," ============ >>>");
   Print(word);
//---- модифицираме позицията и  проверяваме резултата от търговското искане
   if(!OrderSend(request,result))
     {
      Print("Modify error =", GetLastError());
      return(false);
     }
   return(true);
  }

Et voici comment j'aurais dû faire la fonction elle-même :

  double buy_trail = 0;
  double sel_trail = 0;
  double SL,TP,Open;
  if(PositionSelect(Symbol())){
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
      {
      Open = PositionGetDouble(POSITION_PRICE_OPEN);
      SL   = PositionGetDouble(POSITION_SL);
      TP   = PositionGetDouble(POSITION_TP);
      Bid  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
      buy_trail = NormalizeDouble(Bid - Open,Digits());
      if(buy_trail > MStop)
       {
        if(NormalizeDouble((Bid - MStop),Digits()) >= Open && Open > SL)
          {
           ModifyPosition(Symbol(),Open,TP);
          }
          if(NormalizeDouble((Bid - MStop),Digits()) > SL && Open <= SL)
           {
            ModifyPosition(Symbol(),NormalizeDouble((SL + 0.001),Digits()),TP);
           }
        }
      }
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {
      Open = PositionGetDouble(POSITION_PRICE_OPEN);
      SL   = PositionGetDouble(POSITION_SL);
      TP   = PositionGetDouble(POSITION_TP);
      Ask  = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
      sel_trail = NormalizeDouble(Open - Ask,Digits());
      if(sel_trail > MStop)
       { 
        if(NormalizeDouble((Ask + MStop),Digits()) <= Open && Open < SL)
          {
           ModifyPosition(Symbol(),Open,TP);
          }
          if(NormalizeDouble((Ask + MStop),Digits()) < SL && Open >= SL)
           {
            ModifyPosition(Symbol(),NormalizeDouble((SL - 0.001),Digits()),TP);
           }
        }
      }
     }

Maintenant, tout fonctionne bien.

Merci.

Raison: