Mql4: Comment selectionner plusieurs ordres

Modérateur : Administrateurs

Répondre
Message
Auteur
Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Mql4: Comment selectionner plusieurs ordres

#1 Message par Fabien LABROUSSE »

J'arrive à sélectionner un ordre dans l'historique avec OrderSelect comme cela par exemple:

Code : Tout sélectionner

 if (OrderSelect (1, SELECT_BY_POS, MODE_HISTORY)==true)
     {
        if (OrderProfit() > 0) lotMM = MathCeil(AccountFreeMargin() *  Risk) / 1000000 * 1.5; 
     }
Mais ce que je voudrai maintenant c'est de sélectionner plusieurs ordres (par exemple:

Code : Tout sélectionner

if (OrderSelect ([color=#FF0000][b][de 1 à 3][/b][/color], SELECT_BY_POS, MODE_HISTORY)==true)
     {
        if (OrderProfit() > 0 [color=#FF0000][b][pour chaqune des 3 dernières positions fermées][/b][/color]) lotMM = MathCeil(AccountFreeMargin() *  Risk) / 1000000 * 1.5; 
     }
Je n'y parviens pas.

J'ai essayer un truc de ce type:

Code : Tout sélectionner

for (int f1 = 1; f1 < 3) {
      OrderSelect(f1, SELECT_BY_POS, MODE_HISTORY);
      if(OrderProfit() > 0) lotMM = OrderLots() + 0.5 MathCeil(AccountFreeMargin() *  Risk) / 1000000;
      }
Si quelqu'un pouvait m'aider ce serait cool.
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

nickleus
Membre assidu
Messages : 422
Inscription : 14 janv. 2010, 20:09

Re: Mql4: Comment selectionner plusieurs ordres

#2 Message par nickleus »

Code : Tout sélectionner

for (int f1 = 1; f1 < 3; f1++) {
      OrderSelect(f1, SELECT_BY_POS, MODE_HISTORY);
      if(OrderProfit() > 0) lotMM = OrderLots() + 0.5 MathCeil(AccountFreeMargin() *  Risk) / 1000000;
      }
Tu avais oublié le f1++ ;)

Mais attention, dans ce cas, si je ne me trompe pas tu récupère que les 3 premiers ordres de la liste historique.

J'aurais fait un truc comme ça :

Code : Tout sélectionner

int boucle = 0;
for(int f1 = OrdersTotal(); f1 >= 0; f1--) {
  if(boucle == 3) {
     Break;
  }

   // SINON APRES TU METS TON CODE
}
J'espère que ca ressemble à ce que tu cherches à faire ;)

Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Re: Mql4: Comment selectionner plusieurs ordres

#3 Message par Fabien LABROUSSE »

Ok merci nick, je vais essayer ça.

Voila pour le moment ce que j'ai fait:

Code : Tout sélectionner

double LotSize()
{
     double lotMM = MathCeil(AccountFreeMargin() *  Risk) / 1000000;
     
     if(AccountIsMicro==false) //normal account
     {
        if (lotMM < 0.1) lotMM = Lots;
        if  (lotMM > 1000) lotMM = 1000;
     }
     else //micro account
     {
        if (lotMM < 0.01) lotMM = Lots;
        if  (lotMM > 1000) lotMM = 1000;
     }
     if (OrderSelect (1, SELECT_BY_POS, MODE_HISTORY)==true)
     {if (OrderProfit() > 0)
        {if (OrderSelect (2, SELECT_BY_POS, MODE_HISTORY)==true)
          {if (OrderProfit() < 0) lotMM = MathCeil(AccountFreeMargin() *  Risk) / 1000000 * 1.5; 
           if (OrderProfit() > 0) lotMM = MathCeil(AccountFreeMargin() *  Risk) / 1000000 * 1.5 * 1.5;}
           if (OrderSelect (2, SELECT_BY_POS, MODE_HISTORY)==false) lotMM = MathCeil(AccountFreeMargin() *  Risk) / 1000000 * 1.5;
           if (OrderSelect (3, SELECT_BY_POS, MODE_HISTORY)==true)
           {if (OrderProfit() > 0) lotMM = MathCeil(AccountFreeMargin() *  Risk) / 1000000 * 1.5*1.5*1.5;
           if (OrderProfit() < 0) lotMM = MathCeil(AccountFreeMargin() *  Risk) / 1000000 * 1.5*1.5;}
           if (OrderSelect (4, SELECT_BY_POS, MODE_HISTORY)==true)
           {if (OrderProfit() > 0)
           {if (OrderSelect (3, SELECT_BY_POS, MODE_HISTORY)==true)
            {if (OrderProfit() > 0)
             {if (OrderSelect (2, SELECT_BY_POS, MODE_HISTORY)==true)
              {if (OrderProfit() > 0)
               {if (OrderSelect (1, SELECT_BY_POS, MODE_HISTORY)==true)
                {if (OrderProfit() > 0) lotMM = MathCeil(AccountFreeMargin() *  Risk) / 1000000;}}}}}}}
      if (OrderProfit() < 0) lotMM = MathCeil(AccountFreeMargin() *  Risk) / 1000000;
      if (OrderSelect (1, SELECT_BY_POS, MODE_HISTORY)==false) lotMM = MathCeil(AccountFreeMargin() *  Risk) / 1000000;
          
     }}
     
     return (lotMM);
     }
C'est très long et je suppose qu'il existe 1000 façon de le simplifier et de le raccourcir.

En plus pour le moment ça marche mal.
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

DhaoS

Re: Mql4: Comment selectionner plusieurs ordres

#4 Message par DhaoS »

J'ai pas trop compris ce que tu veux faire mais j'ai l'impression que ce qu'il te manque est l'utilisation d'une "boucle for"

Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Re: Mql4: Comment selectionner plusieurs ordres

#5 Message par Fabien LABROUSSE »

Enfait je veux faire ça:

Si la dernière position clôturée était gagnante, et que les deux précédentes étaient perdantes, alors je multiplie la taille de mon lot par 1.5.

Si la dernière position clôturée était gagnante, et que l'avant dernière l'était aussi, mais que la précédente (donc la troisième) était perdante, alors je multiplie la taille de mon lot initial par 1.5 puis par 1.5 la taille de ma position précédente (donc taille initiale multipliée par 1.5).

Si les trois dernière positions étaient gagnantes, alors je repart avec une taille de lot initiale.
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

DhaoS

Re: Mql4: Comment selectionner plusieurs ordres

#6 Message par DhaoS »

J'espère avoir bien compris :)


J'ai pas testé si ça compile mais c'est l'idée :

Code : Tout sélectionner

bool profit[];
double lotInitial=0.1,lot=lotInitial;

// Je regarde si les 3 derniers ordres ont été gagnants et je stocke le résultat
for(i=0; i<=2; i++){
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true){
      if (OrderProfit>0) profit[i]=true;
      else profit[i]=false;
   }
}

// Si le dernier trade clôturé est gagnant
if (profit[0]==true){
   // Si les 2 derniers trades clôturés sont gagnants
   if (profit[1]==true){
      // Si le 3ème trade clôturé est aussi gagnant (donc ils le sont tous)
      if (profit[2]==true){
         lot=lotInitial;
      }
      // Si par contre le 3ème trade clôturé est perdant
      else{
         lotInitial=(lotInitial*1.5);
         lot=lotInitial;
      }
   }
   // Si le 1er trade est gagnant mais pas les deux autres
   else lot=(lot*1.5);
}
Bon par contre en multipliant comme ça, il va y avoir des problèmes de taille de lots incorrectes

Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Re: Mql4: Comment selectionner plusieurs ordres

#7 Message par Fabien LABROUSSE »

Merci beaucoup dhaos, je vais tester ça.

Concernant les problèmes de taille des lots invalides justement, comment dire à l'expert de tronquer ou d'arrondir au deuxième chiffre après la virgule?

Il y a MathCeil qui renvoie un entier uniquement, mais pas de chiffre après la virgule.
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

Avatar de l’utilisateur
madjes
Administrateur
Messages : 1194
Inscription : 28 oct. 2008, 16:00

Re: Mql4: Comment selectionner plusieurs ordres

#8 Message par madjes »

pour arrondir il faut utiliser NormalizeDouble(ta_variable,nombre_de_decimal)
"The market is like a beautiful woman-endlessly fascinating, endlessly complex, always changing, always mystifying." The Money Game - Adam Smith

L'art d'être tantôt très audacieux et tantôt très prudent est l'art de réussir-Napoléon Bonaparte

DhaoS

Re: Mql4: Comment selectionner plusieurs ordres

#9 Message par DhaoS »

Aussi dans ce que tu voulais y'a un truc bizarre :
la valeur du lot n'est jamais censée baisser? (puisque la taille initiale augmente dans certains cas et ne baisse jamais)

Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Re: Mql4: Comment selectionner plusieurs ordres

#10 Message par Fabien LABROUSSE »

madjes a écrit :pour arrondir il faut utiliser NormalizeDouble(ta_variable,nombre_de_decimal)
Ok je vais essayer, merci madjes.
DhaoS a écrit :Aussi dans ce que tu voulais y'a un truc bizarre :
la valeur du lot n'est jamais censée baisser? (puisque la taille initiale augmente dans certains cas et ne baisse jamais)
Si, on est censé repassé à la valeur initiale (par exemple 0.01 pour 1000€ d'équité) une fois qu'on a atteint le nombre de gains consécutif visé.
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

Répondre