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

 
Bonjour, veuillez m'aider à résoudre un problème. J'ai besoin de récupérer les données d'un EA pour différents symboles/TF. Le manuel indique :"Le mécanisme d'accès au serveur pour les données ne dépend pas de la manière dont une requête a été initiée - par un utilisateur lors de la navigation sur un graphique ou par le programme en MQL4". Cependant, en pratique, si en temps réel, par exemple, nous suivons le nombre de barres sur un symbole/TF différent du symbole sur lequel l'EA est exécuté, il se passe ce qui suit Le nouveau symbole charge un petit nombre de barres lors du premier accès (environ 1000 pour M1) et ce nombre ne change pas. J'ai essayé différentes fonctions pour accéder aux séries temporelles, j'ai essayé de spécifier un déplacement des barres et du temps plus profond dans l'historique qu'il n'est chargé en ce moment, j'ai essayé de déplacer le ChartNavigate(_ID, CHART_BEGIN) - les nouvelles données ne sont pas chargées et le nombre de barres ne change pas. Cependant, si j'ouvre une fenêtre de manière programmatique à partir du même Expert Advisor (je l'ai déjà ouverte pour la fonction ChartNavigate()) et que je déplace le graphique vers la gauche en utilisant la flèche/le bouton Home/PgUp, cela conduit à l'augmentation des tableaux de timeseries, le nombre de barres est augmenté en temps réel, c'est-à-dire que les données sont chargées. Que faut-il faire pour charger l'historique de manière programmatique sans appuyer sur les touches physiques du clavier ? Merci)
 
Ihor Herasko:

Faites-le comme ça. Le code est presque correct. Il ne manque qu'un mot :

Merci !
 
Alexandr Mordashov:
Bonjour, aidez-moi à résoudre ce problème. J'ai besoin de récupérer les données d'un EA pour différents symboles/TF. L'aide indique :"Le mécanisme d'accès au serveur pour les données ne dépend pas de la façon dont la demande a été initiée - par un utilisateur lors de la navigation d'un graphique ou par un programme en MQL4". Cependant, en pratique, si en temps réel, par exemple, nous suivons le nombre de barres sur un symbole/TF différent du symbole sur lequel l'EA est exécuté, il se passe ce qui suit Le nouveau symbole charge un petit nombre de barres lors du premier accès (environ 1000 pour M1) et ce nombre ne change pas. J'ai essayé différentes fonctions pour accéder aux séries temporelles, j'ai essayé de spécifier un déplacement des barres et du temps plus profond dans l'historique qu'il n'est chargé en ce moment, j'ai essayé de déplacer le ChartNavigate(_ID, CHART_BEGIN) - les nouvelles données ne sont pas chargées et le nombre de barres ne change pas. Cependant, si j'ouvre une fenêtre de manière programmatique à partir du même Expert Advisor (je l'ai déjà ouverte auparavant pour la fonction ChartNavigate()) et que je déplace le graphique vers la gauche en utilisant la flèche/Home/PgUp, cela conduit à l'augmentation des tableaux de timeseries, le nombre de barres est augmenté en temps réel, c'est-à-dire que les données sont chargées. Que faut-il faire pour charger l'historique de manière programmatique sans appuyer sur les touches physiques du clavier ? Merci)

Vous devez être plus explicite sur la question. Si le problème n'est pas posé, il ne peut être résolu.

 
Galim_V:
Pouvez-vous me dire comment obtenir les indicateurs inférieurs à partir d'une autre trame temporelle que celle sur laquelle la chouette plane ?
double iRev()
{
 static int wtf;
 static int tf;  
 int xtf =Period();       // таймфрейм текущего графика 
 
                          //PERIOD_CURRENT;
 if(xtf != PERIOD_CURRENT)
 {
 Print("xtf  ",xtf);
   switch(xtf)
   {
    case 1: tf = PERIOD_H1;
    break;
    case 5: tf = PERIOD_H4; wtf = PERIOD_H1;
    break;
    case 15: tf = PERIOD_D1;
    break;
   }
     
 }
Print("tf == ",tf,"wtf ==",wtf);
 double  iRa =  NormalizeDouble(iCustom(NULL,tf,"iRevers",InpSARStep,InpSARMaximum,0),Digits);
 double  wRa =  NormalizeDouble(iCustom(NULL,wtf,"iRevers",InpSARStep,InpSARMaximum,0),Digits);
   if(iRa != 0) ObjectCreate("Ra",OBJ_HLINE,0,Time[0],iRa,0,0);
     
     ObjectSet("Ra",OBJPROP_TIME1,Time[0]);
     ObjectSet("Ra",OBJPROP_PRICE1,iRa);
   
   if(wRa != 0) ObjectCreate("weRa",OBJ_HLINE,0,Time[0],wRa,0,0); 
     ObjectSet("weRa",OBJPROP_TIME1,Time[0]);
     ObjectSet("weRa",OBJPROP_PRICE1,wRa); 
    
     
  Print("iRa   ",iRa,wRa);
 return(iRa);
}  
Fonctionne, mais pas toujours correctement. J'ai joint des objets pour une évaluation visuelle. Des conseils ou un endroit où chercher.
 
Galim_V:
Cela fonctionne, mais pas toujours correctement. J'ai attaché les objets pour une évaluation visuelle. Veuillez me conseiller ou me dire où chercher.

A quoi sert DRAW_LINE ?

 double  iRa =  NormalizeDouble(iCustom(NULL,tf,"iRevers",InpSARStep,InpSARMaximum,DRAW_LINE,0),Digits);
 double  wRa =  NormalizeDouble(iCustom(NULL,wtf,"iRevers",InpSARStep,InpSARMaximum,DRAW_LINE,0),Digits);
 
Alexey Viktorov:

A quoi sert DRAW_LINE ?

J'ai corrigé le code. Mais cela n'a pas fonctionné correctement, même pas à cause d'erreurs dans le code. Je fais des tests dans le terminal de mon broker et je ne surveille pas toujours la connexion avec le serveur. C'est très important dans ce cas. Merci.
 

Bonjour. Comment puis-je connaître le prix de clôture à M30 si l'EA est sur le graphique H1 ?

Close_M30= iClose(Symbol(),PERIOD_M30,1);
 
bij:

Bonjour. Comment puis-je connaître le prix de clôture à M30 si l'EA est sur le graphique H1 ?

J'aime quand les gens posent une question et y répondent eux-mêmes ;))

En gros, tout est correct. Il y a juste un point subtil : avant d'utiliser des données obtenues à partir d'une autre période, nous devons nous assurer que ces données existent bel et bien.

Le code correct complet ressemblerait donc à ceci

ResetLastError();
Close_M30= iClose(Symbol(),PERIOD_M30,1);
if (GetLastError() != ERR_NO_ERROR)
{
  // Значение Close_M30 использовать нельзя
}
 
Ihor Herasko:

J'aime quand les gens posent une question et y répondent ensuite eux-mêmes ;))

Dans l'ensemble, tout est correct. Il y a juste une nuance : avant d'utiliser les données d'un autre TF, vous devez vous assurer que ces données existent bel et bien.

Ainsi, le code correct complet ressemblerait à ceci :

Merci, l'action ne se fait qu'après la clôture H1, mais la condition est remplie 30 minutes avant la clôture H1.

 ResetLastError();
   niz_=NormalizeDouble(iCustom(NULL,PERIOD_M30,"mand v.1",2,1),Digits);
   Close_M30=iClose(Symbol(),PERIOD_M30,1);
   if(GetLastError() != ERR_NO_ERROR)return;
   if(Close_M30>niz_)//условие
     {
      //действие
     }
 
bij:

Merci, l'action est seulement après la clôture H1, mais la condition est remplie 30 minutes avant la clôture H1.

Si vous voulez prendre la bougie M30 qui a clôturé avec la dernière clôture H1, cela peut être une bougie avec un indice non seulement 1, mais aussi 2. De plus, il n'est pas clair pourquoi le prix de clôture de M30 est pris alors que c'est le même prix de clôture pour la bougie H1 précédente. C'est-à-dire que dans ce cas, il est inutile d'interroger le prix de clôture d'une autre TF, car il coïncide avec le prix de clôture de la TF actuelle.

Raison: