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

 
Artyom Trishkin #:

rates_total - это количество баров графика, доступных для просчёта. Иными словами - это Bars().

prev_calculated - это сколько баров индикатор просчитал на прошлом вызове OnCalculate(). Необходим для организации экономных просчётов.

Если prev_calculated равен rates_total, то это значит, что ещё ничего не было просчитано, и нужно инициализировать буферы индикатора и выполнить полный расчёт всей истории.

В общем случае, можно использовать такую конструкцию:

Почему тогда так и не писать вместо  rates_total - Bars() ?

int limit=Bars()-prev_calculated;

Извините, конечно, за ламерство. Роюсь в документации, несколько книг по МКЛ5. Не все нюансы поясняются. В книгах тоже. Отдельно по языку в книгах понятно. Как конструкции собираюстя-капут, что откуда и для чего... вобщем вникаю. Тьма всяких проверок, перепроверок. Открыл простой машки код, дак там строк столько. А казалось всего-то надо, выгрузить массив (или обратиться к нему), рассчитать для одного значения с такого-то индекса в массиве по такой-то, и пройтись скользящим окном этими расчётами по массиву указав индексами от куда до куда. Да вывести на экран линию. А нет. 
 
Novichokkk #:

Почему тогда так и не писать вместо  rates_total - Bars() ?

Извините, конечно, за ламерство. Роюсь в документации, несколько книг по МКЛ5. Не все нюансы поясняются. В книгах тоже. Отдельно по языку в книгах понятно. Как конструкции собираюстя-капут, что откуда и для чего... вобщем вникаю. Тьма всяких проверок, перепроверок. Открыл простой машки код, дак там строк столько. А казалось всего-то надо, выгрузить массив (или обратиться к нему), рассчитать для одного значения с такого-то индекса в массиве по такой-то, и пройтись скользящим окном этими расчётами по массиву указав индексами от куда до куда. Да вывести на экран линию. А нет. 

Можете и такую конструкцию использовать. Но зачем? Когда уже есть предопределённые переменные в параметрах обработчика...

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

 
Artyom Trishkin #:

Можете и такую конструкцию использовать. Но зачем? Когда уже есть предопределённые переменные в параметрах обработчика...

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

Артём, иногда любой человек устаёт и делает ошибки. Не сочти за критику, но rates_total - Bars() всегда будет ноль…

А вообще, этому персонажу объяснять очень сложно. Жертва ЕГЭ…

 
Alexey Viktorov #:

Артём, иногда любой человек устаёт и делает ошибки. Не сочти за критику, но rates_total - Bars() всегда будет ноль…

А вообще, этому персонажу объяснять очень сложно. Жертва ЕГЭ…

Да, ты прав. Не думал, что вот так кто-то решит подсчитывать. Краем глаза увидел Bars в рассчёте, и решил, что это вместо rates_total.

Бывает, спасибо.

 
Artyom Trishkin #:
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      // Присваиваем limit значение количества доступных баров-1
      limit=rates_total-1;
      // Вот тут нужно инициализировать все буферы пустыми значениями
      ArrayInitialize(Buffer0,EMPTY_VALUE);
      ArrayInitialize(Buffer1,0);
      ArrayInitialize(Buffer2,clrNONE);
      // ... и т.д.
     }
//--- Экономный просчёт индикатора
   for(int i=limit;i>=0;i--)
     {
      Buffer0[i]=(/*что-то там*/);
     }

Я понимаю, что вы хотели помочь человеку, но видимо по ошибке только запутали.

экономичный просчёт в данном случае выглядит немного по другому

for(int i=limit;i<rates_total;i++)
 
Aleksandr Slavskii #:

Я понимаю, что вы хотели помочь человеку, но видимо по ошибке только запутали.

экономичный просчёт в данном случае выглядит немного по другому

А что, Вы считаете, я написал не так? Обоснуйте, пожалуйста.

Чему равен limit, и откуда цикл будет в моём и Вашем примере.

 
Novichokkk #:

Почему тогда так и не писать вместо  rates_total - Bars() ?

По своей сути  rates_total и Bars()  это одно и то же, только Bars() это функция, соответственно её вызов обойдётся дороже по времени выполнения, чем прочесть значение переменной  rates_total.

 
Artyom Trishkin #:

А что, Вы считаете, я написал не так? Обоснуйте, пожалуйста.

Чему равен limit, и откуда цикл будет в моём и Вашем примере.

Упс)))

Вот это не правильно увидел

if(limit>1)

увидел совсем не то, что у вас написано.

Извиняюсь.

 
Alexey Viktorov #:

Артём, иногда любой человек устаёт и делает ошибки. Не сочти за критику, но rates_total - Bars() всегда будет ноль…

А вообще, этому персонажу объяснять очень сложно. Жертва ЕГЭ…

 rates_total - Bars() в предложении было. То есть   rates_total - это Bars().

В коде ниже ведь 

int limit=Bars()-prev_calculated;

Он прав.

Я, если что, ЕГЭ не сдавал. Тогда не было его.
 
Novichokkk #:

Не могу понять что в итоге значит  rates_total и prev_calculated.

В документации написано:  Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и соответствует количеству баров, доступных на графике.

Например   МА5, среднее от 5 баров, задать чтобы отобразилось на 100 барах. Тогда индикатор сделает расчёт с 104-го по 100-й бар и начнёт отрисовывать линию с 100-го бара. Тогда  rates_total=5, или 100, или 104?

   int limit = rates_total-100;

   if(prev_calculated <= 0)
     {
      // Вот тут нужно инициализировать все буферы пустыми значениями
      ArrayInitialize(Buffer0, EMPTY_VALUE);
      ArrayInitialize(Buffer1, 0);
      ArrayInitialize(Buffer2, clrNONE);
      // ... и т.д.
     }
   else
      limit = prev_calculated - 1;

//--- Экономный просчёт индикатора
   for(int i = limit; i < rates_total; i++)
     {
      Buffer0[i] = (/*что-то там*/);
     }

Так расчёт будет сделан на последних 100 бар.