Page 1 sur 1

Mql4: Comment selectionner plusieurs ordres

Publié : 02 août 2010, 11:32
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.

Re: Mql4: Comment selectionner plusieurs ordres

Publié : 02 août 2010, 12:31
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 ;)

Re: Mql4: Comment selectionner plusieurs ordres

Publié : 02 août 2010, 12:40
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.

Re: Mql4: Comment selectionner plusieurs ordres

Publié : 03 août 2010, 12:13
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"

Re: Mql4: Comment selectionner plusieurs ordres

Publié : 04 août 2010, 13:56
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.

Re: Mql4: Comment selectionner plusieurs ordres

Publié : 04 août 2010, 15:26
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

Re: Mql4: Comment selectionner plusieurs ordres

Publié : 04 août 2010, 18:48
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.

Re: Mql4: Comment selectionner plusieurs ordres

Publié : 05 août 2010, 00:05
par madjes
pour arrondir il faut utiliser NormalizeDouble(ta_variable,nombre_de_decimal)

Re: Mql4: Comment selectionner plusieurs ordres

Publié : 05 août 2010, 01:02
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)

Re: Mql4: Comment selectionner plusieurs ordres

Publié : 28 août 2010, 13:14
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é.