Ce que RefreshRates() met à jour - page 4

 
Mikhail Nazarenko:
Ok, merci à tous les développeurs pour leur attention, je vais créer des béquilles comme NewBar)))) Sujet fermé.

Vous n'avez pas besoin de les créer. Je vous ai donné une fonction entièrement fonctionnelle. Utilisez-le.

 

Voici une nouvelle heure...


Les valeurs sont une seule et même chose...

 
Mikhail Nazarenko:

Non, mieux _Période. Car nous attendrons forcément la cotation zéro de H1, alors que la période actuelle est correctement mise à jour. Il est nécessaire d'obtenir les données aux premières secondes de l'heure, et non lors de la mise à jour de l'heure.

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);

//...

Je veux ajouter à l'exemple et vérifier


Je ne comprends pas pourquoi vous vous attendez à voir le même prix de clôture dans des barres complètement différentes?

Lorsqu'il y a une nouvelle barre sur M5, sur M1 il y a aussi une nouvelle barre, mais sur H1, il n'y aura une nouvelle barre que dans un cas sur 12 et dans les 11 autres il n'y aura pas de barre.

 
PapaYozh:

Je ne comprends pas pourquoi. vous vous attendez à voir le même prix de clôture sur des barres complètement différentes?


J'ai remarqué ça aussi, je pensais m'être trompé.

 

Apparemment, je n'explique pas très bien le problème, désolé. J'ai écrit et testé les béquilles promises. Je l'ai écrit ici car il devrait être implémenté dans le code de MQL4. Si vous êtes intéressé, prenez-le. Le sujet est maintenant clos.

//Функция отслеживания появления обновленных котировок по таймфрейму, где max_tf таймфрейм +1 до которого включительно будет требоваться обновление
bool isRefresh(int max_tf = 0,int min_sleep = 1000){
   
   //Массив с таймфреймами
   int tf[9] = {1,5,15,30,60,240,1440,10080,43200};
   
   //Если максимальное 0 то текущее значение
   max_tf = (max_tf <= 0) ? _Period : max_tf;
   
   //Текущее время
   datetime period,tc = TimeCurrent();
   
   for(int i = 0; i < 9; i++){
         
      period = tf[i]*60;
      
      if(iTime(_Symbol,tf[i],1) != (int(tc/period)-1)*period){
         Sleep(min_sleep);
         return false;   
      }
      if(max_tf < tf[i])//Если таймфрейм больше максимального и тоже обновлен то выходим
         break;
   }
   Sleep(min_sleep);
   RefreshRates();
   
   return true;
}
 
Mikhail Nazarenko:

Apparemment, je n'explique pas très bien le problème, désolé. J'ai écrit et testé les béquilles promises. Je l'ai écrit ici car il devrait être implémenté dans le code de MQL4. Si vous êtes intéressé, prenez-le. Le sujet est maintenant clos.

1. Peut-être, oui.

2. Pourquoi dormir une seconde avant de retourner d'une fonction si cela n'a aucun effet sur le résultat retourné ?

 

Pour que les chandeliers d'autres périodes/symboles soient générés à temps, ils doivent être constamment "tirés", sinon le MT les met à jour "au fur et à mesure".
C'est un truisme, il a été discuté de nombreuses fois sur le forum).

Si votre code fonctionne avec une minuterie et n'accède aux cotations pour d'autres horizons temporels qu'une fois par heure (ou une fois par jour), vous devez créer une fonction distincte pour la mise à jour. Ou attendez quelques secondes après la prochaine demande.

 
PapaYozh:

1. Apparemment, oui.

2. Pourquoi dormir une seconde avant de retourner d'une fonction, si le résultat retourné n'est pas affecté de quelque manière que ce soit ?

C'est une question d'expérience. Si vous ne me croyez pas, refaites-le et ne dormez pas). Tout cela est volontaire.

 

C'est ***there dans sa forme la plus pure.

Pourquoi dormir dans une fonction quand on peut en revenir et faire quelque chose d'utile ?

 
PapaYozh:

C'est ***there dans sa forme la plus pure.

Pourquoi dormir dans une fonction quand on peut en revenir et faire quelque chose d'utile ?

C'est du ***t pur et simple. Dites-moi ce que vous n'avez pas compris dans ma réponse précédente ? Encore une fois. Ne dormez pas et faites quelque chose d'utile.))

Raison: