//+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ //| utter_up_dn_revision.mq4 | //| Copyright © 2011, RMM | //+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ #property copyright "Copyright © 2011, RMM" #property link "rmm@nm.ru" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Blue #property indicator_color2 Red double Up[]; double Dn[]; double Up_tmp; double Dn_tmp; int review=25; extern string с2= "Глубина просмотра истории в барах"; extern int QuantityOfBars=1000; //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //| Custom indicator initialization function //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ int init() { IndicatorBuffers(2); SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,217); SetIndexBuffer(0,Up); //параметр при вызове функцией iCustom mode=0 SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,218); SetIndexBuffer(1,Dn); //параметр при вызове функцией iCustom mode=1 return(0); } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //| Custom indicator deinitialization function //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ int deinit() { int obj_total=ObjectsTotal(); //Возвращает общее число объектов for(int i = obj_total - 1; i >= 0; i--) { string label = ObjectName(i); if(StringFind(label, "mark")==-1) continue; ObjectDelete(label); //Удаляем объекты созданные индикатором } return(0); } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //| Custom indicator iteration function //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ int start() { bool actual_back, actual_forward; int i,j, TypeDuo; //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ if(QuantityOfBars>Bars)QuantityOfBars=Bars; for(i=QuantityOfBars;i>1;i--) //основная итерация { //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //Найден верхний экстремум, отсутствует нижний экстремум //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ if(ExistUp(i)&&!ExistDn(i)) //если найден верхний экстремум { actual_back=false; //обнуляем флаг окейности при просмотре назад по истории j=i; //запоминаем бар на котором нашли верхний экстремум while(j=High[i]) {actual_back=false; break;} //если есть верхний экстремум и он выше или равен текущему, то наш верхний не действительный if(ExistDn(j)&&!ExistUp(j)&&Low [j]<=High[i]) {actual_back=true; break;} //если находим нижний экстремум и он ниже текущего, то наш верхний имеет право жить if(ExistDn(j)&&ExistUp(j)) //если находим и нижний и верхний экстремум { TypeDuo=IdentDualExtr(j); switch(TypeDuo) { case 1: actual_back=true; break; case 2: actual_back=true; break; case 3: actual_back=true; break; case 4: actual_back=true; break; case 5: actual_back=true; break; case 6: actual_back=true; break; case 7: actual_back=false; break; case 8: actual_back=true; break; case 9: actual_back=false; break; case 10: actual_back=false; break; case 11: actual_back=false; break; case 12: actual_back=false; break; case 13: actual_back=false; break; case 14: actual_back=false; break; case 15: actual_back=false; break; case 16: actual_back=false; break; case 17: actual_back=true; break; case 18: actual_back=true; break; case 19: actual_back=true; break; case 20: actual_back=true; break; case 21: actual_back=true; break; case 22: actual_back=false; break; case 23: actual_back=true; break; case 24: actual_back=true; break; case 25: actual_back=false; break; case 26: actual_back=false; break; case 27: actual_back=false; break; case 28: actual_back=false; break; case 29: actual_back=false; break; case 30: actual_back=false; break; case 31: actual_back=false; break; case 32: actual_back=false; break; } break; } } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ actual_forward=false; //обнуляем флаг окейности при просмотре вперед по истории j=i; //запоминаем бар на котором нашли верхний экстремум while(j>i-review) //хотим пробежать по барам вперед по истории на величину review { j--; //наращиваем счетчик хода вперед по истории if(ExistUp(j)&&!ExistDn(j)&&High[j]>High[i]) {actual_forward=false; break;} //если находим верхний экстремум и он выше текущего, то наш верхний не действительный if(ExistDn(j)&&!ExistUp(j)&&Low [j]<=High[i]) {actual_forward=true; break;} //если находим нижний экстремум и он ниже текущего, то наш верхний имеет право жить if(ExistDn(j)&&ExistUp(j)) //если находим и нижний и верхний экстремум { TypeDuo=IdentDualExtr(j); switch(TypeDuo) { case 1: actual_forward=true; break; case 2: actual_forward=true; break; case 3: actual_forward=false; break; case 4: actual_forward=false; break; case 5: actual_forward=true; break; case 6: actual_forward=true; break; case 7: actual_forward=true; break; case 8: actual_forward=true; break; case 9: actual_forward=false; break; case 10: actual_forward=false; break; case 11: actual_forward=false; break; case 12: actual_forward=false; break; case 13: actual_forward=false; break; case 14: actual_forward=false; break; case 15: actual_forward=false; break; case 16: actual_forward=false; break; case 17: actual_forward=false; break; case 18: actual_forward=false; break; case 19: actual_forward=false; break; case 20: actual_forward=false; break; case 21: actual_forward=false; break; case 22: actual_forward=false; break; case 23: actual_forward=false; break; case 24: actual_forward=false; break; case 25: actual_forward=true; break; case 26: actual_forward=true; break; case 27: actual_forward=false; break; case 28: actual_forward=false; break; case 29: actual_forward=true; break; case 30: actual_forward=true; break; case 31: actual_forward=true; break; case 32: actual_forward=true; } break; } } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ if(actual_back&&actual_forward) //если позади и впереди всё ОК { Up_tmp=High[i]; //заполняем массив Up через переменную Up_tmp } else Up_tmp=0; //если экстремум не действительный, то обнуляем массив через переменную Up_tmp //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ } //выполнено всё в случае если найден верхний экстремум else Up_tmp=0; //если верхнего экстремума не было, то обнуляем массив через переменную Up_tmp //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //Найден нижний экстремум, отсутствует верхний экстремум //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ if(ExistDn(i)&&!ExistUp(i)) //если найден нижний экстремум { actual_back=false; //обнуляем флаг окейности при просмотре назад по истории j=i; //запоминаем бар на котором нашли нижний экстремум while(j=Low[i]) {actual_back=true; break;} //если находим верхний экстремум и он выше текущего, то наш нижний имеет право жить if(ExistDn(j)&&ExistUp(j)) //если находим и нижний и верхний экстремум { TypeDuo=IdentDualExtr(j); switch(TypeDuo) { case 1: actual_back=false; break; case 2: actual_back=false; break; case 3: actual_back=false; break; case 4: actual_back=false; break; case 5: actual_back=false; break; case 6: actual_back=false; break; case 7: actual_back=false; break; case 8: actual_back=false; break; case 9: actual_back=true; break; case 10: actual_back=true; break; case 11: actual_back=false; break; case 12: actual_back=true; break; case 13: actual_back=true; break; case 14: actual_back=true; break; case 15: actual_back=true; break; case 16: actual_back=true; break; case 17: actual_back=false; break; case 18: actual_back=false; break; case 19: actual_back=false; break; case 20: actual_back=false; break; case 21: actual_back=false; break; case 22: actual_back=false; break; case 23: actual_back=false; break; case 24: actual_back=false; break; case 25: actual_back=true; break; case 26: actual_back=false; break; case 27: actual_back=true; break; case 28: actual_back=true; break; case 29: actual_back=true; break; case 30: actual_back=true; break; case 31: actual_back=true; break; case 32: actual_back=true; } break; } } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ actual_forward=false; //обнуляем флаг окейности при просмотре вперед по истории j=i; //запоминаем бар на котором нашли нижний экстремум while(j>i-review) //хотим пробежать по барам вперед по истории на величину review { j--; //наращиваем счетчик хода вперед по истории if(ExistDn(j)&&!ExistUp(j)&&Low [j]=Low[i]) {actual_forward=true; break;} //если находим верхний экстремум и он выше текущего, то наш нижний имеет право жить if(ExistDn(j)&&ExistUp(j)) //если находим и нижний и верхний экстремум { TypeDuo=IdentDualExtr(j); switch(TypeDuo) { case 1: actual_forward=false; break; case 2: actual_forward=false; break; case 3: actual_forward=false; break; case 4: actual_forward=false; break; case 5: actual_forward=false; break; case 6: actual_forward=false; break; case 7: actual_forward=false; break; case 8: actual_forward=false; break; case 9: actual_forward=true; break; case 10: actual_forward=true; break; case 11: actual_forward=true; break; case 12: actual_forward=true; break; case 13: actual_forward=true; break; case 14: actual_forward=true; break; case 15: actual_forward=false; break; case 16: actual_forward=false; break; case 17: actual_forward=true; break; case 18: actual_forward=true; break; case 19: actual_forward=true; break; case 20: actual_forward=true; break; case 21: actual_forward=true; break; case 22: actual_forward=true; break; case 23: actual_forward=false; break; case 24: actual_forward=false; break; case 25: actual_forward=false; break; case 26: actual_forward=false; break; case 27: actual_forward=false; break; case 28: actual_forward=false; break; case 29: actual_forward=false; break; case 30: actual_forward=false; break; case 31: actual_forward=false; break; case 32: actual_forward=false; } break; } } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ if(actual_back&&actual_forward) //если позади и впереди всё ОК { Dn_tmp=Low[i]; //заполняем массив Dn через переменную Dn_tmp } else Dn_tmp=0; //если экстремум не действительный, то обнуляем массив через переменную Dn_tmp //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ } //выполнено всё в случае если найден нижний экстремум else Dn_tmp=0; //если нижнего экстремума не было, то обнуляем массив через переменную Dn_tmp //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //Найден нижний экстремум, найден верхний экстремум //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ if(ExistDn(i)&&ExistUp(i)) //если найден и верхний и нижний экстремум { TypeDuo=IdentDualExtr(i); switch(TypeDuo) { case 1: Up_tmp=0; Dn_tmp=Low[i]; break; case 2: Up_tmp=0; Dn_tmp=Low[i]; break; case 3: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 4: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 5: Up_tmp=0; Dn_tmp=Low[i]; break; case 6: Up_tmp=0; Dn_tmp=Low[i]; break; case 7: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 8: Up_tmp=0; Dn_tmp=Low[i]; break; case 9: Up_tmp=High[i]; Dn_tmp=0; break; case 10: Up_tmp=High[i]; Dn_tmp=0; break; case 11: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 12: Up_tmp=High[i]; Dn_tmp=0; break; case 13: Up_tmp=High[i]; Dn_tmp=0; break; case 14: Up_tmp=High[i]; Dn_tmp=0; break; case 15: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 16: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 17: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 18: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 19: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 20: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 21: Up_tmp=0; Dn_tmp=0; break; case 22: Up_tmp=High[i]; Dn_tmp=0; break; case 23: Up_tmp=0; Dn_tmp=Low[i]; break; case 24: Up_tmp=0; Dn_tmp=Low[i]; break; case 25: Up_tmp=0; Dn_tmp=0; break; case 26: Up_tmp=0; Dn_tmp=Low[i]; break; case 27: Up_tmp=High[i]; Dn_tmp=0; break; case 28: Up_tmp=High[i]; Dn_tmp=0; break; case 29: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 30: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 31: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 32: Up_tmp=High[i]; Dn_tmp=Low[i]; break; } } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ if(!ExistDn(i)&&!ExistUp(i)) //если не найдены и верхний и нижний экстремум { Up_tmp=0; Dn_tmp=0; } Up[i]=Up_tmp+3*Point; // Заполняется непосредственно массив Up Dn[i]=Dn_tmp-3*Point; // Заполняется непосредственно массив Dn } return(0); } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ // Возвращает флаг существования верхнего экстремума //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ bool ExistUp(int NumberBar) { if(High[NumberBar+1]=High[NumberBar-1]) return(true); return(false); } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ // Возвращает флаг существования нижнего экстремума //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ bool ExistDn(int NumberBar) { if(Low[NumberBar+1]>=Low[NumberBar]&&Low[NumberBar]Close[NumberBar]) direction="dn"; while(jLow[NumberBar]) { if(High[j]>=High[NumberBar]){up_back=1; dn_back=0; break;} if(High[j]Low [NumberBar]){up_back=0; dn_back=2; break;} } } j=NumberBar; //запоминаем бар на котором нашли нижний экстремум while(j>NumberBar-review) //хотим пробежать по барам вперед по истории на величину review { j--; //наращиваем счетчик хода вперед по истории if(ExistUp(j)&&!ExistDn(j)&&High[j]>Low[NumberBar]) { if(High[j]>=High[NumberBar]){up_forward=1; dn_forward=0; break;} if(High[j]Low[NumberBar]){up_forward=0; dn_forward=2; break;} } } if(up_back==1 && up_forward==1 && direction=="dn") type=1; if(up_back==1 && up_forward==2 && direction=="dn") type=2; if(up_back==2 && up_forward==2 && direction=="dn") type=3; if(up_back==2 && up_forward==1 && direction=="dn") type=4; if(up_back==1 && up_forward==1 && direction=="up") type=5; if(up_back==1 && up_forward==2 && direction=="up") type=6; if(up_back==2 && up_forward==2 && direction=="up") type=7; if(up_back==2 && up_forward==1 && direction=="up") type=8; if(dn_back==1 && dn_forward==1 && direction=="dn") type=9; if(dn_back==1 && dn_forward==2 && direction=="dn") type=10; if(dn_back==2 && dn_forward==2 && direction=="dn") type=11; if(dn_back==2 && dn_forward==1 && direction=="dn") type=12; if(dn_back==1 && dn_forward==1 && direction=="up") type=13; if(dn_back==1 && dn_forward==2 && direction=="up") type=14; if(dn_back==2 && dn_forward==2 && direction=="up") type=15; if(dn_back==2 && dn_forward==1 && direction=="up") type=16; if(dn_back==1 && up_forward==1 && direction=="dn") type=17; if(dn_back==1 && up_forward==2 && direction=="dn") type=18; if(dn_back==2 && up_forward==2 && direction=="dn") type=19; if(dn_back==2 && up_forward==1 && direction=="dn") type=20; if(dn_back==1 && up_forward==1 && direction=="up") type=21; if(dn_back==1 && up_forward==2 && direction=="up") type=22; if(dn_back==2 && up_forward==2 && direction=="up") type=23; if(dn_back==2 && up_forward==1 && direction=="up") type=24; if(up_back==1 && dn_forward==1 && direction=="dn") type=25; if(up_back==1 && dn_forward==2 && direction=="dn") type=26; if(up_back==2 && dn_forward==2 && direction=="dn") type=27; if(up_back==2 && dn_forward==1 && direction=="dn") type=28; if(up_back==1 && dn_forward==1 && direction=="up") type=29; if(up_back==1 && dn_forward==2 && direction=="up") type=30; if(up_back==2 && dn_forward==2 && direction=="up") type=31; if(up_back==2 && dn_forward==1 && direction=="up") type=32; return(type); } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------