ФОРТС: Функция Bars()

 

Добрый день!

В 1210 терминале МТ5 фукция

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe        // периоду 
   );

 Возвращает бары только за текущий день.

Это у всех так, или только у меня?

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

 Кому не сложно, проверьте на реале.

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

 

 
2015.11.18 17:48:01.522 Test Bars (SILV-3.16,H1) SILV-3.16 a_bars = 252

 

 

 


 
Sergey Chalyshev:
2015.11.18 17:48:01.522 Test Bars (SILV-3.16,H1) SILV-3.16 a_bars = 252

 

 

 


Спасибо. 

Т.е у Вас 252?

А у меня 5 :( 

 
Михаил:

Спасибо. 

Т.е у Вас 252?

А у меня 5 :( 

а всегда 5 или если вызывать на каждом тике иногда 5?

Для себя давно делал заметку (ещё на старых билдах):

   Никакими API нельзя запрашивать кол-во баров в истории инструмента на каждом тике.
   Это недокументированный баг системы.
   Кол-во баров в истории почему-то связано с запросом инфы от сервера.
   Частые запросы о кол-ве баров (на каждый тик) с большой вероятностью вызывают отказ системы.
   API в таком случае возвращает невнятную ошибку 4001 (Неожиданная внутренняя ошибка),
   а в журнале появляется ещё более странная запись вида "HistoryBase... 1 invalid bars removed"

В журнале терминала нет никаких сообщений об ошибках?


PS у меня скрипт вернул: 2015.11.19 21:40:18.061    bars_test (SILV-3.16,D1)    на SILV-3.16 PERIOD_H1 баров =264

 
Fry_Антон:

Добрый день!

А при чём тут LastError?

Ошибки нет, функция (int a_bars = Bars( "SILV-3.16", PERIOD_H1 );) возвращает бары, НО

только не все, что есть, а только за текущий день :) 

 
Михаил:

...

А при чём тут LastError?

...

Что ни день, то шедевр!
 
Михаил:

Ой, опять наш

 

появился! 

Знакомое слово увидел :) 

Слушай, а почему ты пытаешься унижать и оскорблять? Абсолютно нормальные вопрос  про LastError. К чему было это выкаблучивание про "причем"?

 
Для Михаил официальное предупреждение: толерантность лишней не бывает.
 
Михаил:

Добрый день!

А при чём тут LastError?

Ошибки нет, функция (int a_bars = Bars( "SILV-3.16", PERIOD_H1 );) возвращает бары, НО

только не все, что есть, а только за текущий день :) 

Притом.

Система работает так:

Всякое действие регистрируется определённой константой в системной переменной (назовём её услвно LastError).

Перед вызовом большинства API-функций терминала, желательно сбрасывать эту переменную ResetLastError().

Затем когда происходит вызов (в нашем случае Bars()),  API внутри себя последовательно шаг за шагом фиксирует каждое важное действие именно в LastError.

Если на каком-то этапе функция прерывается, в LastError остаётся константа предыдущего этапа или константа ошибки из-за которой "обломалась" API-функция.

Многие функции обязательно фиксируют успешный результат или уточняют результат именно через LastError.

Например, когда мы пытаемся выделить ордер или позицию, при корректной обработке очень желательно убедится, что ордер/позиция не выделились именно потому что их не существует, а не в результате провала выделения. Сделать это можно только через GetLastError() (см. константы ERR_TRADE_POSITION_NOT_FOUND и ERR_TRADE_ORDER_NOT_FOUND).

 
Fry_Антон:

Притом.

Система работает так:

Всякое действие регистрируется определённой константой в системной переменной (назовём её услвно LastError).

Перед вызовом большинства API-функций терминала, желательно сбрасывать эту переменную ResetLastError().

Затем когда происходит вызов (в нашем случае Bars()),  API внутри себя последовательно шаг за шагом фиксирует каждое важное действие именно в LastError.

Если на каком-то этапе функция прерывается, в LastError остаётся константа предыдущего этапа или константа ошибки из-за которой "обломалась" API-функция.

Многие функции обязательно фиксируют успешный результат или уточняют результат именно через LastError.

Например, когда мы пытаемся выделить ордер или позицию, при корректной обработке очень желательно убедится, что ордер/позиция не выделились именно потому что их не существует, а не в результате провала выделения. Сделать это можно только через GetLastError() (см. константы ERR_TRADE_POSITION_NOT_FOUND и ERR_TRADE_ORDER_NOT_FOUND).

Антон!

Если бы функция вернула "0", то тогда, возможно, имело бы смысл вызывать GetLastError().

Если "по каждому чиху" вызывать эту функцию, то получится следующее:

if( a > b )
{
  GetLastError();
}
else
{
  GetLastError();
}

 Это я знаю, что их (баров) должно быть больше, а мог и не знать....

Даже если эта функция и вернула "0", то это не значит, что это ошибка (в справке всё написано.)

Примечание

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

Слушай, а почему ты пытаешься унижать и оскорблять? Абсолютно нормальные вопрос  про LastError. К чему было это выкаблучивание про "причем"?

Слушай.... Хорошая манера общения, ну да ладно...

Я напомню ТЕБЕ, с чего всё началось. ТЫ ПЕРВЫЙ написал:

"Михаил, ну вот зачем вы продолжаете пропагандировать свой позорный принцип в программировании экспертов?"

Даже если меня ЗАБАНЯТ, то я ВСЕГДА буду "воевать" с хамами!

А на войне все средства хороши. НО, если ТЕБЕ будет "приятно" и ты успокоишься, то я признаю себя ДУРАКОМ,

не умеющим программировать и ничего не знающим.

ТВОЁ ЭГО довольно?