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

 
Anton:

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

Ну и  SERIES_SYNCHRONIZED тоже надо учитывать.

Спасибо, понятно

Правда и я подправил Ваш код

//+------------------------------------------------------------------+
//|                                                   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;
      cnt = 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);
         Print("Не хватает тиков!"); // ДОБАВЛЕНО
        }
     }
   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);
  }
//+------------------------------------------------------------------+

и Вот результат

2020.09.22 21:21:40.738 Test_ind_3 (GOLD-12.20,M1)      Start time = 2020.07.01 19:05:00
2020.09.22 21:21:40.738 Test_ind_3 (GOLD-12.20,M1)      End time = 2020.11.02 18:45:00
2020.09.22 21:21:40.738 Test_ind_3 (GOLD-12.20,M1)      Time now = 2020.09.22 21:21:40
2020.09.22 21:21:40.738 Test_ind_3 (GOLD-12.20,M1)      Bars last time = 2020.09.22 00:00:00
2020.09.22 21:21:40.738 Test_ind_3 (GOLD-12.20,M1)      Last tick time = 2020.09.21 22:10:22
2020.09.22 21:21:40.738 Test_ind_3 (GOLD-12.20,M1)      Не хватает тиков!
 
Alexey Viktorov:

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

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

Не важно откуда работать, важно, что все-равно не работает.

 
prostotrader:

Не важно откуда работать, важно, что все-равно не работает.

А можно поинтересоваться, зачем вы закомментировали return(false); и вместо этого добавили ещё один Print();?

Разве вам надо объяснять, что этот return для того, чтобы если с первого раза не получены все тики, то надо ещё раз запустить попытку. Ну нужен этот Print() поставьте его в кривых скобках перед return

         if(time_arr[bars_cnt - 1] != (pr_ticks[result-1].time/86400)*86400)
          {
           Print("Не хватает тиков!");
           return(false);
          }

и полу́чите с какой попытки получили все тики.

 
Alexey Viktorov:

А можно поинтересоваться, зачем вы закомментировали return(false); и вместо этого добавили ещё один Print();?

Разве вам надо объяснять, что этот return для того, чтобы если с первого раза не получены все тики, то надо ещё раз запустить попытку. Ну нужен этот Print() поставьте его в кривых скобках перед return

и полу́чите с какой попытки получили все тики.

Пожалуйста

2020.09.23 00:32:56.713 Test_ind_3 (SBRF-12.20,M1)      Start time = 2020.07.01 19:05:00
2020.09.23 00:32:56.713 Test_ind_3 (SBRF-12.20,M1)      End time = 2020.11.02 18:45:00
2020.09.23 00:32:56.713 Test_ind_3 (SBRF-12.20,M1)      Time now = 2020.09.23 00:32:56
2020.09.23 00:32:56.713 Test_ind_3 (SBRF-12.20,M1)      Bars last time = 2020.09.22 00:00:00
2020.09.23 00:32:56.713 Test_ind_3 (SBRF-12.20,M1)      Last tick time = 2020.09.18 17:30:46
2020.09.23 00:32:56.713 Test_ind_3 (SBRF-12.20,M1)      Не хватает тиков!
2020.09.23 00:32:56.735 Test_ind_3 (SBRF-12.20,M1)      Не получены времена серии
2020.09.23 00:32:56.742 Test_ind_3 (SBRF-12.20,M1)      Не получены времена серии
2020.09.23 00:32:56.760 Test_ind_3 (SBRF-12.20,M1)      Не получены времена серии
//+------------------------------------------------------------------+
//|                                                   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;
      cnt = 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);
           Print("Не хватает тиков!");
           return(false);
         }    
        }
     }
     else
     {
        Print("Не получены времена серии");
        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);
  }
//+------------------------------------------------------------------+
 
//+------------------------------------------------------------------+
//|                                                   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;
      cnt = 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);
           Print("Не хватает тиков!");
           return(false);
         }    
        }
     }
     else
     {
        Print("Не получены времена серии");
        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() == false) return(0);
     Print("Проснулись! :)");
   }     
   return(rates_total);
  }
//+------------------------------------------------------------------+
2020.09.23 00:36:41.078 Test_ind_3 (Si-12.20,M1)        Не получены времена серии
2020.09.23 00:36:53.171 Test_ind_3 (Si-12.20,M1)        Не получены времена серии
2020.09.23 00:36:53.220 Test_ind_3 (Si-12.20,M1)        Проснулись! :)
2020.09.23 00:36:53.244 Test_ind_3 (Si-12.20,M1)        Проснулись! :)
 
prostotrader:

При всём уважении, я не могу понять что можно получить в таком цикле

   while((result <= 0) && (cnt < 100))
     {
      result = CopyTime(Symbol(), PERIOD_D1, start_time, end_time, time_arr);
      cnt++;
     }

ну если не получили с первой попытки, то 99 следующих так-же не дадут результата. Ведь данные не успеют обновиться.

Такой-же вопрос и к этому циклу

      while((result <= 0) && (cnt < 100))
        {
         result = CopyTicksRange(Symbol(), pr_ticks, COPY_TICKS_INFO, ulong(start_time) * 1000, ulong(end_time) * 1000);
         cnt++;
        }

и очень правильно добавлено обнуление переменной cnt перед циклом.

Что касается Sleep() в индикаторах… можно использовать цикл while с подсчётом GetTickCount()

Погоняли цикл в течении 100 миллисекунд и выскочили из цикла. За это время может и тики подгрузятся.

 
Alexey Viktorov:

При всём уважении, я не могу понять что можно получить в таком цикле

ну если не получили с первой попытки, то 99 следующих так-же не дадут результата. Ведь данные не успеют обновиться.

Не просто не успеют, а не имеют шанса обновиться. Расчет индикатора происходит в потоке отвечающем втч и за подготовку данных по этому символу. Т.е. циклы ожидания данных в индикторе делать не надо. Это явно описано в справке:

Синхронизация данных терминала и данных сервера #

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

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

Для экспертов и пользовательских индикаторов лучше использовать событийную модель обработки. Если при обработке события OnTick() или OnCalculate() не удалось получить все необходимые данные требуемой таймсерии, то следует выйти из обработчика события, рассчитывая на появление доступа к данным при следующем вызове обработчика.

Код без циклов:

//+------------------------------------------------------------------+
//|                                                   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 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';

   result = CopyTime(Symbol(), PERIOD_D1, start_time, end_time, time_arr);

   if(result > 0)
     {
      bars_cnt = result;

      result = CopyTicksRange(Symbol(), pr_ticks, COPY_TICKS_INFO, ulong(start_time) * 1000, ulong(end_time) * 1000);

      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)
           {
            Print("Не хватает тиков!");
            return(false);
           }
        }
      else
        {
         Print("Не получены тики");
         return(false);
        }
     }
   else
     {
      Print("Не получены времена серии");
      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);
      Print("Проснулись! :)");
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
  • www.mql5.com
Прежде чем ценовые данные будут доступны в терминале MetaTrader 5, их необходимо получить и обработать. Для получения данных требуется подключение к торговому серверу MetaTrader 5. Данные поступают с сервера по запросу терминала в виде экономно упакованных блоков минутных баров. Механизм обращения к серверу за данными не зависит от того, каким...
 
Alexey Viktorov:

При всём уважении, я не могу понять что можно получить в таком цикле

ну если не получили с первой попытки, то 99 следующих так-же не дадут результата. Ведь данные не успеют обновиться.

Такой-же вопрос и к этому циклу

и очень правильно добавлено обнуление переменной cnt перед циклом.

Что касается Sleep() в индикаторах… можно использовать цикл while с подсчётом GetTickCount()

Погоняли цикл в течении 100 миллисекунд и выскочили из цикла. За это время может и тики подгрузятся.

Алексей! 

Что Вы так зацепились за этот код - это просто проверка у меня только тики не загружаются сразу или нет...

Вот и все.

В реале у меня совсем другой код...

int cnt = 0;
    int result = 0;
    int res = 0;
    int a_bars = 0;
    while ((result <= 0) && (cnt < 100)) 
    {
      result = CopyTime(Symbol(), PERIOD_M1, start_time, end_time, time_array);
      res =  LoadSeries(Symbol(), result);
      if(result == res) break;
      cnt++;   
    }
    if(result > 0)

и т.д....

Добавлено

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

https://www.mql5.com/ru/forum/351753

Щас занят на стройке

Индикатор из советника для работы с тиками (CChartCanvas)
Индикатор из советника для работы с тиками (CChartCanvas)
  • 2020.09.22
  • www.mql5.com
Биржевой трейдинг: Индикатор из советника для работы с тиками (CChartCanvas)
 
prostotrader:

Алексей! 

Что Вы так зацепились за этот код - это просто проверка у меня только тики не загружаются сразу или нет...

Вот и все.

В реале у меня совсем другой код...

и т.д....

Добавлено

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

https://www.mql5.com/ru/forum/351753

Щас занят на стройке

Да никакой разницы, этот код или другой, вопрос остаётся тот-же: какой такой сакральный смысл в таком цикле без задержки? Ответ однозначный — никакого. Не получили с первой попытки, не получите и за следующие 99 попыток.

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

Удачи на стройке. Когда будете думать о водоочистке рекомендую смотреть только https://aquaboss.ru/

Системы водоочистки и водоподготовки (фильтры для воды)
Системы водоочистки и водоподготовки (фильтры для воды)
  • aquaboss.ru
«Аквабосс» - производство фильтров для воды, монтаж и продажа оборудования для водоподготовки и водоочистки технологической и питьевой воды, оказание консультаций и техническая поддержка наших клиентов. С нами надежно и недорого, звоните!
 
Alexey Viktorov:

Да никакой разницы, этот код или другой, вопрос остаётся тот-же: какой такой сакральный смысл в таком цикле без задержки? Ответ однозначный — никакого. Не получили с первой попытки, не получите и за следующие 99 попыток.

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

Удачи на стройке. Когда будете думать о водоочистке рекомендую смотреть только https://aquaboss.ru/

Ок.

У меня скважина 131 м, продавать воду можно (нед вредных компонентов)

Но спасибо за ссылку

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