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

 
Igor Zakharov:

Mais pas ceux du calendrier. Barres de 30 jours à l'envers (dimanches, samedis)

A en juger par la fonction sans le paramètre shift, vous faites en 5 et vous avez posé la question en 4 :)

Oui, 30 barres, c'est 21 jours ouvrables si on compte à partir d'hier. (24.02.2019 - 25.01.2019)

J'ai...

Pour le mois, la taille moyenne des bougies est de 598.

Pour une semaine, taille moyenne des bougies : 519

Et iATR() donne des numéros à dix chiffres...

Je ne sais donc pas encore comment l'utiliser.

 
Alexander Layzerevich:

Et iATR() produit des nombres à dix chiffres...

Habituellement, il s'agit de fractions décimales (comme le prix. Pour convertir en points, vous devez diviser par _Point).

Voir illustration : euro/dollar à ce jour - 560 pips sur une base quotidienne pour le mois.


 
Igor Zakharov:

Habituellement, des fractions décimales (comme le prix. Pour convertir en points, divisez par _Point).

Voir l'illustration : euro/dollar à partir d'aujourd'hui - 560 pips sur une base quotidienne pendant un mois.


Je l'ai vérifié dans MQL4 :

iATR

 
Igor Zakharov:

Habituellement, des fractions décimales (comme le prix. Pour convertir en points, divisez par _Point).

Voir illustration : euro/dollar à partir d'aujourd'hui - 560 pips sur une base quotidienne pendant un mois.


Je l'ai vérifié dans MQL5. J'ai écrit le code suivant pour le vérifier :

//************************************************************************************************/
double iPointOrderStep()
{
   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);
   int Awerage7 = (iATR (Symbol(),PERIOD_D1, 5));
   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2),0);
   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/

C'est ce qu'il montre :

iATR

C'est-à-dire qu'il affiche une valeur, mais en affiche une autre...

 
Alexander Layzerevich:

Je l'ai vérifié dans MQL5. J'ai écrit ce code pour le vérifier :

Voici ce qu'il produit :

C'est-à-dire qu'il affiche une valeur, mais en montre une autre...

Dans MQL5, cette façon de travailler avec l'indicateur n'est pas appropriée.

   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);

Il faut d'abord créer un handle, et c'est fait, et ce n'est qu'après que l'on peut obtenir des valeurs duCopyBuffer.

// этот код в Init()
      int handleATR=iATR(Symbol(),PERIOD_D1,21);
      if(handleATR==INVALID_HANDLE) return;

// это уже в сам советник/индикатор: OnTick()
      double hATR[];
      CopyBuffer(handleATR,0,0,1,hATR);
// double ATR = hATR[0]; // здесь значение ATR
 
Vitaly Muzichenko:

Dans MQL5, cette façon de travailler avec l'indicateur n'est pas appropriée.

Tout d'abord, vous devez créer un handle, et c'est ce que vous avez fait maintenant, et après cela, vous pouvez obtenir des valeurs duCopyBuffer.

Merci, je vais en tenir compte et réécrire le code.

Je l'écris simplement dans MT4 et j'utilise #include <MT4Orders.mqh> pour le tester dans MT5.

Peut-être que la bibliothèque ne prend pas en charge les indicateurs.

 
Alexander Layzerevich:

Merci, je vais en tenir compte et réécrire le code.

Je l'écris simplement dans MT4 et utilise #include <MT4Orders.mqh> pour le tester dans MT5.

Peut-être que la bibliothèque ne prend pas en charge les indicateurs.

Oui, uniquement les fonctions commerciales.

 
Alexander Layzerevich:

Merci, je vais en tenir compte et réécrire le code.

Je l'écris simplement dans MT4 et utilise #include <MT4Orders.mqh> pour le tester dans MT5.

Peut-être la bibliothèque ne prend-elle pas en charge les indicateurs.

C'est un moyen très rapide de combiner deux plateformes, cela fonctionne, mais il vaut mieux ne pas le faire dans mql5.

double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }

Et appliquer l'indicateur de la même manière que dans mql4

double atr=ATR(Symbol(),PERIOD_D1, 30);
 
Vitaly Muzichenko:

Il s'agit d'une option très rapide pour combiner les deux plateformes, elle fonctionne, mais il est préférable de ne pas le faire dans mql5.

Et appliquer l'indicateur de la même manière que dans mql4

Merci beaucoup pour le code.

Cela a fonctionné :

//************************************************************************************************/
double iPointOrderStep()
{
   double Awerage30 = (int)((ATR(Symbol(),PERIOD_D1,21,1))/Point());
//   Print ("Awerage30 = ", Awerage30);
   double Awerage7 = (int)((ATR(Symbol(),PERIOD_D1,5,1))/Point());
//   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2/6),0);
//   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/
double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
//************************************************************************************************/

Maintenant, j'ai des données moyennées au début du démarrage de l'EA. Et ces données sont recalculées à chaque fois que j'accède à la fonction.

Si je comprends bien, pour limiter les appels, je dois créer un enregistrement tampon avec les données calculées.

Nous devons donc définir la condition pour le recalcul. Les "lundis" et s'il n'y a rien dans le tampon.

Par exemple, déclarer la variable buferStep = -1 ; et dansOnTick() si buferStep <0 ou "Monday" alors recalculer.

Là encore, je suis bloqué, comment le robot peut-il déclarer qu'aujourd'hui est "lundi" ?

 
Alexander Layzerevich:

Merci beaucoup pour le code.

Ça s'est passé comme ça :

J'ai maintenant les données moyennées au début de l'EA. Et ces données sont recalculées à chaque fois que la fonction est appelée.

Si je comprends bien, pour limiter les appels, je dois créer un enregistrement tampon avec les données calculées.

Nous devons donc définir la condition pour le recalcul. Les "lundis" et s'il n'y a rien dans le tampon.

Par exemple, déclarer la variable buferStep = -1 ; et dansOnTick() si buferStep <0 ou "Monday" alors recalculer.

Là encore, j'ai un problème : comment Robot peut-il déclarer qu'aujourd'hui est "lundi" ?

Je ne veux pas utiliser le lundi, je veux juste le nombre de jours passés. Et je l'obtiendrais sur chaque nouvelle barre afin de ne pas charger le Conseiller Expert avec des calculs à chaque tick.

Raison: