//+------------------------------------------------------------------+ //| wave analysis.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" //---- indicator settings //#property indicator_separate_window #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Red #property indicator_color2 Green #property indicator_color3 Blue #property indicator_color4 Yellow #property indicator_width1 4 //---- indicator parameters extern int FastEMA=12; extern int SlowEMA=26; extern int SignalSMA=9; //---- indicator buffers double wave_baza[];//первый ЗЗ double wave_fzr[];//второй double wave_fzrQ[];//третий double wave_fzrQfzr[];//четвертый //---- buffers int v01=10; double ExCen[10]; datetime ExTime[10]; double ExCenF[10]; datetime ExTimeF[10]; double ExCenQ[10]; datetime ExTimeQ[10]; double ExCenQfzr[10]; datetime ExTimeQfzr[10]; //--- double macd[10000]; double signal[10000]; //--- int pusk,shift,InD,tip,tip01; double EXC,predExCenF,High_or_Bid,Low_or_Bid; datetime MomenTus,EXT,perMA; static int prevtime,prevtime02,prevtime03; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- drawing settings SetIndexStyle(0,DRAW_SECTION,EMPTY,4); SetIndexStyle(1,DRAW_SECTION,EMPTY,3); SetIndexStyle(2,DRAW_SECTION,EMPTY,2); SetIndexStyle(3,DRAW_SECTION,EMPTY,1); IndicatorDigits(Digits+1); //---- indicator buffers mapping SetIndexBuffer(0,wave_baza); SetIndexBuffer(1,wave_fzr); SetIndexBuffer(2,wave_fzrQ); SetIndexBuffer(3,wave_fzrQfzr); //SetIndexDrawBegin(0,Bars-1000); //SetIndexDrawBegin(1,Bars-1000); //---- name for DataWindow and indicator subwindow label //IndicatorShortName("wave_02("+FastEMA+","+SlowEMA+","+SignalSMA+")"); //SetIndexLabel(0,"MACD"); //SetIndexLabel(1,"Signal"); //---- initialization done return(0); } //+-------------------------------------------------------------------------------------------+ //| Определение волновой структуры рынка, и последующий его анализ на основе полученных данных| //+-------------------------------------------------------------------------------------------+ int start() { int i,limit; ArraySetAsSeries(macd,true); int counted_bars = IndicatorCounted(); if(counted_bars < 0) return(-1); if(counted_bars > 0) counted_bars--; limit = Bars - counted_bars; if(counted_bars==0) limit-=1+1+v01; //--01-- заполнение массивов экстремумами if(Time[0]!=prevtime) { prevtime = Time[0]; if(pusk==0) { //limit=ArraySize(macd); for(i=0; i=0; i--)// { if(false) {//limit==0 High_or_Bid=NormalizeDouble(Close[0],Digits); Low_or_Bid=NormalizeDouble(Close[0],Digits); } else { High_or_Bid=NormalizeDouble(High[i+1],Digits); Low_or_Bid=NormalizeDouble(Low[i+1],Digits); } //pusk=1; if(Time[i]!=prevtime02) { prevtime02=Time[i]; //расчет wave_baza EXC=0; EXT=0; if(macd[i+1]>0) { if(macd[i]<=0) { //if(perMA==Time[i])continue; //perMA=Time[i]; //Alert("время1=",TimeToStr(Time[0],TIME_DATE|TIME_MINUTES)); //Alert("i=",i,"[i+1]",MacdBuffer[i+1],"[i]",MacdBuffer[i]); if(MomenTus==0){MomenTus=Time[i];continue;}//первое пересечение if(ExCen[0]==0)shift=iBarShift(NULL,0,MomenTus,FALSE)-i;//используем до появления первого экст. else shift=iBarShift(NULL,0,ExTime[0],FALSE)-i-1;//ищем очередной экст. от предыдущего экст. if(shift<=0)Alert("shift"," ",shift); else { //-- InD=iHighest(NULL,0,MODE_HIGH,shift,i+1); EXC=nd(High[InD]); EXT=Time[InD]; } } } if(macd[i+1]<0) { if(macd[i]>=0) { //if(perMA==Time[i])continue; //perMA=Time[i]; //Alert("время2=",TimeToStr(Time[0],TIME_DATE|TIME_MINUTES)); //Alert("i=",i,"[i+1]",MacdBuffer[i+1],"[i]",MacdBuffer[i]); if(MomenTus==0){MomenTus=Time[i];continue;}//первое пересечение if(ExCen[0]==0)shift=iBarShift(NULL,0,MomenTus,FALSE)-i;//используем до появления первого экст. else shift=iBarShift(NULL,0,ExTime[0],FALSE)-i-1;//ищем очередной экст. от предыдущего экст. if(shift<=0)Alert("shift"," ",shift); else { //-- InD=iLowest(NULL,0,MODE_LOW,shift,i+1); EXC=nd(Low[InD]); EXT=Time[InD]; } } } if(EXC!=0) { for(int im=v01-1;im>=0;im--)//заполнение массивов новыми данными { if(im==0){ExCen[0]=EXC;ExTime[0]=EXT;break;} ExCen[im]=ExCen[im-1]; ExTime[im]=ExTime[im-1]; } wave_baza[InD]=EXC; EXC=0; EXT=0; //расчет wave_fzr if(ExCenF[1]==0) { ExCenF[0]=ExCen[0]; ExCenF[1]=ExCen[1]; ExTimeF[0]=ExTime[0]; ExTimeF[1]=ExTime[1]; wave_fzr[InD]=ExCenF[0]; tip=1; continue; } if(tip==1) { if(ExCenF[1]0) { shift=iBarShift(NULL,0,ExTimeF[0],FALSE)-i-1;//ищем очередной экст. от предыдущего экст. if(shift<=0)Alert("shift"," ",shift); else { InD=iLowest(NULL,0,MODE_LOW,shift,i+1); EXC=nd(Low[InD]); EXT=Time[InD]; } } } if(ExCenF[1]>ExCenF[0]) { if(macd[i]<0) { shift=iBarShift(NULL,0,ExTimeF[0],FALSE)-i-1;//ищем очередной экст. от предыдущего экст. if(shift<=0)Alert("shift"," ",shift); else { InD=iHighest(NULL,0,MODE_HIGH,shift,i+1); EXC=nd(High[InD]); EXT=Time[InD]; } } } if(EXC!=0) { if(EXC!=ExCenF[0]) { for(im=v01-1;im>=0;im--)//заполнение массивов новыми данными { if(im==0){ExCenF[0]=EXC;ExTimeF[0]=EXT;break;} ExCenF[im]=ExCenF[im-1]; ExTimeF[im]=ExTimeF[im-1]; } wave_fzr[InD]=EXC; EXC=0; EXT=0; tip=2; //continue; } } } } } if(tip==2) { EXC=0; EXT=0; if(ExCenF[1]Low_or_Bid)tip=1; else { if(ExCenF[0]ExCenF[0]) { if(ExCenF[1]Low_or_Bid) { shift=iBarShift(NULL,0,ExTimeF[0],FALSE)-i-1;//ищем очередной экст. от предыдущего экст. if(shift<=0)Alert("shift"," ",shift); else { InD=iHighest(NULL,0,MODE_HIGH,shift,i+1); EXC=nd(High[InD]); EXT=Time[InD]; } } } } if(EXC!=0) { if(EXC!=ExCenF[0]) { for(im=v01-1;im>=0;im--)//заполнение массивов новыми данными { if(im==0){ExCenF[0]=EXC;ExTimeF[0]=EXT;break;} ExCenF[im]=ExCenF[im-1]; ExTimeF[im]=ExTimeF[im-1]; } wave_fzr[InD]=EXC; EXC=0; EXT=0; tip=1; } } } //расчет wave_fzrQ if(predExCenF!=ExCenF[0]) { EXC=0; EXT=0; if(MathAbs(ExCenF[2]-ExCenF[1])Low_or_Bid) { EXC=ExCenF[0]; EXT=ExTimeF[0]; } } else { if(ExCenF[1]=0;im--)//заполнение массивов новыми данными { if(im==0){ExCenQ[0]=EXC;ExTimeQ[0]=EXT;break;} ExCenQ[im]=ExCenQ[im-1]; ExTimeQ[im]=ExTimeQ[im-1]; } shift=iBarShift(NULL,0,ExTimeF[0],FALSE); wave_fzrQ[shift]=EXC; EXC=0; EXT=0; predExCenF=ExCenF[0]; } } } } //расчет wave_fzrQfzr if(true) {//расчет wave_fzrQfzr EXC=0; EXT=0; if(ExCenQfzr[1]==0) { ExCenQfzr[0]=ExCenQ[0]; ExCenQfzr[1]=ExCenQ[1]; ExTimeQfzr[0]=ExTimeQ[0]; ExTimeQfzr[1]=ExTimeQ[1]; shift=iBarShift(NULL,0,ExTimeQ[0],FALSE); wave_fzrQfzr[shift]=ExCenQfzr[0]; continue; } if(tip01==1) { if(ExCenQfzr[1]>ExCenQfzr[0]) { if(ExCenQfzr[1]ExCenQ[0]) { EXC=ExCenQ[0]; EXT=ExTimeQ[0]; } } if(EXC!=0) { if(EXC!=ExCenQfzr[0]) { for(im=v01-1;im>=0;im--)//заполнение массивов новыми данными { if(im==0){ExCenQfzr[0]=EXC;ExTimeQfzr[0]=EXT;break;} ExCenQfzr[im]=ExCenQfzr[im-1]; ExTimeQfzr[im]=ExTimeQfzr[im-1]; } shift=iBarShift(NULL,0,ExTimeQ[0],FALSE); wave_fzrQfzr[shift]=EXC; EXC=0; EXT=0; tip01=0; } } } if(tip01==0) { EXC=0; EXT=0; if(ExCenQfzr[1]Low_or_Bid)tip01=1; else { if(ExCenQfzr[0]Low_or_Bid) { shift=iBarShift(NULL,0,ExTimeQfzr[0],FALSE)-i-1;//ищем очередной экст. от предыдущего экст. if(shift<=0)Alert("shift"," ",shift); else { InD=iHighest(NULL,0,MODE_HIGH,shift,i+1); EXC=nd(High[InD]); EXT=Time[InD]; } } } } if(EXC!=0) { if(EXC!=ExCenQfzr[0]) { for(im=v01-1;im>=0;im--)//заполнение массивов новыми данными { if(im==0){ExCenQfzr[0]=EXC;ExTimeQfzr[0]=EXT;break;} ExCenQfzr[im]=ExCenQfzr[im-1]; ExTimeQfzr[im]=ExTimeQfzr[im-1]; } wave_fzrQfzr[InD]=EXC; EXC=0; EXT=0; tip01=1; } } } } //--- } pusk=1; //Comment("0=",TimeToStr(ExTimeF[0],TIME_DATE|TIME_MINUTES),"1=",TimeToStr(ExTimeF[1],TIME_DATE|TIME_MINUTES),"2=",TimeToStr(ExTimeF[2],TIME_DATE|TIME_MINUTES)); //---- done return(0); } //+------------------------------------------------------------------+ double nd(double in_002f,string sy="") { if(sy=="")sy=Symbol(); return(NormalizeDouble(in_002f,MarketInfo(sy,MODE_DIGITS))); } //+------------------------------------------------------------------+