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

 
Alexey Viktorov #:

В mql3 и не такое могло быть. Но это не значит, что и в mql5 сейчас надо делать такую проверку.

А как узнать что не надо?

Вот пожалуйста, из стандартного мт5 алигатора

   if(prev_calculated>rates_total || prev_calculated<0)
      to_copy=rates_total;



Про очистку буфера,  ее нужно делать если в индикаторе  CopyBuffer используется

 
lynxntech #:

А как узнать что не надо?

Наверное включить голову.

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

Вообще мне в мою больную голову пришло такое СМС. А зачем вообще проверка каждого действия на ошибку? Надо проверить как будет работать такой вариант:

В начале кода сбрасываем ошибку ResetLastError();, а в конце кода проверяем значение _LastError и если не 0, пересчитываем индикатор…

Наверное для советника такое не подходит, можно такого наколбасить… А для индикатора надо будет на досуге проверить.

 
Alexey Viktorov #:
Зачем заполнять массив пустым значением или нулём перед заполнением рабочими значениями?
Это называется инициализацией. 
Что будешь делать с неинициализированными данными в буфере, рисуемом с пропусками значений? 
 
Alexey Viktorov #:

Это где можно такое посмотреть? Когда бывает так, чтобы посчитанных баров было больше чем есть на графике???

И вот ещё тема для обсуждения:

Код из вашего сообщения

Зачем заполнять массив пустым значением или нулём перед заполнением рабочими значениями? Ведь по любому будет перебор всех баров и весь буфер будет заполнен…

prev_calculated - это не кол-во просчитанных баров, это просто цифира которую вернули из предыдущего OnCalculate. pass-touch значение

проверяет-ли её терминал на корректность или нет, неизвестно и может зависеть от билдов.

 
Artyom Trishkin #:
Это называется инициализации. 
Что будешь делать с неинициализированными данными в буфере с пропусками значений? 

Инициализация, это когда обязательно надо. А в некоторых случаях это просто трата времени.

Артём, я не сказал, что вообще не надо. Я понимаю такой подход в таких индикаторах как ZZ в которых не каждый бар имеет значение. Тут можно ещё посчитать что быстрей обрабатывается… Ведь при первом запуске перебираются в цикле все бары, проверяется надо-ли заполнить этот индекс буфера значением и только потом заполняется. Но ведь после проверки, если заполнять не надо, можно или заполнить пустым значением или просто перейти на следующий индекс, если массив инициализирован. В чём выгода в каком варианте? Да просто на любителя…

А взять такой индикатор как МА, то тут вообще инициализация массива абсолютная глупость. С моей точки зрения. Ведь в цикле каждая ячейка обязательно заполняется значением отличным от нуля. И плевать что в ячейке было перед заполнением, мусор или пустое значение.

 
lynxntech #:


Вот пожалуйста, из стандартного мт5 алигатора

Так эти индикаторы были написаны ещё на mql3 и потом просто переписывались на mql4 и на mql5. А переписывали их далеко не лучшие программисты компании. Эти индикаторы очень часто демонстрируют как не надо писать.

 
Alexey Viktorov #:
В чём выгода в каком варианте?

Голову себе не морочить при просчёте индикатора что заполнять, а что не заполнять пустым значением - уже заполнено. Немного упрощается логика расчёта - проще читать собственный код. Всё ИМХО, а то же есть ещё и любители стоя в гамаке...

 
lynxntech #:

А как узнать что не надо?

Вот пожалуйста, из стандартного мт5 алигатора

   if(prev_calculated>rates_total || prev_calculated<0)
      to_copy=rates_total;


-- этой проверкой можно пренебречь.

значение prev_calculated задаётся двумя способами -- 1) от движка терминала как нулевое значение -- и 2) программистом индикатора через return(rates_total)


за образец/основу остальной логики лучше брать примеры штатных функций в терминале -- например в МТ5 MACD.mq5 (логика индексации буферов слева направо):

-- для отработки буферов

   int start;
   if(prev_calculated==0)
      start=0;
   else
      start=prev_calculated-1;
//--- calculate MACD
   for(int i=start; i<rates_total && !IsStopped(); i++)

-- и для работы с CopyBuffer

      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0)
         to_copy++;


p.s. все примеры частных кодеров -- надо рассматривать как их частное (зачастую необоснованное) мнение -- которое перед заимствованием требует тестирования.

 
Andrey F. Zelinsky #:

-- этой проверкой можно пренебречь

Та тоже из штатного

 
lynxntech #:

Та тоже из штатного

штатные примеры я беру за основу -- эту проверку считаю лишней -- и не включаю в свой код

штатные примеры имеют статус "Документация" -- и являются официальной рекомендацией к использованию от компании-разработчика языка и терминала.