Обсуждение статьи "Рецепты MQL5 - Создаем кольцевой буфер для быстрого расчета индикаторов в скользящем окне" - страница 3

 
Vasiliy Sokolov:

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


Попробую более развернуто ответить:

 есть достаточно тяжелый индикатор. В советнике он запрашивается достаточно редко, то есть пока не сработают все условия. К примеру через каждые, скажем так, 300-1000 баров(на самом деле это зависит от ряда условий, которые выражены в условных операторах). А если получать значение даже один раз на каждом баре, то это будет больше кол-во раз, чем спрятанный вызов индикатора в тело условных операторов. 

if(условие1)
{
if(условие2)
{
if(условие3)
{
if(условие4)
{
 и тут вызываю индикатор(mql4), такая ситуация встречается совсем редко
}
}
}
}

примерно так.

В принципе limit при таком подходе должен всегда равняться P.
 
forexman77:


Попробую более развернуто ответить:

 есть достаточно тяжелый индикатор. В советнике он запрашивается достаточно редко, то есть пока не сработают все условия. К примеру через каждые, скажем так, 300-1000 баров(на самом деле это зависит от ряда условий, которые выражены в условных операторах). А если получать значение даже один раз на каждом баре, то это будет больше кол-во раз, чем спрятанный вызов индикатора в тело условных операторов. 

Такой подход, кстати, не всегда дает экономию. Потому что пропущенные бары при вызове индикатора все равно просчитываются.
 
Andrey Khatimlianskii:
Такой подход, кстати, не всегда дает экономию. Потому что пропущенные бары при вызове индикатора все равно просчитываются.


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

Ну и конечно же, обсчитывать только новый бар, так как старые уже известны, с этим все и так понятно.

Сейчас подумал, что нужно строго с Р начинать без сравнения

if (limit > P)limit=P;//эту строку вообще убрать и сделать сразу limit=P;

Если в цикле расчет начнется с P, а он равняется к примеру 10, то расчет будет начиная с 10 бара. 

P=Period_+10;
  
limit=P;
for(int i=limit;i>=0;i--)

Но, это не столь важно, можно и по старому оставить. Не стоит оно того.

"пропущенные бары при вызове индикатора все равно просчитываются" можно подробней. 

Если честно, то сейчас у меня такие индикаторы имеют значение только на одном баре нулевом или первом.

К примеру вот основная часть кода одного из них:

int start()
  {
    double summaP,d,Q;

   summaP=0.0;
   for (int k=0;k<Period_;k++)
   {
   d=MathAbs(Close[k]-Close[k+1]);
   summaP=summaP+d;
   }
   if(summaP==0.0) summaP=0.000000001;
   Q=Close[0]-Close[Period_];  
   ExtMapBuffer1[0]=Q/summaP;

   return(0);
  }

То есть это индикаторы для тестера. Для визуализации они естественно не пойдут, в них ничего не видно)

Но, кольцевой буффер будет нужен, если индикатор состоит из нескольких буфферов, где один массив строится из другого.

 
forexman77:

"пропущенные бары при вызове индикатора все равно просчитываются" можно подробней. 

Допустим, вызвали индикатор, когда баров на графике было 1000, он их посчитал. Следующий вызов — баров 1001, он посчитал один бар.
Но если следующий вызов будет, когда баров уже 1500, он посчитает все новые (499) баров.


forexman77:

Если честно, то сейчас у меня такие индикаторы имеют значение только на одном баре нулевом или первом.

Тогда какой вообще смысл в индикаторах? Перенесите эти расчеты в виде функции в советника, будет еще быстрее.

 
forexman77:


Попробую более развернуто ответить:

Индикатор рассчитывается на каждом баре, не зависимо от того, вызываете Вы его или нет. Читайте спецификацию.

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

Ваша тема оффтоп для данной ветки. Давайте закончим на этом.

 

Уважаемый Василий

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

Я хотел бы спросить, можно ли выложить пример кода для раздела расчета максимумов/минимумов с кольцевым буфером? Мне сложно получить правильные результаты, когда рынок работает. Кажется, что я теряю указатель при обновлении меняющихся цен функцией OnChangeValue().

Заранее спасибо.

 
Savio Araujo:

Уважаемый Василий

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

Я хотел бы спросить, можно ли выложить пример кода для раздела расчета максимумов/минимумов с кольцевым буфером? Мне сложно получить правильные результаты, когда рынок работает. Кажется, что я теряю указатель при обновлении меняющихся цен функцией OnChangeValue().

Заранее спасибо.


Смотрите этот пример: https://www.mql5.com/ru/articles/3047#c6

 
Vasiliy Sokolov:

Смотрите этот пример: https://www.mql5.com/ru/articles/3047#c6


Я видел это. Я проверил приведенные вами примеры. Они показывают ту же проблему, что и у меня, когда я имею дело с обновлением значений во время работы рынка. Проверьте Стохастик, который вы предоставили. Добавление нового значения не является проблемой, но когда мы пытаемся использовать Stoch.ChangeLast() или OnChangeValue() в классе CRiMaxMin, это не работает. Он не изменяет значение соответствующим образом. Если бы вы могли проверить это или прислать пример рабочего кода, это было бы очень здорово.

Спасибо.

 

Отличная статья, человек умеет программировать!

Если бы только немецкий перевод не был таким ужасным!!!!!

Где я могу найти английскую версию?

Можно ли ее куда-нибудь переключить?

 
В ссылке:https://www.mql5.com/ru/articles/3047 замените ../en/... на ../en/...
Die Rezepte MQL5 - Die Erstellung des Ringpuffers für eine schnelle Berechnung der Indikatoren im gleitenden Fenster
Die Rezepte MQL5 - Die Erstellung des Ringpuffers für eine schnelle Berechnung der Indikatoren im gleitenden Fenster
  • 2017.05.29
  • Vasiliy Sokolov
  • www.mql5.com
Der Ringpuffer — ist die einfachste und zugleich die wirksamste Organisationsart der Daten für die Berechnungen im gleitenden Fenster. Im Artikel ist beschrieben, wie dieser Algorithmus gestaltet ist, und es ist gezeigt, wie mit seiner Hilfe eine Berechnung im gleitenden Fenster ein einfacher und wirksamer Prozess sein wird.