Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 623

 
Alexey Kozitsyn:

И в реальном времени при работе индикатора rates_total и Bars() будут увеличиваться. В OnInit() вы не сможете получить rates_total, т.к. параметр в функцию не передается. Проверку истории нужно в любом случае проводить в OnCalculate().

Т.е. нужно сделать отдельно индикатор, где сделать проверку на количество баров и если все ок, то заполнить графический буфер единицей, и соответственно в советнике ждать пока не получим единицу от индикатора, и только после этого продолжать работу, так?
[Удален]  
-Aleks-:
Т.е. нужно сделать отдельно индикатор, где сделать проверку на количество баров и если все ок, то заполнить графический буфер единицей, и соответственно в советнике ждать пока не получим единицу от индикатора, и только после этого продолжать работу, так?
Конечно нет... зачем такие сложности... Давайте еще раз. Какая цель? Получить всю доступную для расчетов историю?
 
Alexey Kozitsyn:
Конечно нет... зачем такие сложности... Давайте еще раз. Какая цель? Получить всю доступную для расчетов историю?

Ситуация такая, для правильной работы советнику нужно единожды произвести расчет на истории. Так вот, бывает так, что при включении терминала с этим советником в наличие есть история и соответственно происходит инициализация и расчет по ней, но эта история может оказаться не вся, а новая подгрузиться после подключения к терминалу.

Я так думаю, что можно отследить конннект с терминалом, потом если он есть, то сделать проверку на изменение последнего бара по HLCO и если оно есть, то ждем, а если в течении х секунд нет, то делаем расчет. 

[Удален]  
-Aleks-:

Ситуация такая, для правильной работы советнику нужно единожды произвести расчет на истории. Так вот, бывает так, что при включении терминала с этим советником в наличие есть история и соответственно происходит инициализация и расчет по ней, но эта история может оказаться не вся, а новая подгрузиться после подключения к терминалу.

Я так думаю, что можно отследить конннект с терминалом, потом если он есть, то сделать проверку на изменение последнего бара по HLCO и если оно есть, то ждем, а если в течении х секунд нет, то делаем расчет. 

Советник использует какие-либо кастомные (пользовательские) индикаторы?

Например, можно поступить так: проверяете размер истории через Bars(). Далее, смотрите, если Bars() > prev_bars+1 (размер истории на предыдущем тике) - тогда сбрасываете полностью все сохраненные данные и делаете полный пересчет советника с нуля. Эту конструкцию вставить первой в OnTick().

Не надо заморачиваться за коннект к терминалу, паузы и т.п. Самый простой вариант, чаще всего, самый лучший. 

 
Alexey Kozitsyn:

Советник использует какие-либо кастомные (пользовательские) индикаторы?

Например, можно поступить так: проверяете размер истории через Bars(). Далее, смотрите, если Bars() > prev_bars+1 (размер истории на предыдущем тике) - тогда сбрасываете полностью все сохраненные данные и делаете полный пересчет советника с нуля. Эту конструкцию вставить первой в OnTick().

Не надо заморачиваться за коннект к терминалу, паузы и т.п. Самый простой вариант, чаще всего, самый лучший. 

Советник много чего использует, в том числе и индикаторы.

Я так понимаю, при предложенном варианте перерасчет будет на каждом баре, или я не прав? 

[Удален]  
-Aleks-:

Советник много чего использует, в том числе и индикаторы.

Я так понимаю, при предложенном варианте перерасчет будет на каждом баре, или я не прав? 

Нет, почему на каждом? Полный пересчет эксперта будет только в том случае, если к истории добавилось более 1 бара! Если добавился 1 бар (образовался новый бар) - полного пересчета не будет.

Если Вы используете индикаторы, а в них есть глобальные переменные, то их нужно обнулять при первом запуске обязательно. Иначе на графике могут появляться артефакты/некорректно отображаться индикаторы. 

 
Alexey Kozitsyn:

Нет, почему на каждом? Полный пересчет эксперта будет только в том случае, если к истории добавилось более 1 бара! Если добавился 1 бар (образовался новый бар) - полного пересчета не будет.

Если Вы используете индикаторы, а в них есть глобальные переменные, то их нужно обнулять при первом запуске обязательно. Иначе на графике могут появляться артефакты/некорректно отображаться индикаторы. 

Не обратил внимание на +1 , спасибо, думаю это неплохой вариант.
 
Подскажите пожалуйста, от чего такое может получаться?

double A;
int x, y;

x=100; y=3; A=x/y=33.000
 
Leo59:
Подскажите пожалуйста, от чего такое может получаться?

double A;
int x, y;

x=100; y=3; A=x/y=33.000
Целый тип int x=100 / Целый тип int y=3 => Целое число 33.
Так как "А" - это вещественное число, то Целое число "33" преобразовывается к вещественному и получаем 33.0
 
Karputov Vladimir:
Спасибо Владимир!

Интересная особенность. Ищешь-ищешь в поисковике, ничего не находишь. Как только вопрос на форуме задашь, пока ответ ждёшь, сам его находишь ))


https://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • 2009.11.02
  • MetaQuotes Software Corp.
  • www.mql5.com
В данной заметке собраны советы по решению наиболее часто возникающих ошибок при работе с числами типа double в программах на MQL4.