Erros, bugs, perguntas - página 437

 
voix_kas:

Mais ou menos cozinhado. As críticas são bem-vindas.

Uma vez que provavelmente vai ser um perito, então:

    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:
Aposto em que isso seja garantido. Pelo menos conto com isso a toda a hora, e o problema nunca surgiu.

De qualquer modo, é um momento delicado.

tioVic

Isso é verdade. Mas no meu caso é 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 se pode ver, se houver um erro nas ferramentas no último ciclo no OnTick, não haverá iteração.

 
voix_kas:

De qualquer modo, é um momento delicado.

tioVic

Isso é verdade. Mas no meu caso é redundante:

Como se pode ver, se houver um erro nas ferramentas no último ciclo, não haverá uma única iteração no OnTick.

Eu não insisto. É só que verificar o resultado da execução é a coisa certa a fazer.

 
uncleVic:

Não estou a forçar. A simples verificação do resultado da execução é a coisa certa a fazer.

Estou a ver. De qualquer modo, obrigado pelo conselho.
 

Descobri este truque. Se eu executar este guião, ele "fica pendurado".

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

Mas se estas três linhas (código) forem inseridas primeiro na função OnInit() do Expert Advisor e executar esse Expert Advisor em modo de teste, o resultado será o seguinte:

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

Primeiro, o código funciona de alguma forma em modo de teste.

Segundo, (mais importante), a história dos primeiros dias de testes perde-se. Assim, no exemplo acima, os testes foram iniciados em 2011.01.03 (como se pode ver nas duas primeiras linhas), mas o testador saltou imediatamente para a frente em 17 dias após o processamento do código (neste caso trata-se de uma linha 2-3), e os testes são continuados sem ter em conta estes 17 dias.

 
Acabou de apanhar um transbordamento aritmético no
 Sleep(-1000*2764799);
resultando num período de espera de 17,5 dias.
 
Renat:
Acabou de apanhar um transbordo aritmético em
e está à espera há 17,5 dias.
Sim, e funciona no testador porque ignora Dormir.
 
Renat:
Apanhou um transbordo aritmético em
como resultado, tem uma espera de 17,5 dias.

Não estou a discutir sobre "apanhado a transbordar" porque não sei :) A questão é que tal situação deve ser suprimida ou por um compilador ou um testador com um resultado de erro crítico (ou de outra forma). Nem todos serão meticulosos sobre como funcionam os seus programas na ausência de avisos do terminal.

O problema também é visto no facto de o código ser colocado nas primeiras linhas do OnInit() (isto é, antes de qualquer dado histórico ser descarregado) - mas por alguma razão, os dados dos primeiros 17,5 dias são perdidos.

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5
 
joo:
Sim, e funciona no testador porque o Sono é ignorado nele.
Tem tanta certeza de que Sleep() é ignorado? - Veja-se a diferença de tempo terminal entre as linhas 2 e 3.
 
Yedelkin:
Tem tanta certeza de que Sleep() é ignorado? - Veja-se a diferença de tempo terminal entre as linhas 2 e 3.
Talvez a mera presença de Sono (em comparação com a sua ausência) no código afecte de alguma forma o tempo total de execução, mas o facto de o Sono não ser contado no testador é certo.