//+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ //| utter_up_dn.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=20; 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() {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=true; break; case 8: actual_back=true; break; case 9: actual_back=true; break; case 10: actual_back=true; break; case 11: actual_back=true; 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=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=true; break; case 23: actual_back=false; break; case 24: actual_back=false; break; case 25: actual_back=true; break; case 26: actual_back=true; 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; } 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] Low[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=true; break; case 8: actual_back=true; break; case 9: actual_back=true; break; case 10: actual_back=true; break; case 11: actual_back=true; 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=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=true; break; case 23: actual_back=true; break; case 24: actual_back=true; break; case 25: actual_back=true; break; case 26: actual_back=false; break; case 27: actual_back=true; break; case 28: actual_back=false; 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=true; break; case 2: actual_forward=true; break; case 3: actual_forward=true; break; case 4: actual_forward=true; 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=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=false; break; case 15: actual_forward=true; 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=false; break; case 23: actual_forward=true; break; case 24: actual_forward=false; break; case 25: actual_forward=true; break; case 26: actual_forward=true; break; case 27: actual_forward=true; break; case 28: actual_forward=true; 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) //если позади и впереди всё ОК { 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=High[i]; Dn_tmp=Low[i]; break; case 3: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 4: Up_tmp=0; Dn_tmp=Low[i]; break; case 5: Up_tmp=0; Dn_tmp=Low[i]; break; case 6: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 7: Up_tmp=0; Dn_tmp=Low[i]; break; case 8: Up_tmp=High[i]; Dn_tmp=Low[i]; break; case 9: Up_tmp=High[i]; Dn_tmp=0; break; case 10: Up_tmp=High[i]; Dn_tmp=Low[i]; 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=Low[i]; break; case 15: Up_tmp=High[i]; Dn_tmp=0; 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=0; Dn_tmp=Low[i]; break; case 23: Up_tmp=High[i]; Dn_tmp=0; break; case 24: Up_tmp=High[i]; 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=Low[i]; 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+2*Point; // Заполняется непосредственно массив Up Dn[i]=Dn_tmp-2*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]<=Low[NumberBar-1]) return(true); return(false); } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ // Возвращает тип паттерна при наличии на свече и верхнего и нижнего экстремумов //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ int IdentDualExtr(int NumberBar) { int j, type; bool up_back, dn_back, up_forward, dn_forward; string direction; j=NumberBar; //запоминаем бар на котором нашли нижний экстремум if(Open[NumberBar]Close[NumberBar]) direction="dn"; while(jLow[NumberBar]&&High[j]>High[NumberBar]&&Open[NumberBar]>Close[NumberBar]){up_back=true; dn_back=false; direction="dn"; break;} if(ExistUp(j)&&!ExistDn(j)&&High[j]>Low[NumberBar]&&High[j]Close[NumberBar]){up_back=false; dn_back=false; direction="dn"; break;} if(ExistUp(j)&&!ExistDn(j)&&High[j]>Low[NumberBar]&&High[j]>High[NumberBar]&&Open[NumberBar]Low[NumberBar]&&High[j]Low[NumberBar]&&High[j]>High[NumberBar]&&Open[NumberBar]==Close[NumberBar]){up_back=true; dn_back=false; direction="up"; break;} if(ExistUp(j)&&!ExistDn(j)&&High[j]>Low[NumberBar]&&High[j]Close[NumberBar]){up_back=false; dn_back=true; direction="dn"; break;} if(ExistDn(j)&&!ExistUp(j)&&Low [j]>Low [NumberBar]&&Low [j]Close[NumberBar]){up_back=false; dn_back=true; direction="dn"; break;} if(ExistDn(j)&&!ExistUp(j)&&Low [j]Low [NumberBar]&&Low [j]Low [NumberBar]&&Open[NumberBar]==Close[NumberBar]){up_back=false; dn_back=true; direction="up"; break;} } j=NumberBar; //запоминаем бар на котором нашли нижний экстремум while(j>NumberBar-review) //хотим пробежать по барам вперед по истории на величину review { j--; //наращиваем счетчик хода вперед по истории if(ExistUp(j)&&!ExistDn(j)&&High[j]>Low[NumberBar]&&High[j]>High[NumberBar]&&Open[NumberBar]>Close[NumberBar]){up_forward=true; dn_forward=false; direction="dn"; break;} if(ExistUp(j)&&!ExistDn(j)&&High[j]>Low[NumberBar]&&High[j]Close[NumberBar]){up_forward=true; dn_forward=false; direction="dn"; break;} if(ExistUp(j)&&!ExistDn(j)&&High[j]>Low[NumberBar]&&High[j]>High[NumberBar]&&Open[NumberBar]Low[NumberBar]&&High[j]Low[NumberBar]&&High[j]>High[NumberBar]&&Open[NumberBar]==Close[NumberBar]){up_forward=true; dn_forward=false; direction="up"; break;} if(ExistUp(j)&&!ExistDn(j)&&High[j]>Low[NumberBar]&&High[j]Close[NumberBar]){up_forward=false; dn_forward=true; direction="dn"; break;} if(ExistDn(j)&&!ExistUp(j)&&Low[j]Low [NumberBar]&&Open[NumberBar]>Close[NumberBar]){up_forward=false; dn_forward=false; direction="dn"; break;} if(ExistDn(j)&&!ExistUp(j)&&Low[j]Low [NumberBar]&&Open[NumberBar]Low [NumberBar]&&Open[NumberBar]==Close[NumberBar]){up_forward=false; dn_forward=true; direction="up"; break;} } if( up_back&& up_forward&&direction=="dn") type=1; if(!up_back&& up_forward&&direction=="dn") type=2; if(!up_back&& up_forward&&direction=="dn") type=3; if( up_back&& up_forward&&direction=="dn") type=4; if( up_back&& up_forward&&direction=="up") type=5; if( up_back&& up_forward&&direction=="up") type=6; if( up_back&& up_forward&&direction=="up") type=7; if( up_back&& up_forward&&direction=="up") type=8; if( dn_back&& dn_forward&&direction=="dn") type=9; if( dn_back&& dn_forward&&direction=="dn") type=10; if( dn_back&& dn_forward&&direction=="dn") type=11; if( dn_back&& dn_forward&&direction=="dn") type=12; if( dn_back&& dn_forward&&direction=="up") type=13; if(!dn_back&& dn_forward&&direction=="up") type=14; if( dn_back&& dn_forward&&direction=="up") type=15; if(!dn_back&& dn_forward&&direction=="up") type=16; if( dn_back&& up_forward&&direction=="dn") type=17; if( dn_back&& up_forward&&direction=="dn") type=18; if( dn_back&& up_forward&&direction=="dn") type=19; if( dn_back&& up_forward&&direction=="dn") type=20; if( dn_back&& up_forward&&direction=="up") type=21; if(!dn_back&& up_forward&&direction=="up") type=22; if( dn_back&&!up_forward&&direction=="up") type=23; if(!dn_back&&!up_forward&&direction=="up") type=24; if( up_back&& dn_forward&&direction=="dn") type=25; if( up_back&&!dn_forward&&direction=="dn") type=26; if(!up_back&& dn_forward&&direction=="dn") type=27; if(!up_back&&!dn_forward&&direction=="dn") type=28; if( up_back&& dn_forward&&direction=="up") type=29; if( up_back&& dn_forward&&direction=="up") type=30; if( up_back&& dn_forward&&direction=="up") type=31; if( up_back&& dn_forward&&direction=="up") type=32; return(type); } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------