ФОРТС: Функция Bars() - страница 2

 
Михаил:

У меня возвращается 5 баров, а на графике их гораздо больше...

На каком инструменте/ТФ вызывается код?

Что показывает в этом же случае код из справки

 
Andrey Khatimlianskii:

На каком инструменте/ТФ вызывается код?

Что показывает в этом же случае код из справки

Привет, Андрей!

int a_bars = Bars( "SILV-3.16", PERIOD_H1 );

 А что может показать код из справки?

те же 5 баров:

int bars=Bars(_Symbol,_Period); 
   if(bars>0) 
     { 
      Print("Количество баров в истории терминала по символу-периоду на данный момент = ",bars); 
     } 
   else  //нет доступных баров 
     {
       ///
     }
 

Дело может быть в том, что символ "SILV-3.16" есть в Обзоре рынка, а его график НЕ открыт.

Возможно, именно поэтому функция возвращает не все бары. 

 
Кагбэ правила хорошего тона подразумевают синхронизацию данных...
 
Dennis Kirichenko:
Кагбэ правила хорошего тона подразумевают синхронизацию данных...

Привет, Денис!

Или не умею читать, или Вы не ХОТИТЕ это делать!

Функция вернула бы "0", если бы данные не были синхронизированы! 

Примечание

Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале,
или данные таймсерии в момент вызова функции не синхронизированы с торговым сервером, то функция вернет нулевое значение.
 
Михаил:

Привет, Андрей!

 А что может показать код из справки?

те же 5 баров:

А если запустить только ту часть, что должна вызываться при ошибке?

      //--- видимо, данные по символу не синхронизированы с данными на сервере 
      bool synchronized=false; 
      //--- счетчик цикла 
      int attempts=0; 
      // сделаем 5 попыток дождаться синхронизации 
      while(attempts<5) 
        { 
         if(SeriesInfoInteger(Symbol(),0,SERIES_SYNCHRONIZED)) 
           { 
            //--- есть синхронизация, выходим 
            synchronized=true; 
            break; 
           } 
         //--- увеличим счетчик 
         attempts++; 
         //--- подождем 10 миллисекунд до следующей итерации 
         Sleep(10); 
        } 
      //--- вышли из цикла по факту синхронизации 
      if(synchronized) 
        { 
         Print("Количество баров в истории терминала по символу-периоду на данный момент = ",bars); 
         Print("Самая первая в истории терминала дата по символу-периоду на данный момент = ", 
               (datetime)SeriesInfoInteger(Symbol(),0,SERIES_FIRSTDATE)); 
         Print("Самая первая дата в истории по символу на сервере = ", 
               (datetime)SeriesInfoInteger(Symbol(),0,SERIES_SERVER_FIRSTDATE)); 
        } 
      //--- синхронизация данных так и не была достигнута 
      else 
        { 
         Print("Не удалось получить количество баров на ",_Symbol); 
        } 

 

Михаил:

Дело может быть в том, что символ "SILV-3.16" есть в Обзоре рынка, а его график НЕ открыт.

Возможно, именно поэтому функция возвращает не все бары. 

Конечно, дело в этом. Я и спросил, с какого графика производился вызов.

При запросе данных других инструментов и ТФ нужно самому заботиться о их актуальности (разработчики решили этого не делать штатно).

 
Михаил:

Привет, Денис!

Или не умею читать, или Вы не ХОТИТЕ это делать!

Функция вернула бы "0", если бы данные не были синхронизированы! 

Да, написано, что 0. Я тоже удивился.

Вот это стоит в СД написать. 

 

Самое прикольное, в том, что когда я нахожу ошибку, то она НИ У КОГО не воспроизводится! :)

И требуется как минимум полгода для её обнаружения :):):) 

 
Andrey Khatimlianskii:

Да, написано, что 0. Я тоже удивился.

Вот это стоит в СД написать. 

Андрей, да я уже не вылезаю из СД :)

Они мне ответили "Обратитесь к брокеру" :) 

 

Если минут 10-15 в дебагере "долбить" синхронизацию и наличие первых дат,

то начинает возвращать правильно. 

Но, при правильной работе, Bars(_Symbol,_Period) должна возвращать

или ВСЕ бары или "0", если данных нет или они не синхронизированы. 

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