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

 
Aleksey Vyazmikin:

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

И потом, у Вас речь об индикаторной проверке, а я использую Bars для расчета корректного времени начала бара, так как iBarShift себе на уме и подходит только для форекса, где нет частого провалов с историей из-за клирингов и  торговых сессий не на весь день.

И где Ваша проверка? И зачем вводить какую-то переменную, если ( при подкачке истории или изменении истории) нужно просто пересчитать индикатор полностью. Как правило это делают от "0" до "rates_total-1".

 
Vladimir Karputov:

И где Ваша проверка? И зачем вводить какую-то переменную, если ( при подкачке истории или изменении истории) нужно просто пересчитать индикатор полностью. Как правило это делают от "0" до "rates_total-1".

У меня проблема не связана с индикатором или подкачкой истории. Вот кусок кода

      datetime         StartDt=iTime(Symbol(),PERIOD_CURRENT,Bars(Symbol(),PERIOD_CURRENT,iTime(Symbol(),TF_iDeltaP,0),iTime(Symbol(),PERIOD_CURRENT,0))-1);
      datetime         StopDt=iTime(Symbol(),PERIOD_CURRENT,1); //Берем прошлый бар, что б не было расхождений между реалом и тестером при задержки на реальных данных

      int BarsGo=Bars(Symbol(),PERIOD_CURRENT,StartDt,StopDt);
      if(StartDt>StopDt)BarsGo=0;
      if(StartDt==StopDt)BarsGo=1;
      if (BarsGo>0)
        {
                //Полный расчет с вычислениями - копирование массивов цен и прочие тяжелые функции
        }
      else
        {
                //Упрощенный расчет с присвоением эмпирических значений переменным
        }
Проблема возникает при открытии нового бара в общем то, когда дата начала бара больше, чем сдвиг на 1 бар от нулевого бара на текущем TF.
 
Aleksey Vyazmikin:

Это не защита, а препятствие для выявления ошибки в коде!

Более того, уж совсем не логично возвращать цифру 2, если даты совпадают - тут то какое обоснование?

Время начала бара на ФОРТС может не совпадать, что приводит к ошибкам вычисления, к примеру бар открывается не в 14:00, а в 14:05 - так же с этим промучился.

Может быть изначально делали так как написано в документации, а потом решили что лучше будет возвращать не 'от' и 'до', а 'между' указанными датами, но описание в документации не исправили. Да собственно это и не очень надо.

У меня на ФОРТС нет даже демки. Я не могу проверить.

 
Alexey Viktorov:

Может быть изначально делали так как написано в документации, а потом решили что лучше будет возвращать не 'от' и 'до', а 'между' указанными датами, но описание в документации не исправили. Да собственно это и не очень надо.

У меня на ФОРТС нет даже демки. Я не могу проверить.

Да как это может быть не надо, я ж не могу гадать, а если это ошибка, которую поправят позже, то код опять не будет работать, и буду я искать ошибку критически долго... А вот Артём решил, что это не ошибка, и по существу ничего не написал....

Вроде как на демо счете от MQ люди подключаются к ФОРТС...

 
Aleksey Vyazmikin:

Да как это может быть не надо, я ж не могу гадать, а если это ошибка, которую поправят позже, то код опять не будет работать, и буду я искать ошибку критически долго... А вот Артём решил, что это не ошибка, и по существу ничего не написал....

Вроде как на демо счете от MQ люди подключаются к ФОРТС...

Ну если вы сейчас достаточно внимательны и не можете перепутать время начала и время конца, то и опасаться нечего. Пусть правят.

 
Aleksey Vyazmikin:

У меня проблема не связана с индикатором или подкачкой истории. Вот кусок кода

Проблема возникает при открытии нового бара в общем то, когда дата начала бара больше, чем сдвиг на 1 бар от нулевого бара на текущем TF.
datetime StartDt=iTime(Symbol(),PERIOD_CURRENT,Bars(Symbol(),PERIOD_CURRENT,iTime(Symbol(),TF_iDeltaP,0),iTime(Symbol(),PERIOD_CURRENT,0))-1);
datetime StopDt=iTime(Symbol(),PERIOD_CURRENT,1); //Берем прошлый бар, что б не было расхождений между реалом и тестером при задержки на реальных данных

Нет ни одной проверки того, что возвращают iTime(), Bars()

А стоило бы. Настоятельно стоило. Гляньте в справку - что возвращают iTime() и Bars() ? И что написано в примечаниях?

 
Alexey Viktorov:

Ну если вы сейчас достаточно внимательны и не можете перепутать время начала и время конца, то и опасаться нечего. Пусть правят.

Просто не люблю сидеть и пассивно ждать, а конкретно об этом спрашивать у разработчиков мне запретили - изначально вопрос был к ним.

 
Artyom Trishkin:

Нет ни одной проверки того, что возвращают iTime(), Bars()

А стоило бы. Настоятельно стоило. Гляньте в справку - что возвращают iTime() и Bars() ? И что написано в примечаниях?

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

Какие именно предлагается делать проверки, на наличие текущего бара/истории? Как их лучше сделать?

 

Как найти причину такому сообщению?

2019.01.24 21:32:01.570 i-Regr4_05i (Si-3.19,M1)        indicator is too slow, 3011 ms. rewrite the indicator, please
 
Aleksey Vyazmikin:

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

Какие именно предлагается делать проверки, на наличие текущего бара/истории? Как их лучше сделать?

Вы не знаете как проверить возвращаемое значение на ноль? И не знаете как выйти из OnCalculate() с возвратом нуля? Вы никогда не пытались искать информацию по поиску на сайте?

  1. Получаем требуемое значение из функции
  2. Проверяем его на ноль
    1. Если ноль, то return 0;
    2. Если не ноль, то к п3
  3. Работаем с полученным значением
Никогда не думал, что буду рассказывать на этом ресурсе азы логики человеку с рейтингом, перевалившем за 13 тысяч...