Comment trouver le moment de la barre où les moyennes mobiles se sont croisées ? (code à l'intérieur)

 

Bonjour à tous !

J'espérais obtenir de l'aide pour mon code - je suis actuellement bloqué sur cette satanée partie !


Voici le processus que j'essaie d'écrire dans le code ci-dessous :

1) Si toutes les MA sont "en éventail" et croisées de sorte que le prix est au-dessus de toutes les moyennes mobiles et qu'elles indiquent un potentiel long.

2) Je veux ensuite connaître la barre exacte (en utilisant le temps) à laquelle les moyennes mobiles sont "écartées" au croisement des moyennes mobiles.

3) Si 1 et 2 sont vrais, j'attends alors que n'importe quelle barre redescende (dans le cas d'une position longue) et touche la 21 EMA.

4) De la première barre (où les MA se sont croisées et déployées en éventail) à la barre qui a maintenant touché la 21 EMA - je veux un ordre en attente OU au marché placé AU-DESSUS des sommets de cette fourchette (1 et 3).

5) Si le prix, à quelque moment que ce soit, CLOTURE en dessous de la 60 EMA, AVANT de déclencher l'ordre - alors l'ordre doit être annulé.

Ce n'est évidemment pas tout le code, mais c'est la partie principale avec laquelle je m'arrache les cheveux. Veuillez vérifier le code avec le "<<<<<<<<<<<<<". Ce sont les points sur lesquels je suis confus.

J'aurais VRAIMENT besoin de l'aide de quelqu'un - ce serait vraiment apprécié !

Merci d'avance !

datetime          triggerBarTime;   <<<<< Global settings.
datetime          triggerBarTime1;  <<<<< Global settings.	



void CheckForMaTrade()
{

//+-----------------------------------------------------------------------------------------------------------------------+ 
    //Small and Big Fish on the H1 Time Frame.                                                                           |
//+-----------------------------------------------------------------------------------------------------------------------+              

   {
   double PreviousSmallFish1  =  iMA(NULL,60,3,0,1,0,2); 
   double CurrentSmallFish1   =  iMA(NULL,60,3,0,1,0,1);
   double PreviousSmallFish2  =  iMA(NULL,60,5,0,1,0,2);
   double CurrentSmallFish2   =  iMA(NULL,60,5,0,1,0,1);
   double PreviousSmallFish3  =  iMA(NULL,60,8,0,1,0,2);
   double CurrentSmallFish3   =  iMA(NULL,60,8,0,1,0,1);
   double PreviousSmallFish4  =  iMA(NULL,60,10,0,1,0,2);
   double CurrentSmallFish4   =  iMA(NULL,60,10,0,1,0,1);  
   double PreviousSmallFish5  =  iMA(NULL,60,12,0,1,0,2);
   double CurrentSmallFish5   =  iMA(NULL,60,12,0,1,0,1);
   double PreviousSmallFish6  =  iMA(NULL,60,15,0,1,0,2);
   double CurrentSmallFish6   =  iMA(NULL,60,15,0,1,0,1);  
   
      double PreviousBigFish1  =  iMA(NULL,60,30,0,1,0,2); 
      double CurrentBigFish1   =  iMA(NULL,60,30,0,1,0,1);
      double PreviousBigFish2  =  iMA(NULL,60,35,0,1,0,2);
      double CurrentBigFish2   =  iMA(NULL,60,35,0,1,0,1);
      double PreviousBigFish3  =  iMA(NULL,60,40,0,1,0,2);
      double CurrentBigFish3   =  iMA(NULL,60,40,0,1,0,1);
      double PreviousBigFish4  =  iMA(NULL,60,45,0,1,0,2);
      double CurrentBigFish4   =  iMA(NULL,60,45,0,1,0,1);
      double PreviousBigFish5  =  iMA(NULL,60,50,0,1,0,2);
      double CurrentBigFish5   =  iMA(NULL,60,50,0,1,0,1);
      double PreviousBigFish6  =  iMA(NULL,60,60,0,1,0,2);
      double CurrentBigFish6   =  iMA(NULL,60,60,0,1,0,1); 
      
            if(PreviousBigFish1<CurrentBigFish2 && CurrentBigFish1>PreviousBigFish2)
               if(PreviousBigFish2<CurrentBigFish3 && CurrentBigFish2>PreviousBigFish3)
                  if(PreviousBigFish3<CurrentBigFish4 && CurrentBigFish3>PreviousBigFish4)
                     if(PreviousBigFish4<CurrentBigFish5 && CurrentBigFish4>PreviousBigFish5)
                        if(PreviousBigFish5<CurrentBigFish6 && CurrentBigFish5>PreviousBigFish6)  
                           
                           if(PreviousSmallFish1<CurrentSmallFish2 && CurrentSmallFish1>PreviousSmallFish2)
                        if(PreviousSmallFish2<CurrentSmallFish3 && CurrentSmallFish2>PreviousSmallFish3)
                     if(PreviousSmallFish3<CurrentSmallFish4 && CurrentSmallFish3>PreviousSmallFish4)
                  if(PreviousSmallFish4<CurrentSmallFish5 && CurrentSmallFish4>PreviousSmallFish5)
                if(PreviousSmallFish5<CurrentSmallFish6 && CurrentSmallFish5>PreviousSmallFish6)triggerBarTime = Time[1];  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      
      
      double ema21 = iMA(NULL,60,21,0,1,0,1); 
       
        
         if (Low[1]<ema21)
         {
         
           OrderEntry(0); // BUY 
            }     
      
      
                
     if(PreviousBigFish1>CurrentBigFish2 && CurrentBigFish1<PreviousBigFish2)
      if(PreviousBigFish2>CurrentBigFish3 && CurrentBigFish2<PreviousBigFish3)
         if(PreviousBigFish3>CurrentBigFish4 && CurrentBigFish3<PreviousBigFish4)
            if(PreviousBigFish4>CurrentBigFish5 && CurrentBigFish4<PreviousBigFish5)
               if(PreviousBigFish5>CurrentBigFish6 && CurrentBigFish5<PreviousBigFish6)
               
               if(PreviousSmallFish1>CurrentSmallFish2 && CurrentSmallFish1<PreviousSmallFish2)
            if(PreviousSmallFish2>CurrentSmallFish3 && CurrentSmallFish2<PreviousSmallFish3)
         if(PreviousSmallFish3>CurrentSmallFish4 && CurrentSmallFish3<PreviousSmallFish4)
       if(PreviousSmallFish4>CurrentSmallFish5 && CurrentSmallFish4<PreviousSmallFish5)
     if(PreviousSmallFish5>CurrentSmallFish6 && CurrentSmallFish5<PreviousSmallFish6)triggerBarTime = Time[1]; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
    double ema21_2 = iMA(NULL,60,21,0,1,0,1); 
  
            if(High[1]>ema21_2)
            {
             
              OrderEntry(1); // SELL
             }  
   
       }

}


//+------------------------------------------------------------------+  
//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+

void OrderEntry (int direction)
{    
   double LotSize=0;
   double Equity=AccountEquity();
   double RiskedAmount=Equity*RiskPercent*0.01;
   int buyStopCandle = iLowest(NULL,0,1,CandlesBack,1); 
   int sellStopCandle = iHighest(NULL,0,2,CandlesBack,1);
   
   double buyPrice = iHighest(Symbol(), 0, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0);    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
   double sellPrice = iLowest(Symbol(), 0, MODE_LOW, iBarShift(Symbol(), 0, triggerBarTime1, true), 0);   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
   double buy_stop_price = iMA(NULL,60,60,0,1,0,1)-PadAmount*pips; 
   double pips_to_bsl = Ask-buy_stop_price;         //double pips_to_bsl = Ask-buy_stop_price;   --- Old code
   double buy_takeprofit_price = Ask+pips_to_bsl*RewardRatio;   
   double sell_stop_price = iMA(NULL,60,60,0,1,0,1)+PadAmount*pips; //- Greyed out, this is an old code line.
   double pips_to_ssl = sell_stop_price-Bid;     ////double pips_to_ssl = sell_stop_price-Bid;   --- Old code
   double sell_takeprofit_price = Bid-pips_to_ssl*RewardRatio;   
   
  
   if (direction==0)//<< "0" pushes out a Buy direction
   {
      //double buyPrice = iHighest(Symbol(), 60, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0);//-PadAmount*pips; // new line
      int Buy_Price = buyPrice;
      
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      //LotSize = (100/(0.00500/0.00010))/10
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10;
      if(OpenOrdersThisPair(Symbol())==0) //--- This means that it will not open a new order if there is one already open!If greyed out, it will take everything.
      int buyticket = OrderSend(Symbol(),Buy_Price,LotSize,Ask,3,0,0,NULL,MagicNumber,0,Green); //ask
      if(buyticket>0)OrderModify(buyticket,OrderOpenPrice(),bsl,btp,0,CLR_NONE);
   }
            
   if (direction==1) //<< "1" pushes out a Sell direction
   {
      
      //double sellPrice = iLowest(Symbol(), 60, MODE_LOW, iBarShift(Symbol(), 0, triggerBarTime1, true), 0);//+PadAmount*pips;   // new line.
      int Sell_Price = sellPrice;
      
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price; 
      //LotSize = (100/(0.00500/0.00010))/10;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)  //--- This means that it will not open a new order if there is one already open! If greyed out, it will take everything.
      int sellticket = OrderSend(Symbol(),Sell_Price,LotSize,Bid,3,ssl,stp,NULL,MagicNumber,0,Red); //bid
      if(sellticket>0)OrderModify(sellticket,OrderOpenPrice(),ssl,stp,0,CLR_NONE);
   }
   
}

return(0);

 
DomGilberto:

Bonjour à tous !

Ce n'est évidemment pas tout le code, mais c'est la partie principale avec laquelle je m'arrache les cheveux. Veuillez vérifier le code avec le "<<<<<<<<<<<<<". Ce sont les points sur lesquels je suis confus.

Veuillez lire la documentation des fonctions que vous utilisez ...iHighest() ne renvoie pas un prix ... il renvoie un int"Renvoie le décalage de la valeur maximale sur un nombre spécifique de périodes en fonction du type."
 

Merci RaptorUK - De la manière la plus gentille possible, cela n'explique rien pour moi ? En termes simples ?

Est-ce un forum où quelqu'un peut réellement m'aider autrement qu'en répétant les définitions des fonctions (que j'ai lues des centaines de fois dans la section "aide"...).

Après tout, je ne pense pas que ce que je demande (par rapport à certains fils de discussion ici !) soit suffisant pour justifier que quelqu'un fasse payer son temps... ?

 

Traduire en termes simples vous aidera... une fois, aujourd'hui, avec ce problème particulier... et prendra un peu de temps pour l'explicateur.

Si vous dites quels termes de la définition vous ne comprenez pas, peut-être que la prochaine fois vous pourrez résoudre vos propres problèmes, et après un certain temps, vous pourrez être l'un de ceux qui résolvent les problèmes des autres.

Si vous essayez d'étudier le problème vous-même, vous apprendrez également beaucoup plus. Par exemple, essayez ceci :

Alert(iHighest(Symbol(), 0, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0));

et tu verras quelle valeur est retournée par la fonction... (comme Raptor le dit, ce n'est pas un prix)... et tu comprendras probablement plus facilement la définition de la fonction.

Ce genre de choses vous aidera davantage que d'espérer que quelqu'un sur le forum ait le temps de tester votre code et de faire le même dépannage que vous devriez apprendre à faire vous-même.

 

Hein ? Je suis tellement confus - Est-ce que je demande trop d'aide ?

Après tout, j'ai construit toute mon EA à partir de la base (ce que j'ai appris moi-même...) J'ai juste besoin des conseils de quelqu'un qui a plus de connaissances que moi... :s

 

"Des choses comme ça vous aideront plus que d'espérer que quelqu'un du conseil ait le temps de tester votre code et de faire le même dépannage que vous devriez apprendre à faire vous-même."

C'est quoi ce bordel... Je ne m'attendais pas à cela de la part de qui que ce soit !?

Votre message a permis d'éclaircir la situation - je vous en remercie.

Ce forum est vraiment drôle... Je n'avais pas l'intention de me défouler sur qui que ce soit ! Je voulais simplement obtenir des éclaircissements sur la façon d'identifier correctement la barre qui croise les EMA...

Jeez....

 

quand je lis la réponse de raptor il vous dit le problème exact que vous avez fait.

les prix sont stockés en tant que variables doubles, par exemple 1.12345

la fonction iHighest renvoie un entier (int), par exemple 1 ou 2 ou -100 ...., ce qui n'est clairement pas un prix.

Je ne sais pas ce que vous essayez de faire, mais la fonction iHighest n'est probablement pas celle que vous devriez utiliser.

Vous l'auriez découvert par vous-même si dans le metaeditor, vous cliquez sur iHighest dans votre code, puis appuyez sur F1... vous verrez qu'elle renvoie un entier (ce que Raptor vous a également dit)

Je ne connais pas la source de ta confusion. Si tu ne connais pas la différence entre les variables int et double, il te manque des connaissances de base essentielles, ce qui signifie que tu essaies de courir avant de savoir marcher et que tu veux que quelqu'un d'autre te porte :/.

EDIT : Vous ne vous attendiez pas à devoir faire votre propre dépannage avant de demander à quelqu'un d'autre ? !?

 

Les moyennes mobiles multiples ne se croisent pas au même moment.

Pourquoi postez-vous deux fois ? Votre question a déjà reçu une réponse.

Trouvez la première barre où elles étaient toutes dans le bon ordre.

int DIR = 0;
for(int iBar = 0; iBar < Bar; iBar++){
   double MA20 = ... iBar), 
           MA5 = ... iBar);
          :
   if(     MA20 > MA5 && MA5 > ...) DIR = -1;
   else if(MA20 < MA5 && MA5 < ...) DIR = +1; // All fanning up.
   else if (DIR != 0){ iBar--; break; }       // Last one was cross.
}
 

Je comprends la différence entre int et double...

après que les déclarations If soient vraies, je veux trouver la barre qui a traversé au point où les MA sont espacées. Je pensais que si j'utilisais

"triggerBarTime = Time[1] ;" - après les instructions "If", triggerBarTime pourrait être utilisé en conjonction avec iBarShift pour verrouiller la première barre de la plage qui m'intéresse ?

Ensuite, en utilisant le iHighest, je pourrais convertir cette information en un int et l'utiliser dans ma fonction d' ordre (Buy_Price) ?

 

Vous comprenez peut-être la différence entre int et double mais vous ne comprenez pas la différence entre un numéro de barre (int) et un prix (double).

iHighest vous permettrait de convertir votre date en un numéro de barre (int). Mais OrderSend ne prend qu'un prix (un double) ; cela n'a aucun sens d'ouvrir un ordre à 9.

 

Ah ! J'ai compris !

Merci beaucoup :) Je l'apprécie vraiment !

Merci d'avoir été patient avec moi - je ne voulais pas donner l'impression d'attendre de quelqu'un qu'il fasse quelque chose pour moi ; juste me donner quelques éclaircissements sur l'aide (appuyer sur F1 sur tout n'est pas toujours très clair pour moi) est tout ce que je voulais.