Просьба запустить на реале на BR-11.20 - страница 3

 
prostotrader:

Посмотрите пост выше!

Получается, что 12 дней тики не обновлялись!

Да.

 
Anton:

Да.

Здорово!

Так каким образом (индикатор) я смогу понять, что история по тикам полностью загружена,

если в индикаторах нельзя применять Sleep() чтобы дождаться загрузки тиков?

Такая же история (индикатор) с CopyTime() (if(SeriesInfoInteger(a_symbol, PERIOD_M1, SERIES_SYNCHRONIZED) == true)

  {) - врегда TRUE

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Все предопределенные периоды графиков имеют уникальные идентификаторы. Идентификатор PERIOD_CURRENT означает текущий период графика, на котором запущена mql5-программа.
 
prostotrader:

Здорово!

Так каким образом (индикатор) я смогу понять, что история по тикам полностью загружена,

если в индикаторах нельзя применять Sleep() чтобы дождаться загрузки тиков?

Такая же история (индикатор) с CopyTime() (if(SeriesInfoInteger(a_symbol, PERIOD_M1, SERIES_SYNCHRONIZED) == true)

  {) - врегда TRUE

Не пробовали перенести весь этот код в OnCalculate под условие if(prev_calculated == 0)

 
Alexey Viktorov:

Не пробовали перенести весь этот код в OnCalculate под условие if(prev_calculated == 0)

Толку-то? Да и считается невероятно долго (тиков-то миллионы)

 
prostotrader:

Толку-то? Да и считается невероятно долго (тиков-то миллионы)

Толк по идее быть должен. Я когда делал первую пробу посчитал что вы вписали весь код в OnInit по причине выходного.

Ведь в OnInit даже массивы индикаторных буферов имеют нулевой размер. То-есть индикатора как такового ещё нет. И данные по инструменту тоже наверняка не подгружены. Если-бы я заметил у себя такую проблему, то обязательно проверил-бы. Да и нет разницы где время тратить на загрузку тиков, хоть их пусть сколько будет. Нужны-то в пределах разумного. Не так-ли?

 
Alexey Viktorov:

Толк по идее быть должен. Я когда делал первую пробу посчитал что вы вписали весь код в OnInit по причине выходного.

Ведь в OnInit даже массивы индикаторных буферов имеют нулевой размер. То-есть индикатора как такового ещё нет. И данные по инструменту тоже наверняка не подгружены. Если-бы я заметил у себя такую проблему, то обязательно проверил-бы. Да и нет разницы где время тратить на загрузку тиков, хоть их пусть сколько будет. Нужны-то в пределах разумного. Не так-ли?

Причем тут индикатора нет?

Я копирую времена баров и  тики и с ними оперирую... 

 
prostotrader:

Здорово!

Так каким образом (индикатор) я смогу понять, что история по тикам полностью загружена,

если в индикаторах нельзя применять Sleep() чтобы дождаться загрузки тиков?

Аналога SERIES_SYNCHRONIZED для тиков к сожалению пока нет.

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

Т.е. нет тиков - нет отрисовки, появились тики - можно рисовать.

Как вам и посоветовали, проверку разместить в

в OnCalculate под условие if(prev_calculated == 0)
 
prostotrader:

Причем тут индикатора нет?

Я копирую времена баров и  тики и с ними оперирую... 

Ну… если вам сложней проверить чем объяснять ненужность проверки…

Но в моём сообщении ещё сказано о том, что «И данные по инструменту тоже наверняка не подгружены.» В общем я больше вас не отвлекаю.

 
Anton:

Аналога SERIES_SYNCHRONIZED для тиков к сожалению пока нет.

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

Т.е. нет тиков - нет отрисовки, появились тики - можно рисовать.

Как вам и посоветовали, проверку разместить в

Тики-то есть, но не все!

 
prostotrader:

Тики-то есть, но не все!

Я модифицировал ваш пример. Надеюсь так мысль будет понятнее.

//+------------------------------------------------------------------+
//|                                                   Test_ind_3.mq5 |
//|                                      Copyright 2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Test_3"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLime
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
bool InitData()
  {
   MqlTick pr_ticks[];
   datetime time_arr[];
   int cnt = 0;
   int result = 0;
   int bars_cnt = 0;
   datetime start_time = D'2020.07.01 19:05:00';
   datetime end_time = D'2020.11.02 18:45:00';
   while((result <= 0) && (cnt < 100))
     {
      result = CopyTime(Symbol(), PERIOD_D1, start_time, end_time, time_arr);
      cnt++;
     }
   if(result > 0)
     {
      bars_cnt = result;
      result = 0;
      while((result <= 0) && (cnt < 100))
        {
         result = CopyTicksRange(Symbol(), pr_ticks, COPY_TICKS_INFO, ulong(start_time) * 1000, ulong(end_time) * 1000);
         cnt++;
        }
      if(result > 0)
        {
         Print("Start time = ", start_time);
         Print("End time = ", end_time);
         Print("Time now = ", TimeTradeServer());
         Print("Bars last time = ", time_arr[bars_cnt - 1]);
         Print("Last tick time = ", pr_ticks[result-1].time);
         if(time_arr[bars_cnt - 1] != (pr_ticks[result-1].time/86400)*86400)
            return(false);
        }
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,const int prev_calculated,const int begin,const double &price[])
  {
   if(prev_calculated == 0)
      if(!InitData())
         return(0);
   return(rates_total);
  }
//+------------------------------------------------------------------+
Ну и  SERIES_SYNCHRONIZED тоже надо учитывать.
Причина обращения: