Отлов MAX MIN

 

может быть ктонибуть пытался делать или делал такую вещь как отлов минимумов и максимумов индикатора? то что получилось у меня этой ночью конечно работает (хотя пока не дружит с индикаторами проходящими через ноль, но это я сейчас исправлю) но скажем при загрузке нетатрейдера и обработке RBCI на трех периодах можно минутку покурить...а в пиках загрузка машины до 80% бывает..пенек 3 1200 конечно но всеже...может кто знает как оптимизировать?

double MAX[6][4], MIN[6][4], PH[6][4], PL[6][4], R_FIRST[6];
int HR, n, m, i, j, sleeping, sv;
 
int start()
{
 
div(1);
Sleep(1000);
div(2);
Sleep(1000);
div(3);
//--------------------------
//-----ВЫВОД КОМЕНТАРИЯ-----
//--------------------------
  
Comment(
"\n",MAX[1][0],"  ",MAX[1][1],"  ",MAX[1][2],"  ",MAX[1][3],"   ",
"\n",MIN[1][0],"  ",MIN[1][1],"  ",MIN[1][2],"  ",MIN[1][3],"   ", 
"\n",R_FIRST[1],
"\n",
"\n",MAX[2][0],"  ",MAX[2][1],"  ",MAX[2][2],"  ",MAX[2][3],"   ",
"\n",MIN[2][0],"  ",MIN[2][1],"  ",MIN[2][2],"  ",MIN[2][3],"   ", 
"\n",R_FIRST[2],
"\n",
"\n",MAX[3][0],"  ",MAX[3][1],"  ",MAX[3][2],"  ",MAX[3][3],"   ",
"\n",MIN[3][0],"  ",MIN[3][1],"  ",MIN[3][2],"  ",MIN[3][3],"   ", 
"\n",R_FIRST[3],
"\n",
 
 
"\n");  
      
 
return(0);
}
 
 
 
 
 
 
void div(int id)
{
double R1, R2, R3, HIGH, LOW;
int bed, new, k, t, tt, period;
string ind;
//-----
double RSI0 = iCustom(NULL,period,"RSI",5,0,0);
double RSI1 = iCustom(NULL,period,"RSI",5,0,1);
double RSI2 = iCustom(NULL,period,"RSI",5,0,2);
 
double R_LAST=-10000;
int old=0;
bool f=false;
n=0; m=0; tt=0;
 
  for (i=0; i<=3; i++)
    {
    MAX[id][i]=0;
    MIN[id][i]=0;
    PL[id][i]=0;
    PH[id][i]=0;
    R_FIRST[id]=0;
    }
 
     if (id==1) {period=60  ; ind="RBCI"; k=1;}
else if (id==2) {period=240 ; ind="RBCI"; k=1;}
else if (id==3) {period=1440; ind="RBCI"; k=1;}
else if (id==4) {period=60  ; ind="STLM"; k=4;}
else if (id==5) {period=240 ; ind="STLM"; k=4;}
//-----
for (i=k; i<=100; i++) 
  {
  R1 = iCustom(NULL,period,ind,0,(i+k));                             
  R2 = iCustom(NULL,period,ind,0, i   );                              
  R3 = iCustom(NULL,period,ind,0,(i-k));  
  //-----
  HIGH=High[i];                                   //
  LOW=Low[i];                                     //
  for (j=-k; j<=k; j+=1)                          //
    {                                             // 
    if (High[i+j]>HIGH) {HIGH=High[i+j];}         //
    if (Low [i+j]<LOW ) {LOW =Low [i+j];}         //
    }                                             //
  //-----
     if (R2==0) {R2=-0.000001;}
     if (Ask<50) { if (MathAbs(R_LAST/R2)<1.05 && MathAbs(R_LAST/R2)>0.95) {bed=1;} 
                   else {bed=0;} }  // 
else if (Ask>50) { if (MathAbs(R_LAST/R2)<1.1  && MathAbs(R_LAST/R2)>0.9 ) {bed=1;} 
                   else {bed=0;} }  // 
  //-----
     if (i==1 && R3<R2 && R2>R1 && RSI2>RSI1 && RSI1>RSI0 && (RSI2-RSI0)>18 && 
         (RSI1-RSI0)>6) 
         {f=true ; t=1;}
else if (i==2 && R3<R2 && R2>R1 &&                                             
         (RSI1-RSI0)>7) 
         {f=true ; t=2;} 
else if (i >2 && R3<R2 && R2>R1 && m!=4                                                   ) 
         {f=true ; t=3;}
else                                                                                          
    {f=false; t=0;}
  //-----
  if (  f  ) 
    {
     if (  old==1 && R_LAST==MIN[id][n-1] && bed==0  ) {old=0;}                                                                                  
     if (  m!=0 && ((MathAbs(MAX[id][m-1]/R2)<1.05 && MathAbs(MAX[id][m-1]/R2)>0.95) || 
           R2>MAX[id][m-1]) && old!=1  ) {new=1;} else {new=0;}     
     if (  m == 0  ) {new=1;}                                                                                                                    
     if (  bed==1 && R_LAST==MIN[id][n-1]  ) {old=1;}                                                                       
else if (  bed==0 && new==1 && old!=1  ) {MAX[id][m]=R2; PH[id][m]=HIGH; R_LAST=R2; m++;}                                                        
else if (  old==1 && R2>MAX[id][m-1] && R_LAST==MAX[id][m-1]  ) {MAX[id][m-1]=R2; old=0; 
           R_LAST=R2; PH[id][m-1]=HIGH;}                           
     if (  R_FIRST[id]==0 || (R_FIRST[id]!=MIN[id][0] && R_FIRST[id]!=MAX[id][0])  ) 
           {R_FIRST[id]=MAX[id][0]; sv=i;}
    }
//-----
     if (i==1 && R3>R2 && R2<R1 && RSI2<RSI1 && RSI1<RSI0 && (RSI0-RSI2)>18 && 
         (RSI0-RSI1)>6) 
         {f=true ; t=1;}
else if (i==2 && R3>R2 && R2<R1 &&                                             
         (RSI0-RSI1)>7) 
         {f=true ; t=2;}     
else if (i >2 && R3>R2 && R2<R1 && n!=4                                                     
         ) 
         {f=true ; t=3;}
else                                                                                          
   {f=false; t=0;}
//-----
if (  f  ) 
  {  
     if (  old==1 && R_LAST==MAX[id][m-1] && bed==0  ) {old=0;}                                                                                  
     if (  n!=0 && ((MathAbs(MIN[id][n-1]/R2)<1.05 && MathAbs(MIN[id][n-1]/R2)>0.95) || 
           R2<MIN[id][n-1]) && old!=1  ) {new=1;} else {new=0;}     
     if (  n==0  ) {new=1;}                                                                                                                      
     if (  bed==1 && R_LAST==MAX[id][m-1]  ) {old=1;}                                                                          
else if (  bed==0 && new==1 && old!=1  ) {MIN[id][n]=R2; PL[id][n]=LOW; R_LAST=R2; n++;}                                                         
else if (  old==1 && R2<MIN[id][n-1] && R_LAST==MIN[id][n-1]  ) {MIN[id][n-1]=R2; old=0; 
           R_LAST=R2; PL[id][n-1]=LOW;}                            
     if (  R_FIRST[id]==0 || (R_FIRST[id]!=MIN[id][0] && R_FIRST[id]!=MAX[id][0])  ) 
           {R_FIRST[id]=MIN[id][0]; sv=i;}
  }
 
}
 
}
 
Почему бы не использовать ArrayMaximum() и ArrayMinimum(), при этом не забыв оптимизировать индикатор?
 

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

 
Нужен критерий экстремума. Находим Макс(Мин), делаем проверку на Экст, если не подошло - делим изучаемый отрезок в этой точке и опять ищем Макс(Мин), опять проверка, и так до победного конца

ЗЫ Код не смотрел, конечно - "как много девушек хороших ... "
 
а как же учесть что мне надо как минимум 2, а лучше 3 возрастающих максимума и столькоже убывающих минимумов? ведь такая тактика подойдет хорошо в том случае, если надо отрыть один экстремум на куске графика...
 
Ищи между минимумами максимумы , но опять по критерию.
 

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

 
Как это нет, а стандартный Zigzag и куча других зигзагов? Влом копать, видимо?
Алгоритм то один, это реализаций куча.
 
ЗЫ Кстати. Zigzag не курит минутку при поиске максимумом и минимумов. :)
 

зигзаг другая история! которая меня не интересует совершенно! а если сидение с утра до вечера перед монитором в течении 5 недель отрываясь на сон называется "влом" то это уже интересно. ..впервый раз сталкиваюсь с такой интерпритацией!

 

а минутки и не интересуют! мне нужны периоды больше часа! большие движения....отлов на индикаторе экстремумов и соответствующих им цен...в общем для дивера все это делается

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