//+------------------------------------------------------------------+ //| MultiZigZag MZZ9.mq4 | //+------------------------------------------------------------------+ /* 26 апреля 2009 г. Внешние параметры - строковые переменные. В каждую переменную записываются параметры для девяти зигзагов. Первая цифра - для первого зигзага, вторая - для второго, третья - для третьего, четвертая - для четвертого и т.д.. Через запятую. Выводится четыре первых зигзага, считая от текущего таймфрейма. Рассчитывается максимум 9 зигзагов. ExtDepth, ExtDeviation и ExtBackstep - стандартные параметры для зигзага. Если задать ExtDepth=0, то соответствующий зигзаг выводиться не будет. ExtMaxBar - количество баров, на которых рассчитывается зигзаг. GrossPeriod - периоды графиков, выраженные в минутах, по данным с которых строится зигзаг. При записи 0 зигзаг выводится на текущем таймфрейме. zzVisible 0 - соответствующий зигзаг не рассчитывается и не выводится на график, 1 - зигзаг рассчитывается. zzColor - задаются цвета для каждого таймфрейма. extColor - дополнительные цвета, если на одном таймфрейме выводится несколько зигзагов. ExtProcedureOfPayments - последовательность рассчета зигзагов: true - в порядке возрастания таймфрейма, false - в порядке убывания. showZigZag - варианты показа зигзагов. 0 - в виде ломаной линии. 1 - в виде ромбиков на экстремумах. 2 - в виде рядов точек на участке, принадлежащем бару того таймфрейма, по данным которого рассчитывается зигзаг, Как в DT-ZigZag ExtReCalculate - количество экстремумов зигзага, начиная с 0, пересчитываемых в режиме реального времени. Применяется для зигзагов со старших таймфреймов. ExtComplect - у нескольких индикаторов, запущенных на одной валютной паре в одном окне должны быть разные значения этого параметра */ #property link "nen" // Отрисовка индикатора в основном окне #property indicator_chart_window // Количество индикаторных буфферов #property indicator_buffers 8 // ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА //extern string ExtDepth = "12,0,0,0,0,0,0,0,0"; // отладочная последовательность extern string ExtDepth = "12,12,12,12,12,12,12,12,12"; extern string ExtDeviation = "5,5,5,5,5,5,5,5,5"; extern string ExtBackstep = "3,3,3,3,3,3,3,3,3"; extern string ExtMaxBar = "5000,1000,350,350,350,350,350,350,350,350"; // Количество обсчитываемых баров (0-все) extern string GrossPeriod = "1,5,15,30,60,240,1440,10080,43200"; // Таймфреймы, на которых рассчитываются зигзаги, 0 - текущий таймфрейм extern string zzVisible = "1,1,1,0,1,1,1,1,1"; extern string zzColor = "Tan,RoyalBlue,Aqua,SaddleBrown,Red,Yellow,Magenta,Purple,MediumSpringGreen"; extern string extColor = "Indigo,Olive,Teal"; extern bool ExtProcedureOfPayments = false; extern int showZigZag=0; extern int ExtReCalculate = 3; // Количество экстремумов зигзага старшего таймфрейма, начиная с 0, пересчитываемых // в режиме реального времени extern int ExtComplect = 0; int ExtDepth_[]={0,0,0,0,0,0,0,0,0}, ExtDeviation_[]={0,0,0,0,0,0,0,0,0}, ExtBackstep_[]={0,0,0,0,0,0,0,0,0}, ExtMaxBar_[]={0,0,0,0,0,0,0,0,0}, GrossPeriod_[]={0,0,0,0,0,0,0,0,0}, zzVisible_[]={0,0,0,0,0,0,0,0,0}; int zzColor_[]={0,0,0,0,0,0,0,0,0}, extColor_[]={0,0,0}, currentBars_[]={0,0,0,0,0,0,0,0,0}; // Индикаторные буферы double LowestBuffer1[],HighestBuffer1[],LowestBuffer2[],HighestBuffer2[],LowestBuffer3[],HighestBuffer3[],LowestBuffer4[],HighestBuffer4[]; // Вспомогательные буферы double LowestBufferGross1[],HighestBufferGross1[],LowestBufferGross2[],HighestBufferGross2[],LowestBufferGross3[],HighestBufferGross3[],LowestBufferGross4[],HighestBufferGross4[]; double LowestBufferGross5[],HighestBufferGross5[],LowestBufferGross6[],HighestBufferGross6[],LowestBufferGross7[],HighestBufferGross7[],LowestBufferGross8[],HighestBufferGross8[]; double LowestBufferGross9[],HighestBufferGross9[]; datetime time2[]={0,0,0,0,0,0,0,0,0}; // Флаги, показывающие, что со старшего тф первоначальное преобразование зигзага произведено bool Grosstf_DT[]={false, false, false, false, false, false, false, false, false}; // Флаги, показывающие, что на истории зигзаг построен bool ZZ_tf[]={false, false, false, false, false, false, false, false, false}; // Значение времени начала и конца третьего луча datetime L2LTime[]={0,0,0,0,0,0,0,0,0},L2HTime[]={0,0,0,0,0,0,0,0,0}; // При выходе за значения переменных lBar, hBar и tiZZ производится расчет зигзага // То есть только при выходе за пределы уже посчитанного бара производится расчет. // Это позволяет рассчитывать не на каждом тике. double lBar[]={0,0,0,0,0,0,0,0,0}, hBar[]={0,0,0,0,0,0,0,0,0}; datetime tiZZ[]={0,0,0,0,0,0,0,0,0}; // Массив для хранения значений Bars int saveBars[]={0,0,0,0,0,0,0,0,0}; int currentBars; // Массив для хранения порядка рассчета зигзагов. Какой зигзаг за каким рассчитывается. int ProcedureOfPayments[9][3]; // Переменная, хранящая количество баров, на которых рассчитывается зигзаг int limit; //+------------------------------------------------------------------+ //| Initialization function. Начало. | //+------------------------------------------------------------------+ int init() { int i,j,m,n,q; // По два индикаторных буффера использовано для вывода на график каждого зигзага SetIndexBuffer(0,LowestBuffer1); SetIndexBuffer(1,HighestBuffer1); SetIndexBuffer(2,LowestBuffer2); SetIndexBuffer(3,HighestBuffer2); SetIndexBuffer(4,LowestBuffer3); SetIndexBuffer(5,HighestBuffer3); SetIndexBuffer(6,LowestBuffer4); SetIndexBuffer(7,HighestBuffer4); // Установка значений индикатора, которые не будут видимы на графике SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); SetIndexEmptyValue(2,0.0); SetIndexEmptyValue(3,0.0); SetIndexEmptyValue(4,0.0); SetIndexEmptyValue(5,0.0); SetIndexEmptyValue(6,0.0); SetIndexEmptyValue(7,0.0); // Имена для окон данных и лэйбы для субъокон SetIndexLabel(0,"Low1" ); SetIndexLabel(1,"High1"); SetIndexLabel(2,"Low2" ); SetIndexLabel(3,"High2"); SetIndexLabel(4,"Low3" ); SetIndexLabel(5,"High3"); SetIndexLabel(6,"Low4" ); SetIndexLabel(7,"High4"); _stringtointarray (ExtDepth, ExtDepth_, 9); _stringtointarray (ExtDeviation, ExtDeviation_, 9); _stringtointarray (ExtBackstep, ExtBackstep_, 9); _stringtointarray (ExtMaxBar, ExtMaxBar_, 9); _stringtointarray (GrossPeriod, GrossPeriod_, 9); _stringtointarray (zzVisible, zzVisible_, 9); _stringtocolorarray (zzColor, zzColor_, 9); _stringtocolorarray (extColor, extColor_, 3); for (i=0;i<9;i++) { Grosstf_DT[i]=false; ZZ_tf[i]=false; j=GrossPeriod_[i]; GrossPeriod_[i]=_period(i,j); if (zzVisible_[i]>0 && ExtDepth_[i]>0) { m=ExtBackstep_[i]+ExtDepth_[i]; if ((ExtMaxBar_[i]>iBars(NULL,GrossPeriod_[i])-m) || (ExtMaxBar_[i]==0)) limit=iBars(NULL,GrossPeriod_[i])- m; else limit=ExtMaxBar_[i]; if (i==0) arr_resize(LowestBufferGross1, HighestBufferGross1, limit+m, i); else if (i==1) arr_resize(LowestBufferGross2, HighestBufferGross2, limit+m, i); else if (i==2) arr_resize(LowestBufferGross3, HighestBufferGross3, limit+m, i); else if (i==3) arr_resize(LowestBufferGross4, HighestBufferGross4, limit+m, i); else if (i==4) arr_resize(LowestBufferGross5, HighestBufferGross5, limit+m, i); else if (i==5) arr_resize(LowestBufferGross6, HighestBufferGross6, limit+m, i); else if (i==6) arr_resize(LowestBufferGross7, HighestBufferGross7, limit+m, i); else if (i==7) arr_resize(LowestBufferGross8, HighestBufferGross8, limit+m, i); else if (i==8) arr_resize(LowestBufferGross9, HighestBufferGross9, limit+m, i); } ProcedureOfPayments[i][0]=GrossPeriod_[i]; ProcedureOfPayments[i][1]=i; } ArraySort(ProcedureOfPayments,WHOLE_ARRAY,0,MODE_DESCEND); if (showZigZag<0) showZigZag=0; if (showZigZag>2) showZigZag=2; j=1;n=0;q=-1; for (i=0;i<9;i++) { if (ExtDepth_[i]==0 || zzVisible_[i]==0 || j>4) ProcedureOfPayments[i][2]=0; else if (GrossPeriod_[i]==0 || GrossPeriod_[i]>Period()) { if (GrossPeriod_[i]==q) { zzColor_[i]=extColor_[n]; n++; } q=GrossPeriod_[i]; if (j==1) { if (showZigZag==0) { SetIndexStyle(0,DRAW_ZIGZAG, EMPTY, 0, zzColor_[i]); SetIndexStyle(1,DRAW_ZIGZAG, EMPTY, 0, zzColor_[i]); } else { SetIndexStyle(0,DRAW_ARROW, EMPTY, 0, zzColor_[i]); SetIndexStyle(1,DRAW_ARROW, EMPTY, 0, zzColor_[i]); if (showZigZag==1) { SetIndexArrow(0, 116); SetIndexArrow(1, 116); } else { SetIndexArrow(0, 159); SetIndexArrow(1, 159); } } } else if (j==2) { if (showZigZag==0) { SetIndexStyle(2,DRAW_ZIGZAG, EMPTY, 0, zzColor_[i]); SetIndexStyle(3,DRAW_ZIGZAG, EMPTY, 0, zzColor_[i]); } else { SetIndexStyle(2,DRAW_ARROW, EMPTY, 0, zzColor_[i]); SetIndexStyle(3,DRAW_ARROW, EMPTY, 0, zzColor_[i]); if (showZigZag==1) { SetIndexArrow(2, 116); SetIndexArrow(3, 116); } else { SetIndexArrow(2, 159); SetIndexArrow(3, 159); } } } else if (j==3) { if (showZigZag==0) { SetIndexStyle(4,DRAW_ZIGZAG, EMPTY, 0, zzColor_[i]); SetIndexStyle(5,DRAW_ZIGZAG, EMPTY, 0, zzColor_[i]); } else { SetIndexStyle(4,DRAW_ARROW, EMPTY, 0, zzColor_[i]); SetIndexStyle(5,DRAW_ARROW, EMPTY, 0, zzColor_[i]); if (showZigZag==1) { SetIndexArrow(4, 116); SetIndexArrow(5, 116); } else { SetIndexArrow(4, 159); SetIndexArrow(5, 159); } } } else if (j==4) { if (showZigZag==0) { SetIndexStyle(6,DRAW_ZIGZAG, EMPTY, 0, zzColor_[i]); SetIndexStyle(7,DRAW_ZIGZAG, EMPTY, 0, zzColor_[i]); } else { SetIndexStyle(6,DRAW_ARROW, EMPTY, 0, zzColor_[i]); SetIndexStyle(7,DRAW_ARROW, EMPTY, 0, zzColor_[i]); if (showZigZag==1) { SetIndexArrow(6, 116); SetIndexArrow(7, 116); } else { SetIndexArrow(6, 159); SetIndexArrow(7, 159); } } } ProcedureOfPayments[i][2]=j; j++; } } if (ExtProcedureOfPayments) ArraySort(ProcedureOfPayments,WHOLE_ARRAY,0,MODE_ASCEND); else ArraySort(ProcedureOfPayments,WHOLE_ARRAY,0,MODE_DESCEND); currentBars=0; // Завершение инициализации return(0); } //+------------------------------------------------------------------+ //| Initialization function. Конец. | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Custom indicator deinitialization function. Начало. | //+------------------------------------------------------------------+ int deinit() { } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function. Конец. | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Расчет индикатора. Начало. | //+------------------------------------------------------------------+ int start() { int i, m, n; bool calculate; if (Bars-currentBars>1) { for (i=0;i<9;i++) { if (ProcedureOfPayments[i][2]>0) {saveBars[i]=0; currentBars_[i]=0;} } } currentBars=Bars; for (n=0;n<9;n++) { i=ProcedureOfPayments[n][1]; if (iBars(NULL, GrossPeriod_[i])-currentBars_[i]>1) {saveBars[i]=0;} currentBars_[i]=iBars(NULL, GrossPeriod_[i]); // проверки для корректного расчёта индикатора if ((ExtDepth_[i]*zzVisible_[i])==0) continue; m=ExtBackstep_[i]+ExtDepth_[i]; if ((currentBars_[i]-12) { calculate=true; Grosstf_DT[i]=false; ZZ_tf[i]=false; if ((ExtMaxBar_[i]>iBars(NULL,GrossPeriod_[i])-m) || (ExtMaxBar_[i]==0)) limit=iBars(NULL,GrossPeriod_[i])- m; else limit=ExtMaxBar_[i]; if (i==0) arr_resize(LowestBufferGross1, HighestBufferGross1, limit+m, i); else if (i==1) arr_resize(LowestBufferGross2, HighestBufferGross2, limit+m, i); else if (i==2) arr_resize(LowestBufferGross3, HighestBufferGross3, limit+m, i); else if (i==3) arr_resize(LowestBufferGross4, HighestBufferGross4, limit+m, i); else if (i==4) arr_resize(LowestBufferGross5, HighestBufferGross5, limit+m, i); else if (i==5) arr_resize(LowestBufferGross6, HighestBufferGross6, limit+m, i); else if (i==6) arr_resize(LowestBufferGross7, HighestBufferGross7, limit+m, i); else if (i==7) arr_resize(LowestBufferGross8, HighestBufferGross8, limit+m, i); else if (i==8) arr_resize(LowestBufferGross9, HighestBufferGross9, limit+m, i); if (ProcedureOfPayments[i][2]==1) { ArrayInitialize(LowestBuffer1,0); ArrayInitialize(HighestBuffer1,0); } else if (ProcedureOfPayments[i][2]==2) { ArrayInitialize(LowestBuffer2,0); ArrayInitialize(HighestBuffer2,0); } else if (ProcedureOfPayments[i][2]==3) { ArrayInitialize(LowestBuffer3,0); ArrayInitialize(HighestBuffer3,0); } else if (ProcedureOfPayments[i][2]==4) { ArrayInitialize(LowestBuffer4,0); ArrayInitialize(HighestBuffer4,0); } } else { if (lBar[i]>iLow(NULL,GrossPeriod_[i],0) || hBar[i]