MQL5 при отрисовке индикатора. - страница 5

 
Fedor Arkhipov:
Я этих индикаторов переделал больше сотни. Не забывайте, что это не обычный массив, а буфер индикатора.

Добро. Не забуду. А почему тогда такие вопросы с непониманием сути происходящего? Не буду говорить, что дело не в количестве, а в правильности.

Количественный показатель != качественному. И так у многих во фрилансе...

 
Вы хотите сказать, что опыт не приходит со временем? И что сделав 20 советников вы больше знаете чем человек который сделал 500-1000 советников?
 
Fedor Arkhipov:
Вы хотите сказать, что опыт не приходит со временем? И что сделав 20 советников вы больше знаете чем человек который сделал 500-1000 советников?

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

 

Соглашусь, инициализация в расчетах необходима.

Если вы этого не делаете, то все ваши сотни индикаторов, глючат при подгрузке истории.
Недавно тема была - человек искренне удивлялся, что в мт4 ему не гарантируют синхронизацию серии при первом расчете.

 
Fedor Arkhipov:

А вы всегда инициализируете буферы в функции OnCalculate() ? Скажу больше и никто не инициализирует в MT4 и в МТ5. Я много индикаторов за все время повидал. Откройте примеры МТ5 и МТ4 и посмотрите сначала.

При этом при вычислениях не обязательно также заполнять буфер значением EMPTY_VALUE  в MT4 и в МТ5. Нужно лишь заполнить нужные значения индикатора. А это значит, что буфер был инициализирован изначально.

Не говорите за всех, обязательно ошибетесь. В МТ4 не нужно инициализировать буферы начальными значениями, в МТ5 - нужно. Ваш код по инициализации правильный. Так и делайте. Еще рекомендую при формировании каждого нового бара проводить инициализацию всех rates_total-1 буферных значений, иначе мусор может появиться.

 
Taras Slobodyanik:

Соглашусь, инициализация в расчетах необходима.

Если вы этого не делаете, то все ваши сотни индикаторов, глючат при подгрузке истории.
Недавно тема была - человек искренне удивлялся, что в мт4 ему не гарантируют синхронизацию серии при первом расчете.

Как я понимаю, в мой огород камень. Дружище, Вы меня не убедили в обсуждении, что ошибки нет. Как и разработчики. То, что Вы научились обходить проблему, не значит, что ее нет.

 

Справедливости ради, в документации нет явного пояснения, что такое "пустое значение" (идентификатор PLOT_EMPTY_VALUE). Потому и возникают разнопонимания по части использования этого свойства.

Посмотрел документацию, нашел только в одном месте (как между прочим) явное пояснение https://www.mql5.com/ru/docs/customind/indicators_examples/draw_arrow:

Инициализация буферов пустым значением не производится

И топикстартер прав, SetIndexEmptyValue() в MQL4 не тоже самое, что PlotIndexSetDouble(...,PLOT_EMPTY_VALUE,...) в MQL5.

Мало того, PlotIndexSetDouble(...,PLOT_EMPTY_VALUE,...) в MQL4 и в MQL5 работают по-разному

Чтобы проверить, можно запустить код в МТ4 и в МТ5:

#property strict

//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers    1
//
double Buffer[];
//


//=++==============================================================++=
int OnInit()
{
   SetIndexBuffer(0, Buffer);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 25);
   //SetIndexEmptyValue(0, 25);//EMPTY_VALUE);
   //
   // ==========
   return(INIT_SUCCEEDED);
}


//=++==============================================================++=
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   int i, limit;
   //
   limit = rates_total - prev_calculated;
   if(prev_calculated > 0) limit++;
   //
   for(i = 0; i < limit; i++) Print("i=",i, " Buffer[i]=",Buffer[i]);
   //
   // ==========
   return(rates_total);
}

И увидим, что в МТ4 действительно происходит инициализация буфера "пустым значением" PLOT_EMPTY_VALUE.

Вкладка Эксперты МТ4:

Вкладка Эксперты МТ5:


 
Fedor Arkhipov:

А если прикрепить просто индикатор на график, тоже инициализации буферов нет.

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

 
Fedor Arkhipov:

А вы всегда инициализируете буферы в функции OnCalculate() ? Скажу больше и никто не инициализирует в MT4 и в МТ5. Я много индикаторов за все время повидал. Откройте примеры МТ5 и МТ4 и посмотрите сначала.

Это не так. Здесь вы откровенно заблуждаетесь.

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

p.s. Или приведите хоть один штатный пример MQL5, где явной инициализации буфера нет.

 

В МТ5 инициализация буфера индикатора производится в тестере стратегий. Вот что самое интересное, а на реальном графике нет.

А должно быть одинаково. Раз там нет то и там нет. Я про тестер и про график.

Причина обращения: