Bogue MQL5 lors du travail avec l'accès aux séries chronologiques iClose/iOpen, etc. - page 5

 
Renat Fatkhullin:

Veuillez me montrer le code de référence de l'indicateur, qui conserve toujours les 2000 derniers ticks de chaque symbole de Market Watch.

Sinon, vous obtenez des suppositions d'un côté et seulement des recommandations sous forme de mots de l'autre côté.

 
Renat Fatkhullin:

Je dois regarder le code.

Le code ci-dessus a clairement un tas de problèmes de logique et de ressources.

Je suis en train de faire quelque chose comme ça, s'il vous plaît, conseillez moi comment et ce qu'il faut modifier si nécessaire :

bool flag = true;

//+————————————————————————————————————————————————————————————————————————————+
int OnInit ()
{
  /*
  тут определены и настроены буферы
  */
  

  flag = true;

  //---
  return (INIT_SUCCEEDED);
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
void OnDeinit (const int reason)
{
  //--- destroy timer
  EventKillTimer ();
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
int OnCalculate (const int       rates_total,
                 const int       prev_calculated,
                 const datetime &time        [],
                 const double   &open        [],
                 const double   &high        [],
                 const double   &low         [],
                 const double   &close       [],
                 const long     &tick_volume [],
                 const long     &volume      [],
                 const int      &spread      [])
{
  //Print ("---");
  //Print (rates_total, " ", prev_calculated);
  //Print ("---");

  if (flag)
  {
    if (SeriesInfoInteger (Symbol (), Period (), SERIES_SYNCHRONIZED))
    {
      Print ("1 История синхронизирована");
      int bars = Bars (Symbol (), Period ());
      Print ("Баров в истории ", bars);


      MqlTick ticks_array [];

      datetime from = TimeByNumberOfCandles (Symbol (), PERIOD_M1, ParentCandles_P);
      MqlDateTime sdt;
      ulong from_msc = ((ulong)from) * 1000;

      ResetLastError ();
      int count = CopyTicksRange (Symbol (), ticks_array, COPY_TICKS_INFO, from_msc); //, to_msc);
      Print ("Скопировано ", count, " тиков");

      int error = GetLastError ();
      Print (error);

      if (count <= 0 || error != 0)
      {
        Print ("Ошибка при получении данных");
        return (rates_total);
      }

      Print (ticks_array [0].time_msc, " ", ticks_array [count - 1].time_msc); // 0-й самый старый

      for (int i = 0; i < count; i++)
      {
        // тут вычисления и операции с тиками
      }

      /*
      тут заполнение индикаторных буферов значениями полученными после работы с тиками
      */
      }
      
      flag = false;
    }
    else
    {
      Print ("2 История НЕ синхронизирована!");
      return (rates_total);
    }
  }


  return (rates_total);
}
//+————————————————————————————————————————————————————————————————————————————+
 
Renat Fatkhullin:

Je dois regarder le code.

Le code ci-dessus a clairement un tas de problèmes de logique et de ressources.

Y a-t-il un problème de logique dans ce code, ou est-ce que je rate quelque chose ?

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

MQL5 Bug dans l'accès aux séries chronologiques iClose/iOpen, etc.

Stanislav Dray, 2018.11.14 16:28

Votre attitude à l'égard des rapports de bogue est étrange. Ce n'est pas comme si j'étais payé pour prouver quoi que ce soit. J'ai exposé la situation du mieux que j'ai pu.

Je ne suis pas le seul à avoir ce problème, le problème est apparu après votre 30ème mise à jour, mais vous insinuez quand même que je suis un imbécile et que je blâme certains indicateurs retardés.

N'étaient-ils pas au ralenti pendant un an avant ça ?

Voici un exemple de code qui se bloque 25 minutes après le démarrage sur M30 :

//+------------------------------------------------------------------+
//|                                                      Feezzzz.mq5 |
//|                                   Copyright 2018, Dray Stanislav |
//|                               https://www.mql5.com/ru/users/fan9 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Dray Stanislav"
#property link      "https://www.mql5.com/ru/users/fan9"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    datetime CM1_T[1];
    if(CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T)==-1){
      Comment("\n\n CopyTime return -1");
      return;
    }
    Comment("\n\n CopyTime : "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
  }
//+------------------------------------------------------------------+

 
Renat Fatkhullin:

Vous devez rédiger l'indicateur en sachant clairement que vous ne recevrez pas tout en même temps.

Dans OnInit vous devez stimuler le chargement de l'historique des instruments nécessaires par des appels uniques de CopyXXX, mais vous devez attendre l'initialisation complète dans OnCalculate.

Votre phase d'initialisation semble comporter une erreur - vous attendez des données de manière incorrecte et vous bloquez.

Je vais essayer de le faire,

Maintenant je fais des requêtes à OnCalculate et j'attends là (pas à chaque tick bien sûr, mais seulement la première fois du calcul).

 
fxsaber:

Veuillez me montrer le code de référence de l'indicateur, qui conserve toujours les 2000 derniers ticks de chaque symbole de Market Watch.

Je ne sais pas comment l'utiliser, mais je suis sûr que j'ai le droit de l'utiliser.

Je suis d'accord ! C'est mieux non pas pour les tiques, mais pour les barres.

Vous avez besoin d'un exemple d'un véritable code multidevise approuvé.

Sinon, nous resterons dans l'obscurité...

 

Je vais essayer de localiser l'erreur et faire un rapport dès que je la trouve.

 
transcendreamer:

Je suis d'accord ! Mieux vaut ne pas avoir de tiques mais des barres.

Nous avons besoin d'un exemple d'un véritable code multidevise approuvé.

Sinon, nous serons toujours dans le noir...

Les barres et les tics sont des épistases différentes vivant dans MT5 indépendamment.
 
Vladimir Karputov:

Il a également toujours été recommandé, si vous travaillez avec le cadre temporel de quelqu'un d'autre, d'obtenir l'OHLC de ce cadre temporel une fois par minute (n'importe quelle fonction CopyXXXX). Cela a toujours été le cas.

Je voulais déjà cracher sur tout ce qui se passe ici, mais malheureusement j'ai passé environ 10 ans sur le produit MQ.

Maintenant, c'est le business. Vladimir, votre conseil sur l'utilisation des fonctions CopyXXXX a été utilisé par moi, car il n'y avait aucune difficulté du point de vue de mon code écrit de manière non professionnelle.

Honnêtement je voulais que le problème soit seulement dans mes mains croches, mais non le problème n'est pas seulement dans elles. J'ai une capture d'écran ci-dessous, anticipant des explications étranges du support technique disant que j'ai codé incorrectement et 100500 autres indicateurs, donc que voulez-vous, il y aura des problèmes. Je n'ai pas 100500 autres indicateurs, il n'y a pas d'expert, je n'ai que deux outils ouverts dans le terminal, le test de l'indicateur fonctionne sur EURUSD 1M, l'indicateur appelle les données du timeframe M15 du même outil, je n'essaie pas de charger les données d'autres symboles, il n'y en a que peu dans la revue de marché.

C'est une situation idéale pour le terminal en termes de chargement, ce qui bien sûr ne sera pas le cas en fonctionnement normal, mais même dans ce cas il y a un problème et à mon avis ce problème s'appelle "BAG".

Dans l'indicateur, les fonctions iClose et iBars sont appelées uniquement pour refléter l'état dans Commet(). Dans l'aperçu du marché au moment de la création de la capture d'écran, l'état actuel de l'appel des fonctions iClose et iBars se trouve dans la fenêtre du terminal, de plus la partie de calcul de l'indicateur utilise la fonction CopyXXXX.

SAC

Comme vous pouvez le voir, l'indicateur a été rechargé à 16:31 et a fonctionné avec succès (j'étais même heureux), mais la mise à jour des données iClose s'est arrêtée après 00:15, respectivement la fonction CopyXXXX ne renvoie pas non plus de données mises à jour, c'est-à-dire que l'erreur se produit quelque part dans les profondeurs de MT.

À mon avis, il ya un échec lors de la lecture des données du serveur, les raisons peuvent être de masse (pas d'Internet, le serveur était occupé, etc), mais pourquoi la reprise du travail après avoir éliminé les causes de la communication ne se produit pas, donc je conclus que vous pouvez tester le code source des utilisateurs autant que vous voulez, mais si vous avez un serveur à côté, ce problème vous ne serez jamais identifier, et il existe et il ne se produit pas seulement à cause de la mauvaise main codeur.

 

J'ai aussi décidé de tester le code de Stanislav hier. Après quelques heures, la mise à jour du temps s'est arrêtée. Je n'ai pas changé d'horizon temporel, je l'ai juste mis à jour via le menu contextuel du graphique et le temps a continué.

Aujourd'hui, j'ai modifié un peu le code pour voir l'heure et le cadre temporel actuel.

void OnTick()
{
 datetime CM1_T[1];
 datetime CM2_T[1];
 CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T);
 CopyTime(_Symbol,PERIOD_CURRENT,0,1,CM2_T);
 Comment("CopyTime PERIOD_CURRENT: "+TimeToString(CM2_T[0],TIME_DATE | TIME_SECONDS)+"\nCopyTime PERIOD_M1: "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
}

En 15 minutes, il a cessé de se mettre à jour dans l'intervalle de temps "non natif", mais dans l'intervalle de temps actuel, il se mettait à jour normalement. Après avoir rafraîchi le graphique, le temps est reparti.

Le terminal fonctionne en mode portable. Le système et le terminal lui-même sont situés sur un disque SSD.


 

Je ne sais pas ce qui s'est passé, mais lorsque j'ai écrit le bot pour le dernier championnat MQ en MQL5, il était multidevises et je n'ai pas remarqué de problèmes avec le chargement de données provenant d'autres instruments.

Il a peut-être consommé beaucoup de ressources, mais il a donné le résultat escompté, et non un jeu de roulette comme maintenant.

Ce problème, par exemple en tant que développeur de produits commerciaux pour MQL5, ne me caractérisera pas d'une très bonne manière et il sera doublement désagréable si une personne paie pour un produit acheté sur le marché et qu'il semble juste glitchy à cause de ces "BOGS".