Erreurs, bugs, questions - page 437

 
voix_kas:

Je l'ai en quelque sorte cuisiné. Toute critique est la bienvenue.

Puisque ce sera probablement un expert, alors.. :

    bool   SetSymbols(string);

и :

CSymbolList slMain;

int OnInit()
  {
   if(!slMain.SetSymbols(inWorkSymbols)) return(-1);
   for (int i = 0; i < slMain.GetSymbolCount(); i++)
      Print(slMain.GetSymbolName(i));
//--- ok
   return(0);
  }
 
MetaDriver:
Je parie que c'est garanti. En tout cas, je compte dessus tout le temps, et le problème ne s'est jamais posé.

Je vois. Bref, c'est un moment délicat.

oncleVic

C'est vrai. Mais dans mon cas, c'est redondant :

#include <CSymbolList.mqh>

input int    inTimeToRescan = 3600; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты

CSymbolList slMain;

int OnInit() {
  slMain.SetSymbols(inWorkSymbols);
  return 0;
}

void OnTick() {
  static long LastScan = 0;
  if (!slMain.GetSymbolCount() || ((long)TimeCurrent() - LastScan >= inTimeToRescan)) {
    Comment("Идентификация рабочих инструментов...");
    slMain.SetSymbols(inWorkSymbols);
    LastScan = (long)TimeCurrent();
    return;
  }

  static string Information;
  Information = TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS);

  for (int i = 0; i < slMain.GetSymbolCount(); i++) {
    if (!SymbolSelect(slMain.GetSymbolName(i), true) || !SymbolIsSynchronized(slMain.GetSymbolName(i))) continue;
    //
    StringConcatenate(Information, Information, "\n", slMain.GetSymbolName(i));
  }
  Comment(Information);
}

Comme vous pouvez le voir, s'il y a une erreur dans les outils du dernier cycle dans OnTick, il n'y aura pas d'itération.

 
voix_kas:

Je vois. Bref, c'est un moment délicat.

oncleVic

C'est vrai. Mais dans mon cas, c'est redondant :

Comme vous pouvez le voir, s'il y a une erreur dans les outils au cours du dernier cycle, il n'y aura pas une seule itération dans OnTick.

Je n'insiste pas. C'est juste que vérifier le résultat de l'exécution est la bonne chose à faire.

 
uncleVic:

Je n'insiste pas. Vérifier le résultat de l'exécution est la bonne chose à faire.

Je vois. En tout cas, merci pour le conseil.
 

J'ai découvert cette astuce. Si je lance ce script, il se "bloque".

void OnStart()
  {
   Print("Start  ",TimeLocal());
   Sleep(-1000*2764799);
   Print("Finish ",TimeLocal());
  }

Mais si ces trois lignes (code) sont d'abord insérées dans la fonction OnInit() du conseiller expert et que l'on exécute ce conseiller expert en mode test, le résultat sera le suivant :

NS 0 Core 2 14:23:49 2011.01.03 00:00:00   Ye00-01-2Event5.mq5 OnInit: терминал (470), разрешение на торговлю (true), TERMINAL_MAXBARS=10000000, компилятор (470)
PD 0 Core 2 14:23:49 2011.01.03 00:00:00   Start  2011.01.03 00:00:00
NP 0 Core 2 14:24:18 2011.01.20 17:02:48   Finish 2011.01.20 17:02:48
II 0 Core 2 14:24:18 2011.01.20 17:02:48   MisFunciones.mqh FileInit: Поиск bin-файла Y.bin

D'abord, le code fonctionne en quelque sorte en mode test.

Deuxièmement, (plus important), l'histoire des premiers jours d'essais se perd. Ainsi, dans l'exemple ci-dessus, le test a été commencé le 2011.01.03 (comme on peut le voir sur les deux premières lignes), mais le testeur a immédiatement fait un saut en avant de 17 jours après le traitement du code (dans ce cas, il s'agit d'une ligne 2-3), et le test est poursuivi sans tenir compte de ces 17 jours.

 
Vous venez d'attraper un débordement arithmétique dans le...
 Sleep(-1000*2764799);
ce qui entraîne une période d'attente de 17,5 jours.
 
Renat:
Vous venez d'attraper un dépassement arithmétique dans
et vous attendez depuis 17,5 jours.
Oui, et ça marche dans le testeur parce qu'il ignore Sleep.
 
Renat:
Vous avez attrapé un débordement arithmétique dans
en conséquence, vous avez 17,5 jours d'attente.

Je ne discute pas de la question du "dépassement de capacité" car je ne sais pas :) La question est de savoir si une telle situation doit être supprimée par le compilateur ou le testeur avec une sortie d'erreur critique (ou d'une autre manière). Tout le monde ne sera pas méticuleux quant au fonctionnement de ses programmes en l'absence d'avertissements du terminal.

Le problème est également visible dans le fait que le code est placé dans les premières lignes de OnInit() (c'est-à-dire avant que toute donnée historique ne soit téléchargée) - mais pour une raison quelconque, les données des 17,5 premiers jours sont perdues.

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5
 
joo:
Oui, et cela fonctionne dans le testeur parce que Sleep y est ignoré.
Etes-vous sûr que Sleep() est ignoré ? - Regardez la différence d'heure terminale entre les lignes 2 et 3.
 
Yedelkin:
Etes-vous sûr que Sleep() est ignoré ? - Regardez la différence de temps terminal entre les lignes 2 et 3.
Peut-être que la simple présence de Sleep (par rapport à son absence) dans le code affecte d'une manière ou d'une autre le temps d'exécution total, mais le fait que Sleep ne soit pas compté dans le testeur est certain.
Raison: