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

 
Youri Lazurenko:

Je n'arrive pas à résoudre un problème apparemment simple. Quelque part sur le graphique, il y avait un croisement de MA. Nous trouvons un bar après la traversée. Comment calculer le nombre de barres entre cette barre et la barre actuelle ?

Le numéro de cette barre particulière. Non ?
 
Youri Lazurenko:

Je n'arrive pas à résoudre un problème apparemment simple. Quelque part sur le graphique, il y avait un croisement de MA. Nous trouvons un bar après la traversée. Comment calculer le nombre de barres entre cette barre et la barre actuelle ?


Il semble que ce soit fait (au moins le commentaire sur l'écran est correct). Grâce au"nombre de barres", je pense avoir trouvé la solution. J'utilise la fonction iTime pour déterminer la date de la barre nécessaire. L'esquisse ressemble à ceci :

void OnTick()

{

int nBarsUp, nBarsDn ;

datetime date_dn = iTime(NULL, 0, IntersectionDN()) ;

datetime date_up = iTime(NULL, 0, IntersectionUp()) ;

datetime date_1 = iTime(NULL, 0, 1) ;

nBarsUp = Bars(Symbol(), 0, date_up, date_1) ;

nBarsDn = Bars(Symbol(), 0, date_dn, date_1) ;

Comment("Nombre de barres longues : " + nBarsUp + "\n "+ "Nombre de barres courtes : " + nBarsUp + "\n")

"Nombre de barres courtes :" + nBarsDn) ;

}

//+------------------------------------------------------------------+

int IntersectionDN()

{

for(int i = 0 ; i < 36 ; i++)

{

if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)

&& iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

retour (i-1) ;

}

retour(-1) ;

}

int IntersectionUp()

{

for(int i = 0 ; i < 36 ; i++)

{

if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)

&& iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

retour (i-1) ;

}

retour(-1) ;

}

 
Youri Lazurenko:

Il semble que cela ait fonctionné (au moins le commentaire sur l'écran est correct). Grâce au"nombre de barres", je pense avoir trouvé une solution. J'ai utilisé la fonction iTime pour déterminer la date de la barre souhaitée. Le schéma ressemble à ceci :

void OnTick()

{
   int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
   
   Comment("Количество длинных баров: " + nBarsUp + "\n"+
           "Количество коротких баров: " + nBarsDn);     
}

//+------------------------------------------------------------------+

int IntersectionDN()

{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   }  
   return(-1);
}

int IntersectionUp()
{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   } 
   return(-1);  

}

Vous cherchez un croisement dans la boucle. Et à partir de la barre zéro, on entre dans l'histoire. Donc votre fonction IntersectionXX() renvoie le numéro de la barre.

C'est pour quoi tout ça ?

int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
 
Artyom Trishkin:

Vous cherchez un croisement dans la boucle. Et de la barre zéro au bas de l'histoire. Donc IntersectionXX() renvoie le numéro de la barre.

C'est pour quoi tout ça ?


Le numéro de la barre, oui. Mais j'ai besoin de connaître le nombre de barres - de cette barre au plus profond de l'historique jusqu'à la barre zéro. En bref, j'ai besoin de l'angle de la pente de la barre par rapport à la MA. Mais comme il ne peut être calculé comme il me semble (prix sur la ligne verticale et barres sur la ligne horizontale placées à une certaine distance les unes des autres - ce sont des valeurs incompatibles). Il était une fois une suggestion sur le forum d'introduire un coefficient - la différence de prix divisée par le nombre de barres. L'idée me semble raisonnable. Je veux le mettre en pratique, mais comme je suis moi-même une andouille, j'essaie de trouver quelque chose et de l'essayer moi-même par essais et erreurs.

P.S. Comment insérer du code dans MQL4 (comme le vôtre, pas comme le mien) ?
 

Quelqu'un sait-il comment résoudre ce problème ?


Après avoir changé le TF, le panneau est déformé.

 
Youri Lazurenko:

Le nombre de bars, oui. Mais j'ai besoin de connaître le nombre de barres - depuis cette certaine barre au fond de l'histoire jusqu'à la 0e barre. En bref, j'ai besoin de l'angle de la barre par rapport à la MA. Mais comme il ne peut pas être calculé, il me semble (prix sur la ligne verticale et barres sur la ligne horizontale placées à une certaine distance l'une de l'autre - ce sont des valeurs incompatibles). Il était une fois une suggestion sur le forum d'introduire un coefficient - la différence de prix divisée par le nombre de barres. L'idée me semble raisonnable. Je veux le mettre en pratique, mais étant moi-même un mannequin, j'essaie de trouver quelque chose et de l'essayer moi-même par essais et erreurs.

P.S. Comment insérer du code dans MQL4 (de la façon dont vous l'avez, pas de la façon dont je l'ai) ?
Si c'est la dixième barre, comment puis-je savoir la différence entre la dixième et la barre zéro ? 10-0=10
Et à quoi sert la soustraction ?

 

Bonjour ! Les deuxnombresmoinsq et wsont comparés de manière incorrecte, alors qu'ils sont égaux, l'opérateur if pense que l'un est plus grand que l'autre.Quelle est l'erreur ? Lorsque q = -0.0002 et que w est également -0.0002, res12=faux, pourquoi ?

 

Bonjour ! Les deuxnombresmoinsq et wsont comparés de manière incorrecte, alors qu'ils sont égaux, l'opérateur if pense que l'un est plus grand que l'autre.Quelle est l'erreur ? Lorsque q = -0.0002 et que w est également -0.0002, res12=faux, pourquoi ?

static bool res12=true;

start()
{   

double SPREAD=MarketInfo(Symb,MODE_SPREAD);// Спред

   double q=High[0]-3.0*Point-High[1];
   double w=-SPREAD*Point;
      
   if (New_Bar==true&&ticket1<=0)
     {
      if(q>w)
       {
        res12=false; 
        Alert("res12=false");
        Alert (q);
        Alert (w);
       }
     }
      if (New_Bar==true&&ticket1<=0)
     {
        if(q<=w)
        {
         res12=true;
         Alert("res12=true");
         Alert (q);
         Alert (w);
        }
      }





}
 
Jenya77769:

Bonjour ! Les deuxnombresmoinsq et wsont comparés de manière incorrecte, alors qu'ils sont égaux, l'opérateur if pense que l'un est plus grand que l'autre.Quelle est l'erreur ? Lorsque q = -0.0002 et que w est également -0.0002, res12=faux, pourquoi ?


Je pense que nous devons normaliser et c'est tout, vous ne pouvez pas comparer les doubles entre eux sans normalisation.

if NormalizeDouble (q<=w)
 
Vyacheslav Kornev:

Je pense que je dois normaliser et c'est tout, car il n'est pas possible de comparer le double entre eux sans normalisation.


Merci, ça a marché, seulement j'ai normalisé q et w séparément !

if(NormalizeDouble(q,4)> NormalizeDouble(q,4))