Загрузка графика перед стартом индикатора

 

Поделитесь как решить данную проблему.
Т.е. перед началом выполнения кода индикатора, нужно убедиться, что доступная история графика (допустим количество баров функции Bars ) загрузилась.
В следствии недозагрузки истории некорректно отрабатывает код. Проявляется при старте терминала или переключения таймфрейма.

Перепробовал кучу вариантов, стабильного не обнаружил.



 
peterlogin:

Перепробовал кучу вариантов, стабильного не обнаружил.

Какие варианты пробовали? Чтобы зря не советовать.

 
   // задержка для подгрузки истории
   // возврат пока не подгрузится история       
   if ((FirstRUN) && ((rates_total != prev_calculated) || (rates_total == 0)))
   {
      Print("History initialization start -> Bars=", Bars, " rates_total=", rates_total, " prev_calculated=", prev_calculated, " counted_bars=", IndicatorCounted());
      return(rates_total);
   }


вот этот лучший из опробованных. но тоже иногда не спасает.

 
peterlogin:

вот этот лучший из опробованных. но тоже иногда не спасает.

Этот код проверяет только появление одного нового бара, но не проверяет факт окончания загрузки истории. Пробовали вариант с проверкой окончания загрузки?

 
Ihor Herasko:

Этот код проверяет только появление одного нового бара, но не проверяет факт окончания загрузки истории. Пробовали вариант с проверкой окончания загрузки?

так вопрос то и заключается как проверить окончание загрузки :)

 
peterlogin:

так вопрос то и заключается как проверить окончание загрузки :)

Вот так:

bool IsTFDataReady(ENUM_TIMEFRAMES eTF)
{
   ResetLastError();
   iTime(NULL, eTF, 1);
   return GetLastError() == ERR_NO_ERROR;
}
 
peterlogin:
   // задержка для подгрузки истории
   // возврат пока не подгрузится история       
   if ((FirstRUN) && ((rates_total != prev_calculated) || (rates_total == 0)))
   {
      Print("History initialization start -> Bars=", Bars, " rates_total=", rates_total, " prev_calculated=", prev_calculated, " counted_bars=", IndicatorCounted());
      return(rates_total);
   }


вот этот лучший из опробованных. но тоже иногда не спасает.

if (rates_total < num) return(0);
 

хитро... а в 

iTime(NULL, eTF, 1);

shift = 1

именно сдвиг 1, или подставлять значение Bars пример?

 
Sergey Deev:

num - это что?

 
peterlogin:

хитро... а в 

iTime(NULL, eTF, 1);

shift = 1

именно сдвиг 1, или подставлять значение Bars пример?

Без разницы. Обращение к таймсерии приводит к запросу истории с сервера, если последний запрос был "давно" (что подразумевается под давно точно сказать не могу). При этом генерируется ошибка 4066. Следующие обращения к таймсерии будут генерировать уже другие ошибки (не помню уже, какие) до тех пор, пока вся доступная история не будет закачана. Как только загрузка окончена, обращение к таймсерии не будет вызывать ошибку, обращения к серверу прекратятся.

 
Ihor Herasko:

Без разницы. Обращение к таймсерии приводит к запросу истории с сервера, если последний запрос был "давно" (что подразумевается под давно точно сказать не могу). При этом генерируется ошибка 4066. Следующие обращения к таймсерии будут генерировать уже другие ошибки (не помню уже, какие) до тех пор, пока вся доступная история не будет закачана. Как только загрузка окончена, обращение к таймсерии не будет вызывать ошибку, обращения к серверу прекратятся.

Либо что-то не так делаю, либо это не работает:

bool IsTFDataReady(ENUM_TIMEFRAMES eTF)

{

   bool res = false;

   ResetLastError();

   datetime dt1 = iTime(Symbol(), eTF, Bars-1);

   datetime dt2 = iTime(Symbol(), eTF, 1);

   if (GetLastError() == ERR_NO_ERROR)

   {

      Print("Initialization is complete. Time index bar (", Bars, ") = ", TimeToStr(dt1), " / ", TimeToStr(dt2));

      res = true;

   } 

   else

      Print("Initialization error: ", GetLastError()) ;

   return(res);

}

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

{

   if (FirstRUN)

   {

      Print("History initialization...");

   

      if (!IsTFDataReady(PERIOD_CURRENT))

      {

         return(0);

      }

   }

FirstRUN = false;

}


получаю результат

2019.03.21 11:46:53.504 ptr_Area GBPCHF.I,H1: Initialization is complete. Time index bar (2048) = 2018.02.06 11:00 / 2018.06.05 19:00

2019.03.21 11:46:53.504 ptr_Area GBPCHF.I,H1: History initialization...

2019.03.21 11:46:53.504 ptr_Area GBPCHF.I,H1: initialized

т.е. ошибки при обращении к таймсерии не получаю, но при этом история еще недозагружена -> 2018.06.05 19:00

при повторной компиляции - история догружается