Ошибки, баги, вопросы - страница 437

 
voix_kas:

Вроде как сварганил. Критика приветствуется.

Поскольку, речь видимо будет идти об экперте, то:

    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:
Ставлю на то, что гарантируется. По крайней мере я постоянно на это расчитываю, и проблемы ни разу не возникло.

Ясно. В любом случае, момент щекотливый.

uncleVic

Так-то оно так. Но в моем случае это избыточно: 

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

Как видите, при ошибке в инструментах в последнем цикле в ОнТик ниодной итерации не будет. 

 
voix_kas:

Ясно. В любом случае, момент щекотливый.

uncleVic

Так-то оно так. Но в моем случае это избыточно: 

Как видите, при ошибке в инструментах в последнем цикле в ОнТик ниодной итерации не будет. 

Да я не настаиваю. Просто проверить результат выполнения - это правильно.

 
uncleVic:

Да я не настаиваю. Просто проверить результат выполнения - это правильно.

Ясно. В любом случае, благодарю за совет.
 

Обнаружил такую фишку. Если запустить вот этот скрипт, то он "подвисает".

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

 Но если эти же три строчки (код) вставить первыми в функцию OnInit() у эксперта, и запустить такой эксперт в режиме тестирования, то получается примерно следующее:

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

Во-первых, код каким-то образом срабатывает в режиме тестирования.

Во-вторых, (что более важно), теряется история  первых нескольких дней тестирования. Так, в приведённом выше примере тестирование было задано с даты 2011.01.03 (что видно по первым двум строчкам), но после обработки кода (в данном случае  это строчки 2-3) тестер сразу перескакивает  на 17 дней вперёд, и далее тестирование идёт без учёта этих 17-ти дней.

 
Вы же банально словили арифметическое переполнение в
 Sleep(-1000*2764799);
в результате устроили себе ожидание на 17.5 дней.
 
Renat:
Вы же банально словили арифметическое переполнение в
в результате устроили себе ожидание на 17.5 дней.
ага, а в тестере работает, потому что в нем Sleep игнорируется.
 
Renat:
Вы же банально словили арифметическое переполнение в
в результате устроили себе ожидание на 17.5 дней.

 Да я не спорю про "словили переполнение", потому что не знаю :) Вопрос в том, что такую ситуацию желательно пресекать либо компилятором, либо тестером с выдачей критической ошибки (или иным способом). Не все же будут дотошно разбираться, как работают их программы при отсутствии предупреждений со стороны терминала.

Проблему также вижу в том, что код выставляется в OnInit() первыми строчками (т.е. до закачки любых исторических данных) - но почему-то данные первых 17,5 дней теряются. 

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5
 
joo:
ага, а в тестере работает, потому что в нем Sleep игнорируется.
Вы так уверены, что Sleep() игнорируется? - Посмотрите на разницу во времени терминала между 2-ой и 3-ей строчками.
 
Yedelkin:
Вы так уверены, что Sleep() игнорируется? - Посмотрите на разницу во времени терминала между 2-ой и 3-ей строчками.
возможно само присутствие Sleep (по сравнению с его отсутствием) в коде как то сказывается на общем времени выполнения, но то, что Sleep не считается в тестере - это точно.
Причина обращения: