//+------------------------------------------------------------------+ //| Zigzag2_R_Color_Fibo_Grand_x3_Stat_Full_Arr.mq5 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ /* В стандартном индикаторе http://codebase.mql4.com/ru/238 для | рисования использовался стиль DRAW_SECTION. Этот стиль позволяет | рисовать отрезками только между точками, находящимимся на разных | барах. Стиль отрисовки DRAW_ZIGZAG позволяет снять это ограничение, | для этого используются два буфера вместо одного. Для иллюстрации | этого стиля и был написан Zigzag2_R_.mq5. | В код добавлена обработка внешнего бара (outside bar), когда High | текущего бара выше предыдущих, а Low текущего бара ниже предыдущих. | Блок обработки внешнего бара дан как пример. Вы можете использовать | свой алгоритм для такой ситуации. | //+------------------------------------------------------------------+ */ //---- авторство индикатора #property copyright "Copyright © 2005, MetaQuotes Software Corp." //---- ссылка на сайт автора #property link "http://www.metaquotes.net/" //---- номер версии индикатора #property version "1.00" #property description "ZigZag" //---- отрисовка индикатора в главном окне #property indicator_chart_window //+----------------------------------------------+ //| объявление констант | //+----------------------------------------------+ #define FIBO_LINES_TOTAL 7 // Константа для количества уровней фибо //+----------------------------------------------+ //---- для расчёта и отрисовки индикатора использован двадцать один буфер #property indicator_buffers 24 //---- использовано всего двадцать графических построений #property indicator_plots 20 //+----------------------------------------------+ //| Параметры отрисовки индикатора | //+----------------------------------------------+ //---- в качестве индикатора использован ZIGZAG #property indicator_type20 DRAW_COLOR_ZIGZAG //---- отображение метки индикатора #property indicator_label20 "ZigZag" //---- в качестве цвета линии индикатора использованы #property indicator_color20 clrMediumVioletRed,clrMediumSeaGreen //---- линия индикатора - сплошная #property indicator_style20 STYLE_SOLID //---- толщина линии индикатора равна 3 #property indicator_width20 3 //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input int ExtDepth=12; input int ExtDeviation=5; input int ExtBackstep=3; input int Shift=0; // сдвиг зигзага по горизонтали в барах input double FiboRatio =1.000; //Коэффициент домножения всех фибоуровней uint FiboTotal=1; //Количество дополнительных секторов Фибо сверху или снизу //---- input double FiboLevel1=0.000; //значение фибоуровня 1 //input ENUM_LINE_STYLE StyleLevel1=STYLE_SOLID; //стиль линии фибоуровня 1 input uint WidthLevel1=4; //толщина линии фибоуровня 1 input color Color_Level1 = clrDodgerBlue; //цвет фибоуровня 1 //---- input double FiboLevel2=0.236; //значение фибоуровня 2 //input ENUM_LINE_STYLE StyleLevel2=STYLE_SOLID; //стиль линии фибоуровня 2 input uint WidthLevel2=1; //толщина линии фибоуровня 2 input color Color_Level2= clrDarkViolet; //цвет фибоуровня 2 //---- input double FiboLevel3=0.382; //значение фибоуровня 3 //input ENUM_LINE_STYLE StyleLevel3=STYLE_DASH; //стиль линии фибоуровня 3 input uint WidthLevel3=1; //толщина линии фибоуровня 3 input color Color_Level3 = clrOrange; //цвет фибоуровня 3 //---- input double FiboLevel4=0.500; //значение фибоуровня 4 //input ENUM_LINE_STYLE StyleLevel4=STYLE_SOLID; //стиль линии фибоуровня 4 input uint WidthLevel4=2; //толщина линии фибоуровня 4 input color Color_Level4 = clrMagenta; //цвет фибоуровня 4 //---- input double FiboLevel5=0.618; //значение фибоуровня 5 //input ENUM_LINE_STYLE StyleLevel5=STYLE_DASH; //стиль линии фибоуровня 5 input uint WidthLevel5=1; //толщина линии фибоуровня 5 input color Color_Level5 = clrBlue; //цвет фибоуровня 5 //---- input double FiboLevel6=0.764; //значение фибоуровня 6 //input ENUM_LINE_STYLE StyleLevel6=STYLE_SOLID; //стиль линии фибоуровня 6 input uint WidthLevel6=1; //толщина линии фибоуровня 6 input color Color_Level6 = clrGray; //цвет фибоуровня 6 //---- input double FiboLevel7=1.000; //значение фибоуровня 7 //input ENUM_LINE_STYLE StyleLevel7=STYLE_SOLID; //стиль линии фибоуровня 7 input uint WidthLevel7=4; //толщина линии фибоуровня 7 input color Color_Level7 = clrDodgerBlue; //цвет фибоуровня 7 //+----------------------------------------------+ #define FIBO_LINES_TOTAL_XN_FULL FIBO_LINES_TOTAL*(1+FiboTotal*2)-FiboTotal*2 // Константа для количества уровней фибо //---- массивы переменных для линий Фибо double Values[]; color Colors[]; //ENUM_LINE_STYLE Styles[]; uint Widths[]; string FiboLineNames[]; //---- объявление динамических массивов, которые будут в дальнейшем использованы в качестве индикаторных буферов double ZigzagPeakBuffer[],ZigzagLawnBuffer[]; double HighMapBuffer[],LowMapBuffer[]; double ColorBuffer[]; int level=3; // recounting's depth bool downloadhistory=false; double dExtDeviation; //---- Объявление целых переменных начала отсчёта данных int min_rates_total; //+------------------------------------------------------------------+ //| Массивы переменных для создания индикаторных буферов | //+------------------------------------------------------------------+ class CIndicatorsBuffers { public: double ArrIndBuffer[]; }; //+------------------------------------------------------------------+ //| Создание индикаторных буферов | //+------------------------------------------------------------------+ CIndicatorsBuffers Ind[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //---- Инициализация переменных начала отсчёта данных min_rates_total=ExtDepth+ExtBackstep; dExtDeviation=ExtDeviation*_Point; //---- превращение динамических массивов в индикаторные буферы SetIndexBuffer(19,ZigzagLawnBuffer,INDICATOR_DATA); SetIndexBuffer(20,ZigzagPeakBuffer,INDICATOR_DATA); SetIndexBuffer(21,ColorBuffer,INDICATOR_COLOR_INDEX); //---- превращение динамических массивов в индикаторные буферы SetIndexBuffer(22,HighMapBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(23,LowMapBuffer,INDICATOR_CALCULATIONS); //---- запрет на отрисовку индикатором пустых значений PlotIndexSetDouble(19,PLOT_EMPTY_VALUE,NULL); //---- индексация элементов в буферах как в таймсериях ArraySetAsSeries(ZigzagLawnBuffer,true); ArraySetAsSeries(ZigzagPeakBuffer,true); ArraySetAsSeries(ColorBuffer,true); ArraySetAsSeries(HighMapBuffer,true); ArraySetAsSeries(LowMapBuffer,true); //---- установка позиции, с которой начинается отрисовка уровней Боллинджера PlotIndexSetInteger(19,PLOT_DRAW_BEGIN,min_rates_total); //---- Установка формата точности отображения индикатора IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //---- имя для окон данных и лэйба для субъокон string shortname; StringConcatenate(shortname,"Zigzag2_R_(ExtDepth=", ExtDepth,"ExtDeviation = ",ExtDeviation,"ExtBackstep = ",ExtBackstep,")"); IndicatorSetString(INDICATOR_SHORTNAME,shortname); //---- ArrayResize(Values,FIBO_LINES_TOTAL_XN_FULL); ArrayResize(Colors,FIBO_LINES_TOTAL_XN_FULL); //ArrayResize(Styles,FIBO_LINES_TOTAL_XN_FULL); ArrayResize(Widths,FIBO_LINES_TOTAL_XN_FULL); ArrayResize(FiboLineNames,FIBO_LINES_TOTAL_XN_FULL); ArrayResize(Ind,FIBO_LINES_TOTAL_XN_FULL); //---- Values[0]=FiboLevel1*FiboRatio; Values[1]=FiboLevel2*FiboRatio; Values[2]=FiboLevel3*FiboRatio; Values[3]=FiboLevel4*FiboRatio; Values[4]=FiboLevel5*FiboRatio; Values[5]=FiboLevel6*FiboRatio; Values[6]=FiboLevel7*FiboRatio; //---- FiboLineNames[0]="FiboLevel "+DoubleToString(100*Values[0],1); FiboLineNames[1]="FiboLevel "+DoubleToString(100*Values[1],1); FiboLineNames[2]="FiboLevel "+DoubleToString(100*Values[2],1); FiboLineNames[3]="FiboLevel "+DoubleToString(100*Values[3],1); FiboLineNames[4]="FiboLevel "+DoubleToString(100*Values[4],1); FiboLineNames[5]="FiboLevel "+DoubleToString(100*Values[5],1); FiboLineNames[6]="FiboLevel "+DoubleToString(100*Values[6],1); //---- Colors[0]=Color_Level1; Colors[1]=Color_Level2; Colors[2]=Color_Level3; Colors[3]=Color_Level4; Colors[4]=Color_Level5; Colors[5]=Color_Level6; Colors[6]=Color_Level7; //---- /* Styles[0]=StyleLevel1; Styles[1]=StyleLevel2; Styles[2]=StyleLevel3; Styles[3]=StyleLevel4; Styles[4]=StyleLevel5; Styles[5]=StyleLevel6; Styles[6]=StyleLevel7; */ //---- Widths[0]=WidthLevel1; Widths[1]=WidthLevel2; Widths[2]=WidthLevel3; Widths[3]=WidthLevel4; Widths[4]=WidthLevel5; Widths[5]=WidthLevel6; Widths[6]=WidthLevel7; for(int count=1; count<=int(FiboTotal); count++) for(int lev=1; lev<7; lev++) { int kkk=lev+6*(2*count-1); Values[kkk]=Values[lev]+count; Colors[kkk]=Colors[lev]; FiboLineNames[kkk]=FiboLineNames[lev]; //Styles[kkk]=Styles[lev]; Widths[kkk]=Widths[lev]; //---- kkk=lev+6*(2*count); Values[kkk]=-Values[7-lev]-count+1; FiboLineNames[kkk]="FiboLevel "+DoubleToString(100*Values[kkk],1); //Colors[kkk]=Colors[lev-1]; Colors[kkk]=Colors[7-lev]; //Styles[kkk]=Styles[lev-1]; Widths[kkk]=Widths[lev-1]; } //---- for(int numb=0; numbrates_total || prev_calculated<=0)// проверка на первый старт расчёта индикатора { limit=rates_total-min_rates_total; // стартовый номер для расчёта всех баров climit=limit; // стартовый номер для раскраски индикатора ArrayInitialize(ZigzagPeakBuffer,NULL); ArrayInitialize(ZigzagLawnBuffer,NULL); ArrayInitialize(HighMapBuffer,NULL); ArrayInitialize(LowMapBuffer,NULL); } else { limit=rates_total-prev_calculated; // стартовый номер для расчёта новых баров climit=limit+min_rates_total; // стартовый номер для раскраски индикатора //---- while(counterZ=0; iii--) { ZigzagPeakBuffer[iii] = NULL; ZigzagLawnBuffer[iii] = NULL; LowMapBuffer[iii]=NULL; HighMapBuffer[iii]=NULL; } } //---- индексация элементов в массивах как в таймсериях ArraySetAsSeries(high,true); ArraySetAsSeries(low,true); //---- Первый большой цикл расчёта индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { val=low[ArrayMinimum(low,bar,ExtDepth)]; //---- if(val==lastlow) val=NULL; else { lastlow=val; //---- if(low[bar]-val>dExtDeviation) val=NULL; else { //---- for(back=1; back<=ExtBackstep; back++) { res=LowMapBuffer[bar+back]; //---- if(res && res>val) LowMapBuffer[bar+back]=NULL; } } } //---- if(low[bar]==val) LowMapBuffer[bar]=val; else LowMapBuffer[bar]=NULL; //--- high val=high[ArrayMaximum(high,bar,ExtDepth)]; //---- if(val==lasthigh) val=NULL; else { lasthigh=val; //---- if(val-high[bar]>dExtDeviation) val=NULL; else { //---- for(back=1; back<=ExtBackstep; back++) { res=HighMapBuffer[bar+back]; //---- if(res && res=0 && !IsStopped(); bar--) { res=NULL; switch(whatlookfor) { // look for peak or lawn case 0: if(!lastlow && !lasthigh) { if(HighMapBuffer[bar]) { lasthigh=high[bar]; lasthighpos = bar; whatlookfor = -1; ZigzagPeakBuffer[bar]=lasthigh; res=1; } if(LowMapBuffer[bar]) { lastlow=low[bar]; lastlowpos=bar; whatlookfor=1; ZigzagLawnBuffer[bar]=lastlow; res=1; } } break; // look for peak case 1: if(LowMapBuffer[bar] && LowMapBuffer[bar] < lastlow && !HighMapBuffer[bar]) { ZigzagLawnBuffer[lastlowpos]=NULL; lastlowpos=bar; lastlow=LowMapBuffer[bar]; ZigzagLawnBuffer[bar]=lastlow; res=1; } if(HighMapBuffer[bar] && !LowMapBuffer[bar]) { lasthigh=HighMapBuffer[bar]; lasthighpos=bar; ZigzagPeakBuffer[bar]=lasthigh; whatlookfor=-1; res=1; } break; // look for lawn case -1: if(HighMapBuffer[bar] && HighMapBuffer[bar]>lasthigh && !LowMapBuffer[bar]) { ZigzagPeakBuffer[lasthighpos]=NULL; lasthighpos=bar; lasthigh=HighMapBuffer[bar]; ZigzagPeakBuffer[bar]=lasthigh; } if(LowMapBuffer[bar] && !HighMapBuffer[bar]) { lastlow=LowMapBuffer[bar]; lastlowpos=bar; ZigzagLawnBuffer[bar]=lastlow; whatlookfor=1; } break; default: return(rates_total); } } //---- Третий большой цикл раскраски индикатора for(bar=climit; bar>=0 && !IsStopped(); bar--) { Max=ZigzagPeakBuffer[bar]; Min=ZigzagLawnBuffer[bar]; if(!Max && !Min) ColorBuffer[bar]=ColorBuffer[bar+1]; if( Max && Min) { if(ColorBuffer[bar+1]==0) ColorBuffer[bar]=1; else ColorBuffer[bar]=0; } if( Max && !Min) ColorBuffer[bar]=1; if(!Max && Min) ColorBuffer[bar]=0; } //---- основной цикл расчёта индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { //---- объявления локальных переменных для построения фиб int bar1,bar2,sign; double price1,price2; //---- Построение Фибо bar1=FindFirstExtremum(bar,rates_total,ZigzagPeakBuffer,ZigzagLawnBuffer,sign,price1); if(bar1<0) continue; bar1=FindSecondExtremum(sign,bar1,rates_total,ZigzagPeakBuffer,ZigzagLawnBuffer,sign,price1); if(bar1<0) continue; bar2=FindSecondExtremum(sign,bar1,rates_total,ZigzagPeakBuffer,ZigzagLawnBuffer,sign,price2); if(bar2<0) continue; double range=price1-price2; for(int numb=0; numb=bar && !IsStopped(); index--) Ind[numb].ArrIndBuffer[index]=price2+range*Values[numb]; } //---- return(rates_total); } //+------------------------------------------------------------------+ //| Поиск самой первой вершины Зигзага в буферах таймсериях | //+------------------------------------------------------------------+ int FindFirstExtremum(int &StartPos,int Rates_total,double &UpArray[],double &DnArray[],int &Sign,double &Extremum) { //---- if(StartPos>=Rates_total)StartPos=Rates_total-1; for(int bar=StartPos; bar=Rates_total) StartPos=Rates_total-1; if(Direct==-1) for(int bar=StartPos; bar