Errores, fallos, preguntas - página 437

 
voix_kas:

Lo he cocinado un poco. Las críticas son bienvenidas.

Como probablemente va a ser un experto, entonces:

    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:
Apuesto a que está garantizado. Al menos yo cuento con ella siempre, y nunca ha surgido el problema.

Ya veo. De todos modos, es un momento delicado.

tíoVic

Es cierto. Pero en mi caso es redundante:

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

Como puede ver, si hay un error en las herramientas en el último ciclo en OnTick, no habrá iteración.

 
voix_kas:

Ya veo. De todos modos, es un momento delicado.

tíoVic

Es cierto. Pero en mi caso es redundante:

Como puedes ver, si hay un error en las herramientas en el último ciclo, no habrá ni una sola iteración en OnTick.

No insisto. Lo que hay que hacer es comprobar el resultado de la ejecución.

 
uncleVic:

No estoy presionando. Lo correcto es comprobar el resultado de la ejecución.

Ya veo. De todos modos, gracias por el consejo.
 

He descubierto este truco. Si ejecuto este script, se "cuelga".

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

Pero si estas tres líneas (código) se insertan primero en la función OnInit() del Asesor Experto y se ejecuta dicho Asesor Experto en modo de prueba, el resultado será el siguiente:

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

En primer lugar, el código funciona de alguna manera en modo de prueba.

En segundo lugar, (más importante), la historia de los primeros días de pruebas se pierde. Así, en el ejemplo anterior, la prueba se inició en 2011.01.03 (como se puede ver en las dos primeras líneas), pero el probador saltó inmediatamente hacia adelante por 17 días después del procesamiento del código (en este caso se trata de una línea 2-3), y la prueba se continúa sin tener en cuenta estos 17 días.

 
Acabas de coger un desbordamiento aritmético en el
 Sleep(-1000*2764799);
lo que supone un periodo de espera de 17,5 días.
 
Renat:
Acaba de detectar un desbordamiento aritmético en
y lleva 17,5 días esperando.
Sí, y funciona en el probador porque ignora el sueño.
 
Renat:
Ha detectado un desbordamiento aritmético en
como resultado tiene una espera de 17,5 días.

No estoy discutiendo sobre el "desbordamiento de la captura" porque no lo sé :) La cuestión es que tal situación debe ser suprimida por un compilador o un probador con una salida de error crítico (o de alguna otra manera). No todo el mundo será meticuloso con el funcionamiento de sus programas en ausencia de avisos del terminal.

El problema también se ve en el hecho de que el código se coloca en las primeras líneas de OnInit() (es decir, antes de que se descarguen los datos históricos) - pero por alguna razón, los datos de los primeros 17,5 días se pierden.

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5
 
joo:
Sí, y funciona en el probador porque el sueño se ignora en él.
¿Estás tan seguro de que Sleep() se ignora? - Fíjate en la diferencia de tiempo del terminal entre las líneas 2 y 3.
 
Yedelkin:
¿Estás tan seguro de que Sleep() se ignora? - Fíjate en la diferencia de tiempo de terminal entre las líneas 2 y 3.
Tal vez la mera presencia de Sleep (en comparación con su ausencia) en el código afecta de alguna manera el tiempo de ejecución global, pero el hecho de que Sleep no se cuenta en el probador es seguro.