Тормоза при работе с историей по множеству символов

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Navoykov
4570
Alexey Navoykov  
Столкнулся с тем, что при попытке получить информацию о таймсериях по множеству символов терминал безбожно тормозит.

Ниже привожу тестовый код советника. Там проверяется только SERIES_LASTBAR_DATE и SERIES_BARS_COUNT.  Проверку провожу на сервере Metaquotes.  Там 650 символов, и это относительно мало.  Есть брокеры, у которых по 10 тыс. символов и более.

input ENUM_TIMEFRAMES Tf = PERIOD_CURRENT;


struct THistoryInfo
{
  string   symbol;
  datetime lastdate;
  int      barscount;
  
  THistoryInfo()  { ZeroMemory(this); }
};

THistoryInfo Info[];

//+------------------------------------------------------------------+

int OnInit()
{
  bool selected= false;
  int total= SymbolsTotal(selected); 
  ArrayResize(Info, total);
  for (int i=0; i<total; i++)
    Info[i].symbol = SymbolName(i, selected);
  
  Alert("Init.  ",total," symbols");
   
  EventSetTimer(5);
      
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  EventKillTimer();     
}
//+------------------------------------------------------------------+
void OnTick()
{  
}
//+------------------------------------------------------------------+

void OnTimer()
{
  int updated=0;
  
  for (int i=0; i<ArraySize(Info) && !IsStopped(); i++)
  {
    string symbol= Info[i].symbol;
    Comment(symbol);
    datetime lastdate=  SeriesInfoInteger(symbol, Tf, SERIES_LASTBAR_DATE);
    if (lastdate==0) continue;
    int      barscount= SeriesInfoInteger(symbol, Tf, SERIES_BARS_COUNT);
    if (lastdate==Info[i].lastdate && barscount==Info[i].barscount) continue;
    Info[i].lastdate= lastdate;
    Info[i].barscount= barscount;
    updated++;
    Print(symbol,"  ",lastdate,"  ",barscount);
  }
  Alert("Updated ",updated," symbols");
}


Как видно по скриншоту, один такой проход по всем символам может занимать несколько минут. При этом процессор загружен на 100%, наблюдатся жуткие тормоза.  В процессе выполнения можно видеть по Comment, что обработка подолгу висит на одном символе.  И в итоге, за один такой цикл получаются данные лишь по некоторым символам, по остальным нулевые результаты, которые будут обновлены лишь при следующих запусках OnTimer.
Однако даже когда по всем символам уже получены данные, то при последующих обращениях к ним тормоза никуда не исчезают, и эпопея продолжается.  При том, что запрашиваются не сами котировки, а лишь общая информация о них.
И особенно учитывая, что сегодня выходной, т.е. ничего нигде не обновляются.

Приходится констатировать, что MT5 не пригоден для работы с историей по большому числу символов.  Если же брать только несколько десятков символов, то проблем нет вроде.

Замечу, что указанные проверки (SERIES_LASTBAR_DATE и SERIES_BARS_COUNT) - это необходимый минимум, чтобы узнать, изменилась ли история по символу или нет. Поэтому их нужно делать постоянно.  А при таких тормозах это сводит на нет всю работу.

p.s. Билд у меня 1795
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий