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

 
Maxim Kuznetsov #:

чтобы пересчитывать даже на каждом тике (когда prev_calculated==rates_total), а не на каждом баре.

того-же эффекта можно добиться если не отнимать еденицу от цикла а возвращать rates_total-1.

Что кстати более соответствует логике функции OnCalculate - вернуть кол-во баров не требующих пересчёта

это не тот случай, тут к limit присваивается на первом запуске или при подкачке истории

или имеется ввиду весь с 0 пересчитывать, а зачем?

последний бар понятно на каждом тике можно дергать

какая-то не понятная схема, получается rates_total будет меньше  prev_calculated
 
lynxntech #:

это не тот случай, тут к limit присваивается на первом запуске или при подкачке истории

или имеется ввиду весь с 0 пересчитывать, а зачем?

последний бар понятно на каждом тике можно дергать

какая-то не понятная схема, получается rates_total будет меньше  prev_calculated

блин,да..

там цикл просто дурацкий из mt4, "цирк уехал, клоуны остались" - в нём предполагается что массивы как таймсерии, пересчёт от макс.индекса (limit) к 0, а чтобы limit не вышел за границы массивов отнимается 1. Из кол-ва (limit=rates_total-prev_calculated) делается соотв. индекс массива (limit=limit-1)

Топотня на ровном месте, потому у вас и затруднения в её прочтении.

 
lynxntech #:

это не тот случай, тут к limit присваивается на первом запуске или при подкачке истории

или имеется ввиду весь с 0 пересчитывать, а зачем?

последний бар понятно на каждом тике можно дергать

какая-то не понятная схема, получается rates_total будет меньше  prev_calculated


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


//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferXXX,EMPTY_VALUE); // инициализация буферов начальными значениями
     }
//--- Цикл
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // расчёт
     }

рассмотрим четыре примера.

пусть есть 10 баров -- 9 8 7 6 5 4 3 2 1 0


ситуация А -- начало расчёта

rates_total =10

prev_calculated =0

limit =10 -- и надо отнять 1, чтобы не был выход за пределы массива в цикле for(int i=limit; i>=0; i--) -- идёт перерасчёт всей истории от бара 9 до 0


ситуация В -- текущий бар

rates_total =10

prev_calculated =10

limit =0 -- идёт перерасчёт нового бара


ситуация С -- новый бар -- бары:  10 9 8 7 6 5 4 3 2 [1 0]

rates_total =11

prev_calculated =10 -- остановились на баре 1

limit =1 -- идёт перерасчёт только что закрытого бара 1 и нового бара 0


ситуация D -- отсутствовала связь бары:  10 9 8 7 [6 5 4 3 2 1 0]

rates_total =11

prev_calculated =5 -- остановились на баре 6

limit =11-5 =6 -- отнимается 1 по if(limit>1) -- идёт перерасчёт с бара 5, "закрытый" бар 6 не перерасчитывается, а должен был, чтобы отработать его закрытие на манер ситуации С

 

в принципе, можно заменить

   int limit=rates_total-prev_calculated;
   if(prev_calculated == 0)

но лучше использовать подход нумерации баров как в mql5 и отказаться от подхода mql4 по нумерации баров, когда текущий бар =0

 

да, и основной баг этой схемы:

//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferXXX,EMPTY_VALUE); // инициализация буферов начальными значениями
     }
//--- Цикл
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // расчёт
     }
в случае ситуации D -- произойдёт обнуление ранее рассчитанных данных
 
lynxntech #:

это не тот случай, тут к limit присваивается на первом запуске или при подкачке истории

или имеется ввиду весь с 0 пересчитывать, а зачем?

последний бар понятно на каждом тике можно дергать

какая-то не понятная схема, получается rates_total будет меньше  prev_calculated

Расчёт идёт от самого старого бара истории:

limit = rates_total - 1;

Если имеем всего 20 баров, то limit изначально равен 19, так как считаем-то до нулевого текущего бара.

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

К примеру, возьмём индикатор, который не просто рисует линию, которую можно нарисовать хоть от конца, хоть от начала истории совершенно одинаково, а индикатор, который, например, строит фибы, которые в свою очередь далее строятся от значений предыдущих фибо-уровней. Когда идём от начала истории, то мы будем правильно строить каждую фибу, так как данные уже слева все посчитаны, и мы получаем очередные данные так, как будто это текущие данные. У нас есть построенные фибо-уровни слева, а справа - неизвестная ещё история - всё как в реале. И строим очередные фибы не зная того, что есть справа - в "будущем". А теперь попробуйте построить тоже самое, но начиная от текущих данных к самым старым. Вот тут и начинается не просто "топотня на ровном месте", а реальная "беготня по тёмным комнатам с натягиванием сов на глобусы".

 
Andrey F. Zelinsky #:

в принципе, можно заменить

но лучше использовать подход нумерации баров как в mql5 и отказаться от подхода mql4 по нумерации баров, когда текущий бар =0

Значит - не делал сложных индикаторов. Можешь считать от текущих данных как в советнике. Но индикатор должен рассчитываться от начала истории. Если нужно сделать просто, и сделать правильно рассчитывающий индикатор.

 
Andrey F. Zelinsky #:
limit =11-5 =6 -- отнимается 1 по if(limit>1) -- идёт перерасчёт с бара 5, "закрытый" бар 6 не перерасчитывается, а должен был, чтобы отработать его закрытие на манер ситуации С

Если limit равен 6, то это значит, что limit больше 1. А при limit, большем единицы, идёт полный перерасчёт всего индикатора от rates_total-1 до нуля включительно.

Соответственно, не нужны тут никакие танцы с бубнами. Всё уже есть:

//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferXXX,EMPTY_VALUE); // инициализация буферов начальными значениями
     }
//--- Цикл
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // расчёт
     }
 
Artyom Trishkin #:

Значит - не делал сложных индикаторов

мы говорим о багах своей схемы -- исключим бестолковые личностные оценки кто чем занимался.

Artyom Trishkin #:

Можешь считать от текущих данных как в советнике

для индикаторов это не лучший подход -- сейчас нет желания пояснять почему -- но заморочки Метаквот по направлению индексации в mql5 введены не просто так https://www.mql5.com/ru/docs/series/bufferdirection
 
Andrey F. Zelinsky #:
на багах своей схемы

Схема не моя. Её предложил Витя Николаев. И в ней нет описанного тобою "бага". Остальное - дело вкуса каждого. Мне по вкусу именно такая простота и надёжность как у АК.