Ce que RefreshRates() met à jour - page 2

 
iClose : zéro - erreur. La fonction ne donne pas d'erreur. Il donne une valeur qui est actuellement obsolète.
 
Je lis ici que " iClose() obtient une valeur du serveur du courtier " Si les données de ces fonctions sont générées par des courtiers honnêtes, alors tout se met en place.)))) Il s'avère que nous ne pouvons faire confiance qu'au tic actuel.
 
Artyom Trishkin:
Non, ce n'est pas le cas. Qu'est-ce qui est écrit dans l'aide de la fonction à propos de la valeur de retour ?
iClose

Valeur retournée

Valeur du prix de clôture de la barre (spécifié par le paramètre shift) du graphique correspondant ou 0 en cas d'erreur. Appelez GetLastError() pour obtenir plus d'informations sur l'erreur.

Il est dit que si elle n'est pas égale à 0, alors il n'y a pas d'erreur. Mais la valeur ne change pas non plus..., donc elle ne se met pas à jour sans RefreshRates() ;, ce qui m'a surpris.
 
Mikhail Nazarenko:

Et si vous changez l'horizon temporel pour un autre que l'horizon actuel, les données ne seront pas mises à jour à temps, même avec RefreshRates(). Ainsi, les fonctions fondamentales d'iClose etc. dans MT4 produisent des conneries non pertinentes. Je suis sûr que 80% des infos ne tiennent pas compte de ces caractéristiques uniques de MT4. Comment vivre ?)))

Changer le calendrier ne changera rien. La valeur actuelle de l'iClose est égale à la valeur de l'offre, quelle que soit la période du graphique.
 
Alexey Viktorov:
L'arrêt du changement ne donnera rien. La valeur actuelle de iClose est égale à la valeur de l'offre, quelle que soit la période du graphique.

J'ai créé un EA et l'ai fait fonctionner sur M5 pendant une journée. Au changement d'heure, il trace des lignes horizontales pour chacune des valeurs : iClose(symbole,PERIOD_H1,1),iClose(symbole, PERIOD_M5,1), iClose(symbole, PERIOD_ M1,1 ),Close[1],Bid

  1. iClose(symbol, PERIOD_ M5,1 ),Close[1] - il s'est affiché exactement comme sur le graphique.
  2. L'offre était proche, c'est la prochaine étape.
  3. iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M1,1) - parfois ils étaient les mêmes, et parfois, surtout dans les heures du soir, ils montraient une merde complète, même après que RefreshRates() ait été connecté.

Question aux développeurs. Pourquoi avons-nous besoin de la fonctioniClose dans MQL4, si elle ne donne pas les informations correctes et s'il n'y a aucun moyen de mettre à jour ses données ?

 
Mikhail Nazarenko:

J'ai créé un EA et l'ai fait fonctionner sur M5 pendant une journée. Au changement d'heure, il trace des lignes horizontales pour chacune des valeurs : iClose(symbole,PERIOD_H1,1),iClose(symbole, PERIOD_M5,1), iClose(symbole, PERIOD_ M1,1 ),Close[1],Bid

  1. iClose(symbol, PERIOD_ M5,1 ),Close[1] - il s'est affiché exactement comme sur le graphique.
  2. L'offre était proche, c'est la prochaine étape.
  3. iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M1,1) - parfois ils étaient les mêmes, et parfois, surtout dans les heures du soir, ils montraient une merde complète, même après que RefreshRates() ait été connecté.

Question aux développeurs. Pourquoi MQL4 a-t-il besoin des fonctionsiClose, si elles ne donnent pas d'informations fiables et s'il n'y a aucun moyen de mettre à jour leurs données ?

C'est absurde. L'appel RefreshRates() n'est nécessaire que si l'exécution a été retardée pour une raison quelconque. Il peut s'agir d'un cycle long ou d'une simple mise à jour des prix au moment de l'envoi d'un ordre d'ouverture. Il ne devrait y avoir aucun problème dans votre variante. Mieux vaut poster un exemple de code qui se trompe autant dans les valeurs de prix.

J'exécute maintenant le code suivant

double close_H1,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_M5, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    if(close_H1 != close_M1)
      Print(close_H1, " != ", close_M1);
   }
  Comment(close_H1, "\n",
          close_M1, "\n"
         );
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/
En substance, la clôture de la minute doit coïncider avec toute période haute sur le graphique. Je vérifierai plus tard pour voir s'il y a quelque chose d'écrit dans le journal.
 
Mikhail Nazarenko:

Et si vous changez l'horizon temporel pour un autre que celui en cours, les données ne seront plus mises à jour à temps, même avec RefreshRates().

Existe-t-il un code de test pour confirmer cette affirmation ? Je ne l'ai pas remarqué moi-même. Lorsque nous changeons de TF, nous attendons simplement que l'histoire soit échangée et nous travaillons.


Ainsi, iClose et d'autres fonctions fondamentales de MT4 produisent des absurdités non pertinentes.

C'est une affirmation trop forte. C'est parfois possible, mais c'est à ça que servent les codes d'erreur. Si vous ne les vérifiez pas, vous ne saurez jamais si vous pouvez utiliser le résultat obtenu.


Je suis sûr que 80 % des produits d'information ne tiennent pas compte de ces caractéristiques uniques de MT4. Comment vivre ?)))

Je dirai même plus : presque tous les programmes ne tiennent pas compte de ces caractéristiques. C'est pourquoi leurs nouvelles versions sont publiées. Dès qu'un produit n'est plus pris en charge, il est rendu inutilisable.

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
  • www.mql5.com
Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

C'est absurde. Il est seulement nécessaire d'appeler RefreshRates() s'il y a eu un retard dans l'exécution pour une raison quelconque. Des cas comme un cycle long ou une simple mise à jour des prix au moment de l'envoi d'un ordre d'ouverture. Il ne devrait y avoir aucun problème dans votre variante. Mieux vaut poster un exemple de code qui se trompe autant dans les valeurs de prix.

J'exécute ce code maintenant

En substance, la clôture minute doit coïncider avec toute période haute sur le graphique. Je verrai plus tard s'il y a quelque chose d'écrit dans le journal.

Mon code est similaire à celui-ci. Il y a une erreur dans OnTick.

close_H1 = iClose(_Symbol, PERIOD_M5, 1);

Il devrait être

close_H1 = iClose(_Symbol, PERIOD_H1, 1);
close_M5 = Close[1];
 if(close_H1 != close_M5)
	 Print(close_H1, " != ", close_M5);
if(close_M1 != close_M5)
	 Print(close_M1, " != ", close_M5);


Si nous avons le cadre temporel actuel M5, nous devons comparer M5 avec H1 et M1.

Le cadre temporel actuel M5 est affiché correctement. Le problème se situait au niveau de H1 et M1.

Je l'ai vérifié sur Alpari real EURCHF M5, mais au lieu de Print j'ai dessiné des barres horizontales à chacun des niveaux.

 
Ihor Herasko:

Existe-t-il un code de test pour étayer cette affirmation ? Je n'ai pas remarqué cela chez moi. Lorsque nous changeons de TF, nous attendons simplement que l'historique soit échangé et nous travaillons.


C'est une affirmation trop forte. Dans certains cas, c'est possible, mais c'est à cela que servent les codes d'erreur. Si vous ne les vérifiez pas, vous ne saurez jamais si vous pouvez utiliser le résultat obtenu.


Je dirai même plus : presque tous les programmes ne tiennent pas compte d'un élément. C'est pourquoi leurs nouvelles versions sont publiées. Dès qu'un produit n'est plus pris en charge, il est impossible de l'utiliser.

Voici le code, mettez-le et vérifiez-le. Je n'ai pas d'allumette sur chaque bougie. Alpari real EURCHF M5.

double close_H1,close_M5,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    close_M5 = Close[1];
    
    if(close_H1 != close_M5)
      Print(close_H1, " H1 != M5 ", close_M5);
    if(close_M1 != close_M5)
      Print(close_M1, " M1 != M5 ", close_M5);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\n"
            );
         
  }       
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/

 
Mikhail Nazarenko:
iClose : zéro - erreur. La fonction ne signale pas d'erreur. Produit une valeur qui est actuellement obsolète.

Si vous suspectez des erreurs dans les fonctions iXXXXXXX, utilisez les fonctions SymbolInfoXXXXXX.