Быстрый цикл баров истории по дате - страница 2

 
forex2030:

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

Так ведь на подобной логике и работают почти все индикаторы. Код, показанный Вами, именно это и делает. Проблема, скорее всего, в том, что все это перенесено в OnTimer, для которого IndicatorCounted() некорректно работает. В таком случае нужно просто повторить логику IndicatorCounted своими силами, запоминая количество посчитанных баров на последней итерации:

int g_nPrevCalculated = 0;

void OnTimer()
{
   int counted_bars = g_nPrevCalculated;

   ...

   g_nPrevCalculated = iBars(NULL, PERIOD_CURRENT);
}
 
forex2030:

У меня закачена история с 1999 года
Есть какой нибудь быстрый цикл баров истории с ограничением отображения по дате а не по барам ?
У индикатора отображать объекты на графике не по всей истории а с определённой даты, например с начала 2020 года

Или может есть быстрый цикл по всей истории но чтоб не тормозил график ?

Такой цикл не подходит, тяжело тащит

В прошлую пятницу меня попросили решить эту проблему. Времени в субботу и воскресенье не было, сделал во вторник, или в среду - не помню. 

Просто, не отображайте индикатор на всей истории, ограничьте глубину ретроспективы. Это не просто, а очень просто. У меня так: 


   int i=0, j=0, LastBottomBar=0, LastTopBar=0,
       History=Bars-1, BarsLost=History-IndicatorCounted();
   if( BarsLost<History ){
      if( BarsLost<1 ) return(0);                  // Не повторять на том-же баре
      i=BarsLost+RightWing2;                       // Число баров пересчета
   }
   else i=History-LeftWing1;                       // Просмотр на всей истории
   if( LastBottomTime > 0 ) LastBottomBar=iBarShift(NULL,0,LastBottomTime);
   if( LastTopTime    > 0 ) LastTopBar   =iBarShift(NULL,0,LastTopTime);
   if( BarsLimit > 0 && i > BarsLimit ) i=BarsLimit;
 

Я не совсем понимаю Ваш вопрос.

Лучше бы Вы выложили код индикатора, и тогда можно было бы что-то посоветовать конкретное.

Общая рекомендация делать код без дополнительных циклов, а дальше уже нужно смотреть, где у Вас "тяжёлые" расчёты.


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

Это работает так. При первом запуске индикатора IndicatorCounted() вернёт 0 баров, и цикл пройдёт по всем барам истории допустим 2000 баров.

Затем на следующем тике IndicatorCounted() вернёт число 2000, и основной цикл уже будет считать только последние два бара.

if (counted_bars>0) counted_bars--;

если 2000>0 тогда 2000-1=1999

limit = MathMin(Bars-counted_bars,Bars-1);

лимит будет равен 2000-1999=1.

for(i=limit; i>=0; i--)

цикл от 1 до 0.

И цикл при каждом последующем тике пересчитывает всего один предыдущий и один текущий бар.

Вот и всё, цикл ничего не весит. А все тормоза у Вас скорее всего в коде внутри этого цикла, но мы этот код не видим.


И главная причина непонимания на форуме: нужно говорить о том, что Вы хотите получить, а не то почему не работает, то что Вы делаете? Никто ведь не знает, какие идеи у Вас в голове. И возможно есть более простые решения этого вопроса.

Если смотреть на тот кусок, который Вы показали, возникает много вопросов:

- функция start() не используется в индикаторах, вместо неё используется OnCalculate,

- зачем использовать OnTimer, когда для приёма тиков предназначен OnCalculate,

- зачем Вы используете странную конструкцию if (counted_bars==0) {limit--; limit-=10;} else limit++;


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

 

ЗЫ Жутко работает форум. 

Пытаюсь ответить на пост - мне под курсор засовывают предложение скачать МТ5 (скачал уже 5 раз, кому от этого полегчало?). Пытаюсь раскрасить кусок кода - раскрашивается кусок текста сообщения. 

 

Спасибо добрые люди за помощь!!

По моим требованиям мне больше подходит такое решение, работает чисто, без лагов :

Алексей Тарабанов:
   int i=0, j=0, LastBottomBar=0, LastTopBar=0,
       History=Bars-1, BarsLost=History-IndicatorCounted();
   if( BarsLost<History ){
      if( BarsLost<1 ) return(0);                  // Не повторять на том-же баре
      i=BarsLost+RightWing2;                       // Число баров пересчета
   }
   else i=History-LeftWing1;                       // Просмотр на всей истории
   if( LastBottomTime > 0 ) LastBottomBar=iBarShift(NULL,0,LastBottomTime);
   if( LastTopTime    > 0 ) LastTopBar   =iBarShift(NULL,0,LastTopTime);
   if( BarsLimit > 0 && i > BarsLimit ) i=BarsLimit;

Подскажите пожалуйста что значит отмеченное и что ожидается если >0

 int i=0,MaxBars=0,
     bars=Bars-1,limit=bars-IndicatorCounted(),
     RightWing2=0,LeftWing1=0;
  
 if(limit<bars){
    if(limit<1) return(0); //Не повторять на том-же баре
    i=limit+RightWing2;    //Число баров пересчета
  } else i=bars-LeftWing1; //Просмотр на всей истории
 if(MaxBars>0 && i>MaxBars) i=MaxBars; //Если ограничиваем по барам 

 while(i >= 0)
      {
//Условия работы индикатора
  i--;}
Причина обращения: