ООП для школьников. - страница 9

 
Dmitry Fedoseev:

Если индикатор рассчитываешь слева направо, то если произошло какое-то событие, например фрактал образовался, нужно запомнить индекс бара с этим событием (что бы потом для чего-то использовать). Если индексация справа налево, надо сделать вычисление n=Bars-i и n запомнить, и потом обратное: i=Bars-n. А если индексация слева направо, то просто индекс запомнил и пользуешься им, он не изменится. Поскольку в боле-менее сложных индикаторах потребность в этом возникает всегда, то индексация слева направо, это большее облегчение в труде индикаторописателя.

Ну да. Я однажды начал писать один индикатор на mql4, 1/3 написал, следующая треть строилась на результатах первой и соответственно третья часть на значениях второй трети. И вот там я столкнулся с большой проблемой вычисления бара на котором сейчас то нужное значение. Но так случилось, что заказчик пропал и я его так и не закончил писать. А при индексации справа номер бара неизменен, достаточно во вспомогательный массив записывать номер бара и только этот массив прогонять для построения второй и третьей части...

 
Dmitry Fedoseev:

Если индикатор рассчитываешь слева направо, то если произошло какое-то событие, например фрактал образовался, нужно запомнить индекс бара с этим событием (что бы потом для чего-то использовать). Если индексация справа налево, надо сделать вычисление n=Bars-i и n запомнить, и потом обратное: i=Bars-n. А если индексация слева направо, то просто индекс запомнил и пользуешься им, он не изменится. Поскольку в боле-менее сложных индикаторах потребность в этом возникает всегда, то индексация слева направо, это большее облегчение в труде индикаторописателя.

О как. А потом терминал подгрузил историю и что?
 
Ihor Herasko:

Вот пример.

Спасибо, но

  1. К сожалению, это всё четвёрка
  2. Хотелось бы наглядный пример подключения такого индикатора без iCustom )))
 
Vladimir Simakov:
О как. А потом терминал подгрузил историю и что?

Да ничего особенного. Просто надо забыть о четвёрочном подходе

   int counted_bars=IndicatorCounted();
   int i,r,limit;

   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
         limit = Bars-counted_bars;
         if (ArrayRange(working,0) != Bars) ArrayResize(working,Bars);

   //
   //
   //
   //
   //
        
   for(i=limit, r=Bars-i-1; i >= 0; i--,r++)

И делать так

if(rates_total-prev_calculated > 1)
 {
  // Если это первый запуск или подгрузилась история пересчитаем весь индикатор.
 }
if(rates_total-prev_calculated >= 0)
 {
  // Пересчитаем только последнее изменение.
 }
 
#include <Indicators/Indicators.mqh>

CiADX adx;

int OnInit()
  {

   if(!adx.Create(Symbol(),Period(),14)){
      return(INIT_FAILED);
   }

   OnTick(); // это только для этого примера, чтобы на выходных сработало

   return(INIT_SUCCEEDED);
  }

void OnTick()
  {
   double buf[];
   
   if(adx.GetData(0,1,0,buf)==-1){
      return;
   }

   Comment(buf[0]);
   
  }
 
Vladimir Simakov:
О как. А потом терминал подгрузил историю и что?

А вы здесь откуда и зачем? Хоть один индикатор для МТ4 или МТ5 написали? Хоть бы с основами написания индикаторов для МетаТрейдерв стило бы ознакомиться.

 
Dmitry Fedoseev:

Потому-что они так никогда и не писали сложных, но быстрых индикаторов, иначе бы индексация слева-направо была решением очень важной задачи.

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

 
Alexey Volchanskiy:

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

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

 
Dmitry Fedoseev:

А вы здесь откуда и зачем? Хоть один индикатор для МТ4 или МТ5 написали? Хоть бы с основами написания индикаторов для МетаТрейдерв стило бы ознакомиться.

Дмитрий злой, ыщо не похмелился ))) 

 
Исправил немного. GetData() надо проверять на неравенство -1.
Причина обращения: