Ошибки, баги, вопросы - страница 1221

 
Fry:

Ошибка

Вызов:


приводит к сообщению в журнале:

HistoryBase    'RTS-12.14' 1 invalid bars removed


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

Эта же ошибка появляется по другим, не выявленным, причинам.

Но, что интересно, она не появляется на многих других инструментах. Больше всего вылезает именно на фьючерсе RTS.


В сервисдеск написал несколько месяцев назад - ответ нет (Заявка начата: 2014.07.28 13:41, #1046215).


Прикрепляю код индюка, который вызывает эту ошибку на каждый тик текущего (и прошлого) фьючерса RTS (демо счёт у брокера "О..."):

Это баг в терминале? Или у брокера? Или у меня?

Что делать? Как иначе узнать кол-во баров на таймфрейме D1?

Добрый вечер. Не пробовали так?

SeriesInfoInteger( _Symbol, PERIOD_D1, SERIES_BARS_COUNT );
 
Tapochun:

Добрый вечер. Не пробовали так?

И Вам вечер добрый. Попробовал - однофигственно.

Результат одинаковый. Ошибка лезет в журнале на каждый тик.

За идею спасибо. Если SeriesInfoInteger() не обращается к Bars внутри себя, тогда всё более вероятно, что это "узкий" косяк данных на сервере брокера.

И это тоже удовлетворительный ответ на мой вопрос.

Ведь я же не понимаю, где ошибка всплывёт, могу ли я её избежать и т.п.

 
Fry:

И Вам вечер добрый. Попробовал - однофигственно.

Результат одинаковый. Ошибка лезет в журнале на каждый тик.

За идею спасибо. Если SeriesInfoInteger() не обращается к Bars внутри себя, тогда всё более вероятно, что это "узкий" косяк данных на сервере брокера.

И это тоже удовлетворительный ответ на мой вопрос.

Ведь я же не понимаю, где ошибка всплывёт, могу ли я её избежать и т.п.

Возможно действительно ошибка у брокера, т.к. по сообщению удаляются какие-то "битые" бары... либо на пути данные успевают "убиться". Но, это только догадки с моей стороны. Кстати, а GetLastError() дает что-нибудь? Да, и что возвращает Bars()?
 
Tapochun:
Возможно действительно ошибка у брокера, т.к. по сообщению удаляются какие-то "битые" бары... либо на пути данные успевают "убиться". Но, это только догадки с моей стороны. Кстати, а GetLastError() дает что-нибудь? Да, и что возвращает Bars()?

Если Bars() возвращает 0, тогда приходит ошибка 4001 (ERR_INTERNAL_ERROR  4001  Неожиданная внутренняя ошибка).

Но через раз Bars() всё-таки возвращает кол-во баров и тогда ошибки нет (Bars() не меняет статус ошибки).

 

МТ4 билд 722, ME4 билд 989

Пытаюсь копировать данные текущего нулевого бара:

      MqlRates rates[1];
      int n=CopyRates(_Symbol,PERIOD_CURRENT,time[0],1,rates); 
      Print("n=",n);

Принтуется n=0 т.е. данные не копируются.

Если вместо  PERIOD_CURRENT записать _Period то работает.

Если копировать данные не нулевого бара (time[1] и др.) то независимо от записи PERIOD_CURRENT или _Period  будет правильно.

P.S. В сд надо оформить? 

 
Fry:

Если Bars() возвращает 0, тогда приходит ошибка 4001 (ERR_INTERNAL_ERROR  4001  Неожиданная внутренняя ошибка).

Но через раз Bars() всё-таки возвращает кол-во баров и тогда ошибки нет (Bars() не меняет статус ошибки).

 "Неожиданность" ошибки еще раз наводит на мысль, что что-то не успевает дойти и удаляется, вследствие чего возникает ошибка. Насколько я понял, Вам нужно узнавать количество баров на D1..., а обязательно это делать на каждом тике? Как вариант, напишите функцию, которая будет запрашивать данные раз в минуту или реже. И посмотрите, будет ли возникать ошибка.

 
kPVT:

МТ4 билд 722, ME4 билд 989

Пытаюсь копировать данные текущего нулевого бара:

Принтуется n=0 т.е. данные не копируются.

Если вместо  PERIOD_CURRENT записать _Period то работает.

Если копировать данные не нулевого бара (time[1] и др.) то независимо от записи PERIOD_CURRENT или _Period  будет правильно.

P.S. В сд надо оформить? 

Добрый вечер. Попробуйте..., хотя, если есть альтернатива, они вряд ли кинутся искать этот недочет. У меня две заявки уже неделю висят... ни ответа, ни привета.
 
Fry:

Что делать? Как иначе узнать кол-во баров на таймфрейме D1?

Индюк запущен на D1?
 
MigVRN:
Индюк запущен на D1?

Нет конечно. В этом весь смысл. Ибо когда на D1 запущен сам индюк, у нас банально есть "const int rates_total, // размер входных таймсерий".

Ну вот конкретный пример использования.

Мы инициализировали пару индикаторов и получили их хендлы (тут всё ОК). Далее в функции онтик надо убедиться, что к моменту вызова на требуемых хендлах(внешних индюках) уже посчитаны все данные. И вот что я делаю:

   //not all data may be calculated
   if (BarsCalculated(hCCI)<rates_total) {Print("Not all data of trend CCI is calculated. Error#",GetLastError()); return(0);}
   if (Period()!=PERIOD_D1 && BarsCalculated(hDayTrand)<Bars(Symbol(),PERIOD_D1)) return(0);

Причём, в данном случае hDayTrand - это хендл рекурсивный (этот же индюк, только именно на D1 подгружен).

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

 
Fry:

Нет конечно. В этом весь смысл. Ибо когда на D1 запущен сам индюк, у нас банально есть "const int rates_total, // размер входных таймсерий".

Ну вот конкретный пример использования.

Мы инициализировали пару индикаторов и получили их хендлы (тут всё ОК). Далее в функции онтик надо убедиться, что к моменту вызова на требуемых хендлах(внешних индюках) уже посчитаны все данные. И вот что я делаю:

Причём, в данном случае hDayTrand - это хендл рекурсивный (этот же индюк, только именно на D1 подгружен).

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

ИМХО, надо обратиться к брокеру (Открытие, так понял). На реал-счетах у них же такого нету, значит дело в серверных настройках каких-либо, скорей всего.
Причина обращения: