Проблема с созданием хэндла.

 

Написал советник который использует скользяшки, две на текущем ТФ и две на высшем ТФ. В функции инициализации проверяю хэндл на "инвалидность" и количество посчитанных баров. В терминале все работает отлично, но в тестере выдает ошибки. Причем один хэндл для медленной скользяшки на текущем создается, а для быстрой нет, если поменять создание хэндлов местами в коде, то выходит наоборот, то есть создается хэндл который первый в коде. В чем может быть причина?

MA_SlowCurrTF_Handle = INVALID_HANDLE;
   for(int i = 0; i <= 5; i++)
     {
      Print("---------");
      MA_SlowCurrTF_Handle = iMA(_Symbol, CurrentTimeframe, MA_SlowCurrTF, 0, MODE_SMA, PRICE_CLOSE);
      if(MA_SlowCurrTF_Handle == INVALID_HANDLE)
        {
         Print("Error creating MA_SlowCurrTF_Handle. i = ", i, " Error - ", GetLastError());
         Sleep(100);
         continue;
        }

      if(BarsCalculated(MA_SlowCurrTF_Handle) < MA_SlowCurrTF)
        {
         Print("Not enough bars calculated for MA_SlowCurrTF_Handle. BarsCalculated = ",BarsCalculated(MA_SlowCurrTF_Handle),", i = ", i, " Error - ", GetLastError());
         Sleep(1000);
         continue;
        }

      Print("Bars calculated for MA_SlowCurrTF_Handle = ", BarsCalculated(MA_SlowCurrTF_Handle));
      break;
     }

   if(MA_SlowCurrTF_Handle == INVALID_HANDLE)
     {
      Print("Failed to create MA_SlowCurrTF_Handle after multiple attempts.");
     }
//+------------------------------------------------------------------+
   MA_FastCurrTF_Handle = INVALID_HANDLE;
   for(int i = 0; i <= 5; i++)
     {
      MA_FastCurrTF_Handle = iMA(_Symbol, CurrentTimeframe, MA_FastCurrTF, 0, MODE_SMA, PRICE_CLOSE);
      if(MA_FastCurrTF_Handle == INVALID_HANDLE)
        {
         Print("Error creating MA_FastCurrTF_Handle. i = ", i, " Error - ", GetLastError());
         Sleep(100);
         continue;
        }
      if(BarsCalculated(MA_FastCurrTF_Handle) < MA_FastCurrTF)
        {
         Print("Not enough bars calculated for MA_FastCurrTF_Handle. BarsCalculated = ",BarsCalculated(MA_FastCurrTF_Handle),", i = ", i, " Error - ", GetLastError());
         Sleep(1000);
         continue;
        }
      Print("Bars calculated for MA_FastCurrTF_Handle = ", BarsCalculated(MA_FastCurrTF_Handle));
      break;
     }
   if(MA_FastCurrTF_Handle == INVALID_HANDLE)
     {
      Print("Failed to create MA_FastCurrTF_Handle after multiple attempts.");
     }

2025.07.18 16:06:48.520 2022.06.01 00:00:00   ---------

2025.07.18 16:06:48.520 2022.06.01 00:00:00   Not enough bars calculated for MA_SlowCurrTF_Handle. BarsCalculated = -1, i = 0 Error - 4806

2025.07.18 16:06:48.844 2022.06.01 00:00:01   ---------

2025.07.18 16:06:48.844 2022.06.01 00:00:01   Bars calculated for MA_SlowCurrTF_Handle = 11721

2025.07.18 16:06:48.844 2022.06.01 00:00:01   Not enough bars calculated for MA_FastCurrTF_Handle. BarsCalculated = -1, i = 0 Error - 4806

2025.07.18 16:06:48.844 2022.06.01 00:00:02   Not enough bars calculated for MA_FastCurrTF_Handle. BarsCalculated = -1, i = 1 Error - 4806

2025.07.18 16:06:48.844 2022.06.01 00:00:03   Not enough bars calculated for MA_FastCurrTF_Handle. BarsCalculated = -1, i = 2 Error - 4806

2025.07.18 16:06:48.844 2022.06.01 00:00:04   Not enough bars calculated for MA_FastCurrTF_Handle. BarsCalculated = -1, i = 3 Error - 4806

2025.07.18 16:06:48.844 2022.06.01 00:00:05   Not enough bars calculated for MA_FastCurrTF_Handle. BarsCalculated = -1, i = 4 Error - 4806

2025.07.18 16:06:48.844 2022.06.01 00:00:06   Not enough bars calculated for MA_FastCurrTF_Handle. BarsCalculated = -1, i = 5 Error - 4806

2025.07.18 16:06:48.903 ETHUSD,M5: history cache allocated for 365384 bars and contains 139921 bars from 2021.01.04 00:05 to 2022.05.31 23:55

2025.07.18 16:06:48.903 ETHUSD,M5: history begins from 2021.01.04 00:05

2025.07.18 16:06:48.904 2022.06.01 00:00:07   Not enough bars calculated for MA_SlowHighTF_Handle. BarsCalculated = -1, i = 0 Error - 4806

2025.07.18 16:06:48.904 2022.06.01 00:00:08   Not enough bars calculated for MA_SlowHighTF_Handle. BarsCalculated = -1, i = 1 Error - 4806

2025.07.18 16:06:48.904 2022.06.01 00:00:09   Not enough bars calculated for MA_SlowHighTF_Handle. BarsCalculated = -1, i = 2 Error - 4806

2025.07.18 16:06:48.904 2022.06.01 00:00:10   Not enough bars calculated for MA_SlowHighTF_Handle. BarsCalculated = -1, i = 3 Error - 4806

2025.07.18 16:06:48.904 2022.06.01 00:00:11   Not enough bars calculated for MA_SlowHighTF_Handle. BarsCalculated = -1, i = 4 Error - 4806

2025.07.18 16:06:48.904 2022.06.01 00:00:12   Not enough bars calculated for MA_SlowHighTF_Handle. BarsCalculated = -1, i = 5 Error - 4806

2025.07.18 16:06:48.904 2022.06.01 00:00:13   Not enough bars calculated for MA_FastHighTF_Handle. BarsCalculated = -1, i = 0 Error - 4806

2025.07.18 16:06:48.904 2022.06.01 00:00:14   Not enough bars calculated for MA_FastHighTF_Handle. BarsCalculated = -1, i = 1 Error - 4806

2025.07.18 16:06:48.904 2022.06.01 00:00:15   Not enough bars calculated for MA_FastHighTF_Handle. BarsCalculated = -1, i = 2 Error - 4806

2025.07.18 16:06:48.904 2022.06.01 00:00:16   Not enough bars calculated for MA_FastHighTF_Handle. BarsCalculated = -1, i = 3 Error - 4806

2025.07.18 16:06:48.904 2022.06.01 00:00:17   Not enough bars calculated for MA_FastHighTF_Handle. BarsCalculated = -1, i = 4 Error - 4806

2025.07.18 16:06:48.904 2022.06.01 00:00:18   Not enough bars calculated for MA_FastHighTF_Handle. BarsCalculated = -1, i = 5 Error - 4806


 
Example2:

Написал советник который использует скользяшки, две на текущем ТФ и две на высшем ТФ. В функции инициализации проверяю хэндл на "инвалидность" и количество посчитанных баров. В терминале все работает отлично, но в тестере выдает ошибки. Причем один хэндл для медленной скользяшки на текущем создается, а для быстрой нет, если поменять создание хэндлов местами в коде, то выходит наоборот, то есть создается хэндл который первый в коде. В чем может быть причина?

Посмотрите, для примера, этот советник. В нём реализована проверка гораздо проще, без циклов.

С уважением, Владимир.
 
MrBrooklin #:

Посмотрите, для примера, этот советник. В нём реализована проверка гораздо проще, без циклов.

С уважением, Владимир.

Савсибо за Ваш ответ. Но в справке к CopyBuffer написано:

"При запросе данных из индикатора, если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, то функция сразу же вернет -1, но при этом сам процесс загрузки/построения будет инициирован.

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

Я где то читал что нужно подождать пока данные подтянутся, поэтому и цикл. 

 
Example2 #:

Савсибо за Ваш ответ. Но в справке к CopyBuffer написано:

"При запросе данных из индикатора, если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, то функция сразу же вернет -1, но при этом сам процесс загрузки/построения будет инициирован.

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

Я где то читал что нужно подождать пока данные подтянутся, поэтому и цикл. 

циклов не должно быть там, программа в случае ошибки создания хендла должна выйти по return(INIT_FAILED);

и начать с начала, смотрите предложенный пример


цикл при создании хендлов используют только когда создается массив, для мультисимвола например 

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


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


add

вспомнил по названию

https://www.mql5.com/ru/docs/series/timeseries_access

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

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

Написал советник который использует скользяшки, две на текущем ТФ и две на высшем ТФ. В функции инициализации проверяю хэндл на "инвалидность" и количество посчитанных баров. В терминале все работает отлично, но в тестере выдает ошибки. Причем один хэндл для медленной скользяшки на текущем создается, а для быстрой нет, если поменять создание хэндлов местами в коде, то выходит наоборот, то есть создается хэндл который первый в коде. В чем может быть причина?

Всё не правильно, неправильная структура кода

Хендл создаётся в OnInit(), на этом всё оканчивается 

остальное проверяется в OnTick()

int OnInit()
{
//
  hATR=iATR(
NULL , 0, 100);
  if(hATR==-1) {
    Print("Error handle ATR");
    return(INIT_FAILED);
  }
//
  return(INIT_SUCCEEDED);
}
 
Vitaly Muzichenko #:

Всё не правильно, неправильная структура кода

Хендл создаётся в OnInit(), на этом всё оканчивается 

остальное проверяется в OnTick()

Сделал вот так

   MA_SlowCurrTF_Handle = iMA(_Symbol, CurrentTimeframe, MA_SlowCurrTF, 0, MODE_SMA, PRICE_CLOSE);
   Print("BarsCalculated MA_SlowCurrTF_Handle = ",BarsCalculated(MA_SlowCurrTF_Handle));
   if(MA_SlowCurrTF_Handle == -1)
      Print("Error creating MA_SlowCurrTF_Handle. Error - ", GetLastError());
   if(BarsCalculated(MA_SlowCurrTF_Handle) >= MA_SlowCurrTF)
         Print("MA_SlowCurrTF_Handle created");

   MA_FastCurrTF_Handle = iMA(_Symbol, CurrentTimeframe, MA_FastCurrTF, 0, MODE_SMA, PRICE_CLOSE);
      Print("BarsCalculated MA_FastCurrTF_Handle = ",BarsCalculated(MA_FastCurrTF_Handle));
   if(MA_FastCurrTF_Handle == -1)
      Print("Error creating MA_FastCurrTF_Handle. Error - ", GetLastError());
   if(BarsCalculated(MA_FastCurrTF_Handle) >= MA_FastCurrTF)
         Print("MA_FastCurrTF_Handle created");

В терминале работает, но тестере нет, хэндл создается но BarsCalculated() равно -1


 
Example2 #:

Сделал вот так

В терминале работает, но тестере нет, хэндл создается но BarsCalculated() равно -1


статья ок по теме вроде этой может поможет - там и о хендлах есть правда пользоват - го инд- ра

Количественный анализ на MQL5: реализуем перспективный алгоритм
Количественный анализ на MQL5: реализуем перспективный алгоритм
  • 2023.12.08
  • www.mql5.com
Разбираем вопрос, что такое количественный анализ, как его применяют крупные игроки, создадим один из алгоритмов количественного анализа на языке MQL5.
 
Example2 #:
но BarsCalculated() равно -1

На сайте есть Учебник. Там всё хорошо расписано про BarsCalculated(). Обратите там особое внимание на то, что проверка количества просчитанных баров делается в OnInit().

С уважением, Владимир.

 
MrBrooklin #:

На сайте есть Учебник. Там всё хорошо расписано про BarsCalculated(). Обратите там особое внимание на то, что проверка количества просчитанных баров делается в OnInit().

С уважением, Владимир.

Я походу разобрался, упростил код до

   MA_SlowCurrTF_Handle = iMA(_Symbol, CurrentTimeframe, MA_SlowCurrTF, 0, MODE_SMA, PRICE_CLOSE);
   if(MA_SlowCurrTF_Handle == INVALID_HANDLE)
      Print("Error creating MA_SlowCurrTF_Handle. Error - ", GetLastError());

   MA_FastCurrTF_Handle = iMA(_Symbol, CurrentTimeframe, MA_FastCurrTF, 0, MODE_SMA, PRICE_CLOSE);
   if(MA_FastCurrTF_Handle == INVALID_HANDLE)
      Print("Error creating MA_FastCurrTF_Handle. Error - ", GetLastError());

Просто в тестере в режиме "Только цены открытия" на ТФ Н1 данные индикатора на ТФ Н4 на текущем баре рассчитываются неккоректно, так как "тик" только пришел.