Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1739

 
Artyom Trishkin #:

Le premier appel à CopyRates() a initié l'échange de données historiques (n'exécutez pas pendant une semaine et vous obtiendrez à nouveau la même chose, enfin, peut-être pas une semaine, mais un certain temps).
Il vous suffit de vérifier la quantité de données présentes sur le serveur et de comparer la quantité disponible au conseiller expert. S'il est inférieur à ce qui est requis - laissez l'EA jusqu'au prochain tick. Au prochain tic, vérifiez à nouveau. Si la quantité requise d'historique n'est pas obtenue dans un certain nombre de tentatives - alors cette erreur doit être traitée comme il se doit.

Merci pour ces informations !

Si vous avez le temps, veuillez indiquer comment le corriger :

Deux objectifs opposés sont définis sur l'historique il y a N bougies : Close[N]+50*Point et Close[N]-50*Point.
Ensuite, il existe une condition selon laquelle le prix doit atteindre l'un des objectifs (si (High[i]> Close[N]+50*Point) ou (si (Low[i]<Close[N]-50*Point)
Lorsque la condition est remplie, la distance entre Close[N] et High[i] est écrite dans le tableau x[high]=High[i].
Ensuite, il est jeté au hasard sur n'importe lequel des graphiques à tout moment.

Et lors de la vérification via Print(x[high]), 1 à 2 valeurs sur 10 affichent moins de 50 ! L'un en a 12, l'autre 49. Bien qu'il soit strictement indiqué+50*Point. 8-9 sont corrects (plus de 50) et 1-2 sont anormaux. Ce n'est pas par le biais du testeur, mais avec un graphique réel je place un Expert Advisor (sans aucune fonction de trading), mais avec les susmentionnés il travaille avec l'historique et affiche des résultats incorrects.

Plus la valeur est grande, moins ces erreurs se produisent. Je pensais que c'était la propagation qui interférait, mais... MT4 ne semble pas avoir de spread sur l'historique.

 
Artis98 #:

Bonjour Chers utilisateurs du forum et programmeurs expérimentés ! J'ai besoin d'aide pour compléter l'EA)). Veuillez me conseiller sur la façon d'ajouter deux éléments au conseiller en code :

1. Voici la situation : j'ouvre un ordre (1er) avec TP et SL et un certain lot (probablement 0.01). Si cet ordre se ferme au niveau du take profit - cool, rien ne change. Mais si ce (1er) ordre est fermé au SL, l'ordre suivant immédiatement après (2ème) est ouvert avec un lot 2 fois plus grand (0.01*2=0.02). Si ce 2ème ordre est fermé au Take Profit, alors l'ordre suivant (3ème ordre) est ouvert avec un lot régulier, c'est-à-dire qu'un lot 2 fois plus grand est nécessaire uniquement pour l'ordre suivant (2ème ordre) après que le précédent (1er) ait été fermé au SL. Si le 3ème ordre est clôturé en SL pour la deuxième fois consécutive, le lot restera augmenté de 2x jusqu'à ce qu'il n'y ait plus de clôture en TP. J'espère avoir décrit en détail la logique de ce qui doit être ajouté ;


2. et la deuxième chose que nous devons ajouter est le mouvement SL. maintenant, laissez-moi l'expliquer avec un exemple : supposons que nous avons un ordre avec des paramètres de base T.p. + 300, S.l. - 500. Le prix évolue dans la direction requise et dépasse +100 pips du prix d'ouverture de l'ordre. Une fois que le prix atteint +100 du prix d'ouverture de l'ordre, le SL doit passer de la base -500 à +90. C'est-à-dire que lorsque le prix atteint +100 pips par rapport au prix d'ouverture de l'ordre, nous transférons l'ordre au seuil de rentabilité en fixant S,L à +90 pips. Après cela, si le prix se déplace davantage dans la direction souhaitée et passe par un autre + 50 pips - S.L. est déplacé de 50 pips => il devrait maintenant être à + 140 pips du prix d'ouverture de l'ordre. C'est-à-dire que le S.L. se déplace d'abord de sa position de base à + 90 pips du prix d'ouverture de l'ordre et ensuite s'il passe par + 50 pips ( - 500 => + 90 => + 140 => + 190 etc.). Et ainsi de suite jusqu'à ce que le prix atteigne T.P. ou quand la tendance s'inverse et frappe le S.L.


J'espère avoir tout décrit en détail, et j'espère vraiment votre aide, car en ajoutant ces éléments manquants, le Conseiller Expert sera prêt ;)) Si vous avez des questions, n'hésitez pas à les poser)))) Je colle une partie du code de l'Expert Advisor ci-dessous :

Sur le premier point : avant d'ouvrir une position, regardez comment la précédente a été clôturée. Si vous prenez le SL, alors le lot devrait être double. Le lot ne doit pas être augmenté de la moitié du lot de la position précédente, mais fixé dans les paramètres ou quelque part dans le code. Ensuite, avant d'ouvrir, vous vérifierez la condition : si la position précédente a été fermée par le SL, alors ouvrez une position avec le double lot.

Quant à la seconde : J'ai posté un exemple de trailing stop dans ce fil il y a longtemps. Cherchez-le. C'est mieux dans mon profil dans les messages - vous le trouverez là plus rapidement qu'en parcourant plus de 100 pages ici. Ensuite, sur la base de l'exemple, vous allez essayer de créer votre propre chalut.

 
Artyom Trishkin #:

Le premier appel à CopyRates() a initié l'échange de données historiques (n'exécutez pas pendant une semaine et vous obtiendrez à nouveau la même chose, enfin, peut-être pas une semaine, mais un certain temps).
Il vous suffit de vérifier la quantité de données présentes sur le serveur et de comparer la quantité disponible au conseiller expert. S'il est inférieur à ce qui est requis, laissez l'EA jusqu'au prochain tick. Au prochain tic, vérifiez à nouveau. Si le nombre requis de tentatives n'est pas atteint, l'erreur est traitée comme il se doit.

Peut-on obtenir le nombre de barres chargées de manière programmatique ?

Pour ma part, je me contente de regarder la date dans les archives des citations pour chaque TF et j'essaie de ne pas les dépasser dans les calculs.

Cette tâche peut être inutile dans cette forme. Il serait plus correct d'obtenir un drapeau lorsque le bon nombre de barres est chargé, mais il se peut qu'il ne soit jamais chargé pour tel ou tel symbole.

 
Artyom Trishkin #:

Sur le premier point : avant d'ouvrir une position, regardez comment la position précédente a clôturé. Si c'est par SL, alors le lot devrait être double. Le lot ne doit pas être doublé à partir du lot de la position précédente, mais à partir du lot défini dans les paramètres ou quelque part dans le code. Ensuite, avant d'ouvrir, vous vérifierez la condition : si la position précédente a été fermée par le SL, alors ouvrez une position avec le double lot.

Je pense que je l'ai déjà modifié dans le code :

//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
 double Lots()  // Расчет объема лота
  {
   int n=0;
   double Lotscount;
   double OL=Lot;
   
   
   if(Lot>0) return(LOT());          // "если во внешней переменной "Lot" стоит число больше 0 => будет фиксированный лот без авт. расчёта" 
   Lotscount=AccountFreeMargin()/10000;  // раcчёт лота - свободная маржа/9000 => 100/9000=0.01 лота 
   Lotscount=MathMin(15,MathMax(0.01,Lotscount));
    if(Lotscount<0.1) Lotscount=NormalizeDouble(Lotscount,2);
    else 
     {
       if(Lotscount<1) Lotscount=NormalizeDouble(Lotscount,1);
      else       Lotscount=NormalizeDouble(Lotscount,0);
     }
     
     for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
          if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
             {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lotscount);
            }
            else
            {
               if (n==0) {Comment("2");return(Lotscount);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
      return(Lotscount);
 }
//------------------------------------------------------------------
double LOT()
{
   int n=0;
   double OL=Lot;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
            {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lot);}
            }
            else
            {
               if (n==0) {Comment("2");return(Lot);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
   return(OL);
}

Ou c'est faux ? De plus, je ne sais pas comment changer deux choses liées au lot. La première est qu'un ordre avec un lot doublé ne doit être ouvert qu'une seule fois et sur un seul ordre (l'ordre suivant celui avec S.L.). Et la seconde, que je ne sais pas comment ajouter, est de faire en sorte que dans le cas de deux S.L. d'affilée (deux ordres fermés d'affilée par S.L.), le troisième ordre ne s'ouvrira pas avec un lot augmenté de 2 (2*2*2), mais seulement une fois (2*2) comme le deuxième ordre.

 
Artis98 #:

Je pense que j'ai déjà changé ça dans le code :

Ou est-ce que c'est faux ? Aussi, je ne sais pas comment changer deux choses sur le lot. La première est de faire un ordre avec double lot ouvert une seule fois et seulement sur un ordre (l'ordre suivant celui avec S.L.). Et la seconde, que je ne sais pas comment ajouter, est de faire en sorte que dans le cas de deux S.L. d'affilée (deux ordres fermés avec S.L. d'affilée) le troisième ordre ne s'ouvrira pas avec un lot augmenté d'un autre 2 (2*2*2), mais seulement une fois (2*2) comme le deuxième ordre.

Vous avez DEUX types d'ordre - l'ordre numéro 1 - un ordre avec un lot régulier, et l'ordre numéro 2 - un ordre avec un lot plus important. Les lots ne sont incrémentés que par le type SL #1.

Enregistrez le type de commande dans un "commentaire" par exemple. Mieux encore, mémorisez-le vous-même. C'est une bonne habitude de se souvenir de tout ce qui concerne vos commandes.

 
Maxim Kuznetsov #:

vous avez DEUX types d'ordres - l'ordre numéro 1 - un ordre avec un lot régulier, et l'ordre numéro 2 - un ordre avec un lot augmenté. Les lots ne sont incrémentés que par le type SL #1.

Enregistrez le type de commande dans un "commentaire" par exemple. Ou, mieux encore, mémorisez-le vous-même. C'est une bonne habitude de se souvenir de tout ce qui concerne vos commandes.

Nous n'avons pas besoin de mémoriser quoi que ce soit (d'autant plus que la mémorisation nécessite une nouvelle reconstruction). Il lui suffit de savoir comment la position précédente a été fermée. C'est tout. Il n'est pas nécessaire de connaître ni deux, ni trois, ni cent à la suite ou cent non fermés par stoploss, mais seulement la dernière position. Si elle a été fermée par un Stop Loss, alors la suivante doit être fermée avec un double lot. Mais le lot ne doit pas être doublé par rapport au lot de la position précédente, mais par rapport à l'ensemble du lot normal du programme. Ensuite, si la position n'est pas fermée au niveau du Stop Loss, alors la position suivante doit être ouverte avec le même lot. Si la position est fermée par le Stop Loss, alors doublez le lot pour la position suivante. C'est tout. Vous n'avez pas besoin de savoir autre chose.

 
Artyom Trishkin #:

Il n'a pas besoin de mémoriser quoi que ce soit (d'autant plus que la mémorisation nécessite une récupération ultérieure). Il a seulement besoin de savoir comment la position passée a été fermée. C'est tout. Il n'a pas besoin de connaître deux, ou trois, ou cent d'affilée ou non séquentiellement fermés par stoploss, mais seulement la position passée. Si elle a été fermée par un Stop Loss, alors la suivante doit être fermée avec un double lot. Mais le lot ne doit pas être doublé par rapport au lot de la position précédente, mais par rapport au lot normal du programme. Ensuite, si la position n'est pas fermée au niveau du Stop Loss, alors la position suivante doit être ouverte avec le même lot. Si la position est fermée par le Stop Loss, alors doublez le lot pour la position suivante. C'est tout. Vous n'avez pas besoin de savoir autre chose.

Ne dites pas aux gens ce qu'ils doivent faire.

Vous devez vous souvenir de vos données et travailler avec elles.

 
Artyom Trishkin #:

Tout ce qu'il doit savoir, c'est comment la position passée a été fermée. C'est tout. Vous n'avez pas besoin de savoir si deux, trois, cent d'affilée ou non ont fermé au stoploss, juste la position passée. Si la position a été fermée au niveau du stoploss, alors la prochaine devrait être avec un double lot. Si la position a été fermée au niveau du stoploss, alors ouvrez la prochaine avec un double lot.

C'est ce dont j'ai besoin, c'est en fait la question - comment l'écrire dans le code ?

 

Bonjour !
Quelqu'un peut-il me dire comment forcer le compilateur à compiler pour MT4 et non pour MT5 ?

Si le fichier a l'extension *.mq4, tout va bien, s'il a l'extension *.mqh, le compilateur l'accepte comme *.mq5 et des erreurs se produisent.

 
Sergey Zhukov #:

Bonjour !
Quelqu'un peut-il me dire comment forcer le compilateur à compiler pour MT4 et non pour MT5 ?

Si le fichier a l'extension *.mq4, tout va bien, s'il a l'extension *.mqh, le compilateur l'accepte comme *.mq5 et des erreurs se produisent.

Donne-nous le dossier. C'est nouveau, je n'ai jamais entendu ça avant.
Raison: