Ce que RefreshRates() met à jour - page 7

 
Mikhail Nazarenko:

Merci, c'est parfait. Le terminal affiche-t-il vraiment une erreur 4066 après avoir accédé à une série chronologique non mise à jour via iTime ? J'ai rencontré iClose donnant des informations non mises à jour au lieu de zéro.

C'est ça le truc, c'est le point clé qui cause votre problème.

Erreur 4066 - quand il n'y a pas d'historique pour ce TF, il n'est pas prêt, vous devez contacter le serveur.

Et lorsque vous l'avez déjà, mais qu'il est mis à jour uniquement lorsque vous y accédez, c'est-à-dire qu'il ne donne pas d'erreur, il vous donne simplement ce qui est maintenant, et simultanément à la demande commence à mettre à jour la série chronologique.

Si vous y accédez peu et de manière irrégulière, vous obtenez parfois de vieilles choses. Si vous demandez chaque TF nécessaire régulièrement, jusqu'à chaque coche - alors tout est OK.

Si le graphique de cette TF est ouvert, elle est régulièrement mise à jour sur le graphique. A propos, il est probablement possible d'ouvrir les graphiques de toutes les TF nécessaires à partir des EA, si l'accès n'est pas régulier, mais ce n'est pas fiable, car ils peuvent fermer/changer les TF manuellement.

 
Evgeniy Chumakov:


Pourquoi ajouter 0 à [i + 0] ?

au lieu de zéro, j'ai substitué 1 et 2, 1 ou 2. J'ai laissé 0, c'est-à-dire 1 bar. Je n'ai pas nettoyé le code, ce n'est pas important pour la logique.

 
Aleksey Mavrin:

C'est ça le problème, c'est le point clé qui fait que tu es bloqué.

L'erreur 4066 se produit lorsqu'il n'y a pas d'historique pour cette TF, elle n'est pas prête, vous devez contacter le serveur.

Et lorsque vous l'avez déjà, mais qu'il est mis à jour uniquement lorsque vous y accédez, c'est-à-dire qu'il ne donne pas d'erreur, mais vous donne simplement ce qui est maintenant, et simultanément avec la demande commence à mettre à jour la série chronologique.

Si vous y accédez rarement et irrégulièrement, vous obtenez parfois de vieilles choses. Si vous demandez chaque TF nécessaire régulièrement, jusqu'à chaque coche - alors tout est OK.

Si le graphique de cette TF est ouvert, elle est régulièrement mise à jour sur le graphique. A propos, il est probablement possible d'ouvrir les graphiques de toutes les TF nécessaires à partir des EA, si l'accès n'est pas régulier, mais ce n'est pas fiable, car ils peuvent fermer/changer les TF manuellement.

Lorsqu'il y a une erreur, il renvoie les anciennes données, c'est génial. C'est l'une des raisons pour lesquelles les courtiers aiment MT4 et ne passent pas à MT5)).

C'est à dire demander le bon délai à chaque tick ou sleep, jusqu'à l'erreur 4066. Est-ce que j'ai bien compris ?

 
Mikhail Nazarenko:

Lorsqu'il y a une erreur, il renvoie les anciennes données, c'est génial. C'est l'une des raisons pour lesquelles les courtiers aiment MT4 et ne passent pas à MT5)).

C'est à dire demander le bon délai à chaque tick ou sleep, jusqu'à l'erreur 4066. Est-ce que j'ai bien compris ?

Presque. Voici une fonction prête à l'emploi :

bool IsTFDataReady(ENUM_TIMEFRAMES eTF)
{
   ResetLastError();
   iTime(NULL, eTF, 1);
   return GetLastError() == ERR_NO_ERROR;
}
Insérez-le dans OnTick() et, s'il renvoie vrai, le cadre temporel eTF est accessible, les données sont valides.
 
Mikhail Nazarenko:

Lorsqu'il y a une erreur, il renvoie les anciennes données, c'est génial. C'est l'une des raisons pour lesquelles les courtiers aiment MT4 et ne passent pas à MT5)).

C'est à dire demander le bon délai à chaque tick ou sleep, jusqu'à l'erreur 4066. Est-ce que j'ai bien compris ?

Bien sûr, il est préférable d'utiliser sleep uniquement dans OnInit, et il n'est nécessaire que dans les indicateurs. Dans d'autres cas, OnTick, comme Igor l'a mentionné ci-dessus, est suffisant.

En fonction de la tâche à accomplir, vous pouvez manœuvrer pour trouver la meilleure option. En général, lorsqu'on vérifie s'il y a une nouvelle barre, on accède déjà à iTime à chaque tick pour toutes les échéances utilisées, ce qui est suffisant pour les maintenir à jour.

s.w. Et si vous utilisez la fonction d'Igor non pas à chaque tick, mais dans certaines conditions rares, il y aura également un décalage.
Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
В чем различия между тремя режимами тестирования в MetaTrader 5 и на что обратить внимание? Как происходит тестирование эксперта, торгующего одновременно на нескольких инструментах? Когда и как вычисляются значения индикаторов при тестировании и как обрабатываются события? Как синхронизировать бары с разных инструментов при тестировании в режиме "Только цены открытия"? Статья призвана дать ответы на эти и многие другие вопросы.
 
Aleksey Mavrin:

sleep n'est mieux utilisé que dans OnInit, bien sûr, et il n'est nécessaire que dans les indicateurs. Dans d'autres cas, il suffit d'utiliser OnTick, comme Igor l'a mentionné plus haut.

En fonction de la tâche à accomplir, vous pouvez manœuvrer pour trouver la meilleure option. Habituellement, lorsque nous vérifions s'il y a une nouvelle barre, nous accédons à iTime à chaque tick pour toutes les échéances utilisées, ce qui est suffisant pour les maintenir à jour.

s.e. Et si la fonction d'Igor n'est pas utilisée à chaque tick, mais dans certaines conditions rares, elle sera également désynchronisée.

Le sommeil ne fonctionne pas dans les indicateurs

 
Ihor Herasko:

Presque. Voici une fonction toute prête :

Insérez-le dans OnTick() et s'il retourne vrai, vous pouvez accéder au cadre temporel eTF, les données sont valides.

C'est brillamment simple. Merci. Pourquoi les développeurs ne décrivent-ils pas cela dans le manuel sur les fonctions iClose, etc.ou ne corrigent-ils pas la logique des mises à jour des cotations MT4 afin de ne pas créer de théories de la conspiration ?

 
Mikhail Nazarenko:

Lorsqu'il y a une erreur, il renvoie les anciennes données, c'est génial. C'est l'une des raisons pour lesquelles les courtiers aiment MT4 et ne passent pas à MT5)).

C'est à dire demander le bon délai à chaque tick ou sleep, jusqu'à l'erreur 4066. Est-ce que j'ai bien compris ?

Dans MT5, c'est beaucoup plus difficile.

Dans F4, il suffit de demander iTime à toutes les TF utilisées toutes les 2 minutes, et toutes les données seront réelles.

 
Mikhail Nazarenko:

Tout est brillamment simple. Merci. Pourquoi les développeurs ne décrivent-ils pas cela dans le manuel sur les fonctions iClose, etc.ou ne corrigent-ils pas la logique des mises à jour des cotations MT4 afin de ne pas créer de théories de la conspiration ?

Parce que presque tous les EAs vérifient les bonnes conditions à chaque tick et tout se met à jour tout seul.

 
Vitaly Muzichenko:

Le sommeil ne fonctionne pas dans les indicateurs

Cela fonctionne si vous en avez vraiment besoin :)

void SleepA(int msec)
 {
   uint now=GetTickCount();
   while (GetTickCount()<(now+msec))
      {
      for(int i=0;i<10000;i++)
         {
          double f=1;
          f*=f;
          f+=f;
         }
       }
   return;
 }  
Andrey Khatimlianskii:

Dans MT5, c'est beaucoup plus compliqué.

En 4, il suffit de demander iTime à toutes les TF utilisées toutes les 2 minutes, et toutes les données seront réelles.

Exactement