Скачать MetaTrader 5

Отлов MAX MIN

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
tutmas
101
tutmas  

может быть ктонибуть пытался делать или делал такую вещь как отлов минимумов и максимумов индикатора? то что получилось у меня этой ночью конечно работает (хотя пока не дружит с индикаторами проходящими через ноль, но это я сейчас исправлю) но скажем при загрузке нетатрейдера и обработке 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;}
  }
 
}
 
}
Rashid Umarov
Админ
13443
Rashid Umarov  
Почему бы не использовать ArrayMaximum() и ArrayMinimum(), при этом не забыв оптимизировать индикатор?
tutmas
101
tutmas  

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

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

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

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

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

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

tutmas
101
tutmas  

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий