Как подгрузить таймсерию?

 

Приветствую. 

Такая задача - загрузить данные для CopyXxxx() другого таймфрейма (и другого символа). 

Использую скрипт из статьи "Организация доступа к данным". Но, все равно, несмотря на успешное завершение скрипта - Copy-функции возвращают мало данных. При этом, если открыть чарт с требуемым таймфреймом и символом - возникает на секунду пустое окно с названием (то есть, таймсерия реально отсутствует, и начинается её построение), а после того, как появляются данные - чарт можно закрыть, и после этого Copy-функция нормально копирует все данные. 

Никто с подобным не сталкивался? Что я делаю не так? Где лыжи смазать? 

Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
  • www.mql5.com
Организация доступа к данным - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Georgiy Merts:

Приветствую. 

Такая задача - загрузить данные для CopyXxxx() другого таймфрейма (и другого символа). 

Использую скрипт из статьи "Организация доступа к данным". Но, все равно, несмотря на успешное завершение скрипта - Copy-функции возвращают мало данных. При этом, если открыть чарт с требуемым таймфреймом и символом - возникает на секунду пустое окно с названием (то есть, таймсерия реально отсутствует, и начинается её построение), а после того, как появляются данные - чарт можно закрыть, и после этого Copy-функция нормально копирует все данные. 

Никто с подобным не сталкивался? Что я делаю не так? Где лыжи смазать? 

Если индикатор, то Sleep не работает. Загрузку нужно инициировать, контролировать и завершать через таймер
 
Nikolai Semko #:
Если индикатор, то Sleep не работает. Загрузку нужно инициировать, контролировать и завершать через таймер

Нет, пока - скрипт. 

Но, вроде ж в статье всё это делается... 

 
Georgiy Merts #:

Нет, пока - скрипт. 

Но, вроде ж в статье всё это делается... 

Не берусь утверждать, что скрипт не рабочий, но помниться, я тоже обжигался на этом скрипте, пока все сам не организовал через таймер.
У Вас же тоже проблемы с этим скриптом. Поэтому забудьте о нем. Возможно на многопотоке в советнике он будет работать нормально, но я бы рекомендовал все же через таймер.

 
Nikolai Semko #:

Не берусь утверждать, что скрипт не рабочий, но помниться, я тоже обжигался на этом скрипте, пока все сам не организовал через таймер.
У Вас же тоже проблемы с этим скриптом. Поэтому забудьте о нем. Возможно на многопотоке в советнике он будет работать нормально, но я бы рекомендовал все же через таймер.

Да, так и сделать придётся. Мне просто удивительно, что скрипт из хелпа - и так "прокололся".

 
Nikolai Semko #:
Если индикатор, то Sleep не работает. Загрузку нужно инициировать, контролировать и завершать через таймер
Georgiy Merts:

Приветствую. 

Такая задача - загрузить данные для CopyXxxx() другого таймфрейма (и другого символа). 

Использую скрипт из статьи "Организация доступа к данным". Но, все равно, несмотря на успешное завершение скрипта - Copy-функции возвращают мало данных. При этом, если открыть чарт с требуемым таймфреймом и символом - возникает на секунду пустое окно с названием (то есть, таймсерия реально отсутствует, и начинается её построение), а после того, как появляются данные - чарт можно закрыть, и после этого Copy-функция нормально копирует все данные. 

Никто с подобным не сталкивался? Что я делаю не так? Где лыжи смазать? 

у меня на каждом запуске работает скрипт, выставил там еще комменты, идет загрузка или все данные были загружены ранее

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

шапку добавил к скрипту для загрузки сразу всех рабочих символов

void LoadingHistory()
  {
   if(LoadHistory)
     {
      if(MQLInfoInteger(MQL_TESTER))
         return;
      //--- Загрузка истории
      for(int s=0; s<TRADE_SYMBOLS; s++)
        {
         //--- Если торговля по этому символу разрешена
         if(Symbols[s]!="")
            //---
            History(Symbols[s],PERIOD_H1,D'2020.01.01');
        }
     }
//иначе выходим
  }

для тестера лучше выключать

пока разработчики не добавили это в Функционал Терминала, запускать нужно всем

до этого я жаловался что хэндл ошибка и индикаторы некоторые с пустой историей по мере загрузки как червяк извиваются, а если крутануть еще дальше историю то и дальше продолжаются

год назад писал, что это нужно добавить в терминал. а не пройти 3 испытания ада. и добавить в код себе.

 

Да, написал свою функцию, вроде всё заработало...

CTerminalInfo - мой самописный класс (не из Стандартной Библиотеки, у меня свои, близкие по функциям), обслуживающий фукнции терминала. 

ETerminalLoadDataRes  - перечисление-результат загрузки таймсерии в терминал. ECurrencySymbol - перечисление символов, с которыми знакома моя библиотека.

Кроме того, используется несколько самописных функций и внутренних перечислений, но, я думаю, из контекста понятно, что они делают.

ETerminalLoadDataRes CTerminalInfo::LoadTimeseriesIntoTerminal(ECurrencySymbol csSymbol2Load,ENUM_TIMEFRAMES etTimeFrame2Load,datetime dtMaxDate2Load,uint uiMaxWaitSec)
{ 
   // Зафиксируем время старта
   uint uiStartTick = GetTickCount();
   
   // Проверим тип программы
   switch(_GetProgrammType())
      {
      case PROGRAM_SCRIPT:
         break;
         
      case PROGRAM_EXPERT:
      case PROGRAM_SERVICE:
         _NOT_TESTED_;  // В этих типах программ не испытывалось. TODO: Проверить. Возможно, никаких проблем не возникнет. 
         
      case PROGRAM_INDICATOR: // В индикаторе ожидание использовать нельзя.
      default:
         return(TLR_BAD_PROGRAMM_TYPE);         
      };
   
   // Проверим таймфрейм
   switch(CTimeframeConverter::CheckTimeframe(etTimeFrame2Load))
      {
      case TFT_MT4:
      case TFT_MT5ONLY: 
         break;
      default:
         return(TLR_UNKNOWN_TIMEFRAME);   
      };
      
   if(etTimeFrame2Load==PERIOD_CURRENT)     
      etTimeFrame2Load=_GetMainTimeframe(); 

   // Проверим символ
   if(_IsKnownSymbolEnum(csSymbol2Load)!=true)
      return(TLR_UNKNOWN_SYMBOL);

   if(SymbolInfoInteger(_Enum2StrSymbol(csSymbol2Load),SYMBOL_SELECT)!=true) 
      return(TLR_NO_SYMBOL_IN_MARKETWATCH); 

   datetime dtTimes[BUFFER_SIZE_4_SERIES_CHECK];

   // Попробуем загрузить данные таймсерии сходу
      if(CopyTime(_Enum2StrSymbol(csSymbol2Load),etTimeFrame2Load,dtMaxDate2Load,BUFFER_SIZE_4_SERIES_CHECK,dtTimes)==BUFFER_SIZE_4_SERIES_CHECK)
         if(dtTimes[1] > MIN_DATETIME && dtTimes[1] < dtMaxDate2Load)
            return(TLR_OK);

   // Сходу не вышло. Предупредим.
   Print("Wait timeseries building...");

   // Пробуем загрузить в цикле ожидания
   uint uiPrintInfoTick = uiStartTick;
   uint uiPrintSec = 0;
   while(GetTickCount() - uiStartTick < uiMaxWaitSec*1000)
      {
      if(CopyTime(_Enum2StrSymbol(csSymbol2Load),etTimeFrame2Load,dtMaxDate2Load,BUFFER_SIZE_4_SERIES_CHECK,dtTimes)==BUFFER_SIZE_4_SERIES_CHECK)
         if(dtTimes[1] > MIN_DATETIME && dtTimes[1] < dtMaxDate2Load)
            {
            Print("Timeseries has loaded");
            return(TLR_OK);
            };
      
      if(GetTickCount() - uiPrintInfoTick > 3000)
         {
         uiPrintInfoTick = GetTickCount();
         Print("Building " + IntegerToString(GetTickCount()-uiStartTick) + " sec...");
         };
      
      Sleep(SLEEP_WHILE_TIMESERIES_BUILD_SLICE);      
      };

   Print("Too long time waiting...");      
   return(TLD_TOO_LONG_WAIT);        
};
 Странно, что скрипт из хелпа работает неправильно... 
 
Georgiy Merts #:

Да, написал свою функцию, вроде всё заработало...

CTerminalInfo - мой самописный класс (не из Стандартной Библиотеки, у меня свои, близкие по функциям), обслуживающий фукнции терминала. 

ETerminalLoadDataRes  - перечисление-результат загрузки таймсерии в терминал. ECurrencySymbol - перечисление символов, с которыми знакома моя библиотека.

Кроме того, используется несколько самописных функций и внутренних перечислений, но, я думаю, из контекста понятно, что они делают.

 Странно, что скрипт из хелпа работает неправильно... 

В чем там ошибка? Давно использую, претензий вообще нет. Если на новом сервере запустить то подгружает с указанной даты по всем нужным символам, если история уже была подгружена то и не загружает, все работает как положено

 
lynxntech #:

В чем там ошибка? Давно использую, претензий вообще нет. Если на новом сервере запустить то подгружает с указанной даты по всем нужным символам, если история уже была подгружена то и не загружает, все работает как положено

Не знаю, не знаю. У меня - скрипт возвращал успех загрузки, а потом при запросе - копировалось либо меньше, либо вобще ничего. 

Сейчас - всё в порядке, всегда если функция возвратила успех - загрузка данных проходит также успешно.

Причина обращения: