Ce que RefreshRates() met à jour - page 3

 
Artyom Trishkin:

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

Peut un exemple de remplacement de iXXXXX par SymbolInfoXXXXXX.

 
Mikhail Nazarenko:

Mon code est similaire. Erreur dans OnTick

il devrait l'être

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.

J'ai vérifié sur Alpari real EURCHF M5 seulement au lieu de Print j'ai dessiné des barres horizontales à chacun des niveaux.

Oui, j'ai d'abord présenté H1 de cette façon, mais j'ai ensuite décidé que ce serait trop rare comme comparaison. Alors je l'ai changé en M5.

Mikhail Nazarenko:

Je me permets de vous donner un exemple de remplacement de iXXXXXXX par SymbolInfoXXXXXX.

Artyom a fait une petite erreur...

Au lieu de iClose, vous pouvez utiliser

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   int              start_pos,         // откуда начнем  
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
   );

quelque chose comme ceci

double close_M5[];
    CopyClose(_Symbol, PERIOD_M5, 1, 1, close_M5);

De cette façon, vous pouvez obtenir les valeurs de plusieurs barres en un coup de baguette magique.

La fonction renvoie vrai ou faux, mais je ne l'ai pas vérifié dans cet exemple. Vous pouvez le deviner vous-même...

 
Alexey Viktorov:
Oui, c'est comme ça que j'ai d'abord mis H1, mais ensuite j'ai décidé que ce serait des comparaisons trop rares. Alors je l'ai changé en M5.

J'ai terminé votre code ici et l'ai posté ci-dessus. J'ai mis votre version dans la mienne et le résultat est le même. Il y a un décalage sur presque toutes les bougies M5. Quels sont vos résultats ?

 
Mikhail Nazarenko:

J'ai terminé votre code ici et l'ai posté ci-dessus. J'ai mis votre version dans la mienne et le résultat est le même. Il y a un décalage sur presque toutes les bougies M5. Quels sont vos résultats ?

Ici, nous devons changer

if(NewBar(PERIOD_M5))

à

if(NewBar(PERIOD_H1))
 
Alexey Viktorov:

Ici, nous devons changer

à

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. Les données doivent être reçues aux premières secondes de l'heure, et non lors de la mise à jour de l'heure.

Je veux compléter l'exemple et vérifier
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);
    
    double ARRAY_M1[];
    CopyClose(_Symbol, PERIOD_M1, 1, 1, ARRAY_M1);
    double ARRAY_H1[];
    CopyClose(_Symbol, PERIOD_H1, 1, 1, ARRAY_H1);
    
    if(ARRAY_H1[0] != close_M5)
      Print(ARRAY_H1[0], " CopyClose H1 != M5 ", close_M5);
    if(ARRAY_M1[0] != close_M5)
      Print(ARRAY_M1[0], " CopyClose M1 != M5 ", close_M5);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\n",
               ARRAY_H1[0], " CopyCloseH1\n",
               ARRAY_M1[0], " CopyCloseM1\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;
 }/******************************************************************/ 
.

 
Alexey Viktorov:

Ici, nous devons changer

à

Le résultat est le même qu'avec iClose(); iClose et CopyClose semblent prendre les données au même endroit.

Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
  • www.mql5.com
iClose - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mikhail Nazarenko:

Non, mieux _Period. Car nous attendrons forcément la cotation zéro de H1, alors que la période actuelle est correctement mise à jour. Les données doivent être reçues aux premières secondes de l'heure, et non lors de la mise à jour de l'heure.

Je veux ajouter à l'exemple et vérifier

Il semble que vous ne compreniez pas du tout comment fonctionne la fonction d'apparition de nouvelles barres.

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;
 }/******************************************************************/ 

Et par conséquent.

Mikhail Nazarenko:

Le résultat est le même que lorsque iClose(); iClose et CopyClose semblent prendre les données au même endroit.

Lors de la réception de valeurs de fermeture de barres et d'autres de l'OHLC, lorsqu'une nouvelle valeur TIKA est reçue, il n'y a toujours aucun problème.
 
Alexey Viktorov:

Vous ne semblez pas du tout comprendre comment fonctionne la nouvelle fonction de barre.

Et par conséquent.

Lorsque je reçois des valeurs de clôture de barres et d'autres valeurs de l'OHLC, lorsqu'une nouvelle TIKA arrive, les valeurs sont toujours sans problème.

Répondez à la question. Pourquoi, lors d'une nouvelle bougie, la fonction iClose(1) renvoie-t-elle des informations périmées et non actualisées ou une erreur ? Il s'agit d'un bug.

 
Mikhail Nazarenko:

Répondez à la question. Pourquoi, lors d'une nouvelle bougie, la fonction iClose(1) renvoie-t-elle des informations périmées et non actualisées ou une erreur ? Il s'agit d'un bug.

Si c'est un bug, alors tout le monde, ou presque, devrait l'avoir. Si c'est seulement vous, alors c'est un problème dans le code.

J'ai mon EA sur M15 avec détermination d'une nouvelle barre H1.

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

Et voici ce que dit le commentaire.

Il n'y a pas de divergence.

 
OK, merci à tous les développeurs pour leur attention, je m'en vais créer des béquilles comme NewBar.))) Sujet fermé.