Задержка в появлении баров. - страница 2

 
Vladimir Karputov:

В журнале колонка "Время" печатает время компьютера. У вас она не попадает в несколько секунд. Посмотрите мой результат - секунда в секунду.

Насколько я понял, "Время" - это время попадания информации в журнал, поэтому я ориентируюсь на время, переданное функцией TimeCurrent. Если я не прав, поправьте, пожалуйста. И что сделать для синхронизации. Эта ситуация получена не с тестера, а с реального счета.

 
savinkins:

Насколько я понял, "Время" - это время попадания информации в журнал, поэтому я ориентируюсь на время, переданное функцией TimeCurrent. Если я не прав, поправьте, пожалуйста. И что сделать для синхронизации. Эта ситуация получена не с тестера, а с реального счета.

Вы работаете с индикаторов - вот с ним и нужно работать: в индикаторе, в OnCalculate есть вся необходимая информация. Из этого следует, что не нужны Bars и TimeCurrent(). Если нужно определить в индикаторе появление нового бара:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   static datetime prev_time=0;
   if(prev_time==time[rates_total-1])
      return(rates_total);
   prev_time=time[rates_total-1];

   Print("Новый ,бар");
   Print("rates_total = "+(string)rates_total);
   Print("time[rates_total-1] = "+(string)time[rates_total-1]);

   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Vladimir Karputov:

Вы работаете с индикаторов - вот с ним и нужно работать: в индикаторе, в OnCalculate есть вся необходимая информация. Из этого следует, что не нужны Bars и TimeCurrent(). Если нужно определить в индикаторе появление нового бара:

Спасибо, я примерно так и сделал, но рассчитывал, что в режиме реального времени можно это как-то через время выловить. При этом, что интересно, при загрузке данных из файла (когда время начала бара определяется именно секундой котировки), бар рисуется правильно. 

В любом случае, спасибо за то, что откликнулись и за оперативные ответы.

 
savinkins:

Спасибо, я примерно так и сделал, но рассчитывал, что в режиме реального времени можно это как-то через время выловить. При этом, что интересно, при загрузке данных из файла (когда время начала бара определяется именно секундой котировки), бар рисуется правильно. 

В любом случае, спасибо за то, что откликнулись и за оперативные ответы.

попробуйте этот код:

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
  
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[])
  {
   static ulong prev_time=0;
   static int prev_rates_total =0;
   datetime t = TimeCurrent()%60;
   if (prev_time>0 && prev_rates_total<rates_total && prev_time==t) Print ("Ой");
   prev_time=t;
   prev_rates_total=rates_total;
   return(rates_total);
  }


если будет печатать "Ой" на минутном ТФ,  тогда действительно проблема существует.

 
Nikolai Semko:

если будет печатать "Ой"на минутном ТФ,  тогда действительно проблема существует.

Спасибо, запустил на минутном таймфрейме, жду.

 
savinkins:

Спасибо, запустил на минутном таймфрейме, жду.

прошу прощения, я ошибся в коде. Уже исправил. 
запустите еще раз исправленную версию

 
savinkins:

TimeCurrent()%60 вернет остаток секунд от деления. Как это может быть равно prev_rates_total, если prev_rates_total=rates_total?

да я перепутал prev_rates_total с prev_time

 
Nikolai Semko:

да я перепутал prev_rates_total с prev_time

Спасибо. Прокомментируйте, пожалуйста, код. Может, я не разобрался. Мы получаем количество секунд и сохраняем в статической переменной. Допустим, перед сменой бара это количество секунд 57. Потом мы его сравниваем с количеством секунд после смены бара (prev_rates_total<rates_total). Допустим, секунд 1. Вряд ли они будут равны. Какую ситуацию ловит Ваш код? Видимо, я что-то не понимаю.

 
savinkins:

Спасибо. Прокомментируйте, пожалуйста, код. Может, я не разобрался. Мы получаем количество секунд и сохраняем в статической переменной. Допустим, перед сменой бара это количество секунд 57. Потом мы его сравниваем с количеством секунд после смены бара (prev_rates_total<rates_total). Допустим, секунд 1. Вряд ли они будут равны. Какую ситуацию ловит Ваш код? Видимо, я что-то не понимаю.

Nikolai Semko:

да я перепутал prev_rates_total с prev_time

Да, индикатор трижды выдал "Ой".

 
savinkins:

Спасибо. Прокомментируйте, пожалуйста, код. Может, я не разобрался. Мы получаем количество секунд и сохраняем в статической переменной. Допустим, перед сменой бара это количество секунд 57. Потом мы его сравниваем с количеством секунд после смены бара (prev_rates_total<rates_total). Допустим, секунд 1. Вряд ли они будут равны. Какую ситуацию ловит Ваш код? Видимо, я что-то не понимаю.

еще раз прошу прощения. Сегодня я невероятно туплю :)) ... спал всего 3 часа.

Вот исправленный код:

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
  
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[])
  {
   static ulong prev_time=0;
   static int prev_rates_total =0;
   datetime t = TimeCurrent();
   t -= t%60;
   if (prev_time>0 && prev_rates_total<rates_total && prev_time==t) Print ("Ой");
   prev_time=t;
   prev_rates_total=rates_total;
   return(rates_total);
  }
Причина обращения: