//|----------------------------------------------------------------------| //| Quik Time Analizir | //|----------------------------------------------------------------------| //| | //| "Parameters for ZigZag" | //| | //|----------------------------------------------------------------------| //|ExtIndicator - выбор варианта индикатора, на основе которого | //| строятся паттерны Песавенто | //| 0 - Zigzag из метатрейдера, стандартный | //| 1 - Zigzag Алекса, | //| 2 - индикатор подобный встроенному в Ensign | //| 3 - ZigZag Ensign с переменным значением minBars | //| 4 - ZigZag, разработал tauber | //| 5 - вариация на тему свингов Ганна | //| 6 - DT-ZigZag с внешним ZigZag_new_nen3.mq4 | //| 7 - DT-ZigZag с внешним DT_ZZ.mq4 (разработал klot) | //| 8 - DT-ZigZag с внешним CZigZag.mq4 (разработал Candid) | //| 10 - DT-ZigZag с внешним Swing_zz - это ExtIndicator=5 | //| в режиме DT | //| 12 - ZigZag, разработал Talex | //| 13 - SQZZ зигзаг, разработал Товаровед | //| | //|minBars - фильтр баровый (задается количество баров) | //|minSize - фильтр по количеству пунктов (задается количество пунктов) | //| | //|ExtDeviation и ExtBackstep - параметры оставшиеся от ZigZag из MT4 | //| | //|GrossPeriod - значение таймфрейма, выраженное в минутах (число минут),| //| данные с которого берутся для построения ZigZag в режиме DT-ZigZag | //| | //|minPercent - процентный фильтр (задается процент, например 0.5) | //| Если используются проценты - ставите число, а minSize=0; | //| | //|ExtPoint=11 - количество точек зигзага для зигзага Talex | //| | //|ExtStyleZZ - = true - задает стиль линий ZigZag через вкладку ЦВЕТА | //| = false - Zigzag выводится точками у экстремумов | //| | //|ExtNumberPeak - включает нумерацию переломов ZigZag начиная с 1 | //|ExtNumberPeak10 - разрешает вывод номеров только у первых 10 переломов| //|ExtNumberPeakLow - вывод чисел только у Low или у High и Low | //|ExtNumberPeakColor - цвет чисел | //|ExtNumberPeakFontSize - размер чисел | //|----------------------------------------------------------------------| //| | //| "Parameters for Fibo Time" | //| | //|----------------------------------------------------------------------| //|ExtFiboTimeNum - задает переломы зигзага, от которых строятся | //| ExtFiboTime, не привязанные к вилам Эндрюса | //| | //|ExtFiboTimeHH- включает временные зоны фибо High-High | //| | //|ExtFiboTimeLH- включает временные зоны фибо Low-High | //| | //|ExtFiboTimeLL- включает временные зоны фибо Low-Low | //| | //|ExtFiboTimeHL- включает временные зоны фибо High-Low | //| | //|ExtFiboTimeHHC- задает цвет линий временной зоны High-High | //| | //|ExtFiboTimeLHC- задает цвет линий временной зоны Low-High | //| | //|ExtFiboTimeLLC- задает цвет линий временной зоны Low-Low | //| | //|ExtFiboTimeHLC- задает цвет линий временной зоны High-Low | //| | //|ExtVisibleDateTime- включает показ значений даты и времени временных | //| зон | //| | //|ExtVisibleNumberFiboTime- позволяет выделить те Fibo Time, у которых | //| необходимо показать значение даты и времени | //| | //| 1 - выводится значение даты и времени | //| 0 - не выводится | //| | //| первая цифра - для Fibo Time High-High | //| вторая цифра - для Fibo Time Low-High | //| третья цифра - для Fibo Time Low-Low | //| четвертая цифра - для Fibo Time High-Low | //| | //|ExtFiboFreeHH, ExtFiboFreeLH, ExtFiboFreeLL, ExtFiboFreeHL - задают | //| значения пользовательских Fibo Time | //|ExtFiboType = 0 - стандартные фибы | //| 1 - фибы с числами Песавенто и т.д. | //| 2 - фибы, заданные пользователем | //|----------------------------------------------------------------------| //| | //| "Common Parameters" | //| | //|----------------------------------------------------------------------| //|ExtObjectColor - задает цвет линии, соединяющей базовые точки объектов| //| | //|ExtObjectStyle - задает cтиль линии, | //| соединяющей базовые точки объектов| //| | //|ExtObjectWidth - задает толщину линии, | //| соединяющей базовые точки объектов| //| | //|ExtDinamic - разрешает вывод статических инструментов как динамических| //| при этом при появлении нового луча статические | //| инструменты перемещаются на другие переломы зигзага | //| | //|ZigZagHighLow - задает, от каких точек делать построение | //| паттернов Песавенто, вил Эндрюса и т.д. | //|true - от экстремумов баров | //|false - от переломов ZigZag, когда они висят в "воздухе" | //| | //|ExtBack - задает вывод всех объектов в виде фона | //| | //|ExtSave - разрешает сохранение комплекта статических вил и | //| Fibo Time | //| | //|ExtComplekt - задает номер индикатора. При выводе на график нескольких| //| индикаторов через этот параметр задается номер копии. | //| При этом все копии индикатора будут работать корректно. | //+----------------------------------------------------------------------+ #property copyright "nen" #property link "http://" // описание http:// #property stacksize 65535 #property indicator_separate_window #property indicator_buffers 6 #property indicator_color1 Magenta //Red //#property indicator_width6 5 #property indicator_color2 Green #property indicator_color3 Orange #property indicator_color4 LightSkyBlue #property indicator_color5 LemonChiffon //#property indicator_color4 Chartreuse //#property indicator_color5 Red #property indicator_color6 Magenta //Yellow #define pi 3.14159265 #define phi 1.61803399 //=================================== //---- indicator parameters extern string ______________0_____________ = "Parameters for ZigZag"; extern int ExtIndicator = 0; extern int minBars = 12; extern int minSize = 50; // Переменные от ZigZag из МТ extern int ExtDeviation = 8; extern int ExtBackstep = 3; // Переменная для nen-ZigZag extern int GrossPeriod = 1440; //---- extern double minPercent = 0; extern int ExtPoint=11; // количество точек зигзага для зигзага Talex extern bool ExtStyleZZ = true; // вывод номеров переломов зигзагов extern bool ExtNumberPeak = false; extern bool ExtNumberPeak10 = true; extern bool ExtNumberPeakLow = true; extern color ExtNumberPeakColor = Red; extern int ExtNumberPeakFontSize = 11; extern string ______________1_____________ = "Parameters Fibo Time"; // Временные зоны Фибо extern int ExtFiboTimeNum = 4; extern bool ExtFiboTimeHH = true; extern bool ExtFiboTimeLH = false; extern bool ExtFiboTimeLL = true; extern bool ExtFiboTimeHL = false; extern color ExtFiboTimeHHC = Teal; extern color ExtFiboTimeLHC = Sienna; extern color ExtFiboTimeLLC = DarkSlateGray; extern color ExtFiboTimeHLC = DimGray; extern bool ExtVisibleDateTime = false; extern string ExtVisibleNumberFiboTime = "1111"; extern string ExtFiboFreeHH = "0.382,0.618,1.0,1.618,2.618"; extern string ExtFiboFreeLH = "0.382,0.618,1.0,1.618,2.618"; extern string ExtFiboFreeLL = "0.382,0.618,1.0,1.618,2.618"; extern string ExtFiboFreeHL = "0.382,0.618,1.0,1.618,2.618"; extern int ExtFiboType = 1; extern string ______________2_____________ = "Common Parameters"; //-------------------------------------- extern color ExtObjectColor = CLR_NONE; extern int ExtObjectStyle = 1; extern int ExtObjectWidth = 0; extern bool ExtDinamic = false; extern bool ZigZagHighLow = true; // -------------------------------- // Дополнительные финкции // Вывод объектов в виде фона extern bool ExtBack = true; // Сохранение Fibo Time extern bool ExtSave = false; extern int ExtComplekt = 100; //=================================== // Массивы для ZigZag // Массив для отрисовки ZigZag double zz[]; // Массив минимумов ZigZag double zzL[]; // Массив максимумов ZigZag double zzH[]; // Массивы для nen-ZigZag double nen_ZigZag[]; // Переменные для расширенного режима работы индикатора int mft[]={0,0,0,0}; int NumWindow = -1; // Номер окна с индикатором double centrWin = 0; int tiks; // Счетчик начальных тиков double tret = 0; string nameQTA; // короткое имя индикатора для вычисления окна с индикатором // Переменные для оснастки string nameObj,save; // Матрица для поиска исчезнувших баров afr - массив значений времени пяти последних фракталов и отрисовки динамических и статических фиб // afrl - минимумы, afrh - максимумы int afr[]={0,0,0,0,0,0,0,0,0,0}; double afrl[]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}, afrh[]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}, afrx[]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; string TF[]={"MN","W1","D1","H4","H1","m30","m15","m5","m1"}; string Period_tf; bool afrm=true; bool newRay=true; int k,shift,shift1; //datetime point2; // время 2-ого экстремума зигзага. При его изменении появляется новый луч. // Время свечи с первым от нулевого бара фракталом int timeFr1new; // Бар, до которого надо пересчитывать от нулевого бара int numBar=0; // Номер объекта int numOb; // flagFrNew=true - образовался новый фрактал или первый фрактал сместился на другой бар. =false - по умолчанию. bool flagFrNew=false; // Период текущего графика int perTF; int counted_bars, cbi, iBar; // Переменные для ZigZag Алекса и индикатора подобного встроенному в Ensign double ha[],la[],hi,li,si,sip,di,hm,lm,ham[],lam[],him,lim,lLast=0,hLast=0; int fs=0,fsp,countBar; int ai,bi,ai0,bi0,aim,bim; datetime tai,tbi,ti; // fcount0 - при обнулении счетчика пропущенных баров на 0 баре fcount0=true. // На следующем баре =false и можно определять точку перелома bool fh=false,fl=false,fcount0; /* // Переменные для Свингов Ганна double lLast_m=0, hLast_m=0; int countBarExt; // счетчик внешних баров int countBarl,countBarh; */ // Переменные для nen-ZigZag bool hi_nen; bool init_zz=true; double hBar, lBar; datetime tiZZ; // Переменные для зигзага Talex static int endbar = 0; static double endpr = 0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string aa; string regim="", perc; IndicatorBuffers(8); // ------- if (ExtStyleZZ) {SetIndexStyle(0,DRAW_SECTION);} else {SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,158);} SetIndexStyle(3,DRAW_LINE,STYLE_DOT); SetIndexStyle(4,DRAW_LINE,STYLE_DOT); // Уровни предыдущих пиков SetIndexStyle(1,DRAW_LINE,STYLE_DOT); SetIndexStyle(2,DRAW_LINE,STYLE_DOT); SetIndexBuffer(1,ham); SetIndexBuffer(2,lam); // Уровни подтверждения SetIndexBuffer(3,ha); SetIndexBuffer(4,la); SetIndexBuffer(0,zz); SetIndexBuffer(5,nen_ZigZag); SetIndexBuffer(6,zzL); SetIndexBuffer(7,zzH); SetIndexStyle(5,DRAW_ARROW); SetIndexArrow(5,159); 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); if (ExtIndicator<6 || ExtIndicator>10) { switch (Period()) { case 1 : {Period_tf=TF[8];break;} case 5 : {Period_tf=TF[7];break;} case 15 : {Period_tf=TF[6];break;} case 30 : {Period_tf=TF[5];break;} case 60 : {Period_tf=TF[4];break;} case 240 : {Period_tf=TF[3];break;} case 1440 : {Period_tf=TF[2];break;} case 10080 : {Period_tf=TF[1];break;} case 43200 : {Period_tf=TF[0];break;} } } else { switch (GrossPeriod) { case 1 : {Period_tf=TF[8];break;} case 5 : {Period_tf=TF[7];break;} case 15 : {Period_tf=TF[6];break;} case 30 : {Period_tf=TF[5];break;} case 60 : {Period_tf=TF[4];break;} case 240 : {Period_tf=TF[3];break;} case 1440 : {Period_tf=TF[2];break;} case 10080 : {Period_tf=TF[1];break;} case 43200 : {Period_tf=TF[0];break;} } if (GrossPeriod>43200) { if (MathMod(GrossPeriod,43200)>0) Period_tf=GrossPeriod; else Period_tf=TF[0]+GrossPeriod/43200 + ""; } else if (GrossPeriod<43200) { if (GrossPeriod>10080) { if (MathMod(GrossPeriod,10080)>0) Period_tf=GrossPeriod; else Period_tf="W"+GrossPeriod/10080 + ""; } else if (GrossPeriod<10080) { if (GrossPeriod>1440) { if (MathMod(GrossPeriod,1440)>0) Period_tf=GrossPeriod; else Period_tf="D"+GrossPeriod/1440 + ""; } else if (GrossPeriod<1440) { if (GrossPeriod!=60) { if (MathMod(GrossPeriod,60)>0) Period_tf=GrossPeriod; else Period_tf="H"+GrossPeriod/60 + ""; } } } } } if (minPercent>0) perc=DoubleToStr(MathAbs(minPercent),1); else perc="0.0"; switch (ExtIndicator) { case 0 : {regim=" | "+ ExtIndicator + " / " + minBars + " / " + ExtDeviation + " / " + ExtBackstep; break;} case 1 : {regim=" | "+ ExtIndicator + " / " + minSize + " / " + perc+" %"; break;} case 2 : {regim=" | "+ ExtIndicator + " / " + minBars + "/" + minSize; break;} case 3 : {regim=" | "+ ExtIndicator + " / " + minBars; break;} case 4 : {regim=" | "+ ExtIndicator + " / " + minSize; break;} case 5 : {regim=" | "+ ExtIndicator + " / " + minBars; break;} case 6 : {regim=" | "+ ExtIndicator + " / " + GrossPeriod + " / " + minBars + " / " + ExtDeviation + " / " + ExtBackstep; break;} case 7 : {regim=" | "+ ExtIndicator + " / " + GrossPeriod + " / " + minBars; break;} case 8 : {regim=" | "+ ExtIndicator + " / " + GrossPeriod + " / " + minBars + " / " + ExtDeviation; break;} case 10 : {regim=" | "+ ExtIndicator + " / " + GrossPeriod + " / " + minBars; break;} case 11 : {regim=" | "+ ExtIndicator; break;} case 12 : {regim=" | "+ ExtIndicator + " / " + minSize; break;} case 13 : {regim=" | "+ ExtIndicator + " / " + minBars + " / " + minSize; break;} // case 14 : {regim=" | "+ ExtIndicator + " / " + StLevel + " / " + BigLevel + " / " + minBars; break;} } nameQTA="QTA "+Symbol()+" "+Period_tf + regim; IndicatorShortName(nameQTA); if (ExtIndicator==1) if (minSize!=0) di=minSize*Point/2; if (ExtIndicator==2) {di=minSize*Point; countBar=minBars;} if (ExtIndicator==3) {countBar=minBars;} if (ExtIndicator<6 ||ExtIndicator>10) GrossPeriod=Period(); if (ExtFiboType<0) ExtFiboType=0; if (ExtFiboType>2) ExtFiboType=2; // Проверка правильности введенных внешних переменных if (ExtFiboTimeNum<=1) ExtFiboTimeNum=0; if (ExtFiboTimeNum>9999) ExtFiboTimeNum=0; aa=DoubleToStr(ExtFiboTimeNum,0); mft[0]=StrToInteger(StringSubstr(aa,0,1)); mft[1]=StrToInteger(StringSubstr(aa,1,1)); mft[2]=StrToInteger(StringSubstr(aa,2,1)); mft[3]=StrToInteger(StringSubstr(aa,3,1)); ArraySort(mft,WHOLE_ARRAY,0,MODE_DESCEND); if (mft[0]<3) ExtFiboTimeNum=0; else { if (mft[1]==1) mft[1]++; if (mft[1]==0) {mft[1]=mft[0]-1; mft[2]=mft[1]-1;} if (mft[2]==0) mft[2]=mft[1]-1; if (mft[3]==0 && StringLen(aa)<4) mft[3]=mft[2]-1; } tiks = -1; if (ExtSave) { MathSrand(LocalTime()); save=MathRand(); } perTF=Period(); return(0); } //+------------------------------------------------------------------+ //| Деинициализация. Удаление всех трендовых линий и текстовых объектов //+------------------------------------------------------------------+ int deinit() { delete_objects_number(); ObjectDelete("ftHH"+ ExtComplekt+"_" + nameQTA );ObjectDelete("ftLH"+ ExtComplekt+"_" + nameQTA ); ObjectDelete("ftLL" + ExtComplekt+"_" + nameQTA);ObjectDelete("ftHL"+ ExtComplekt+"_" + nameQTA ); return(0); } //******************************************************** int start() // НАЧАЛО { if ((ExtIndicator==6 || ExtIndicator==7 || ExtIndicator==8 || ExtIndicator==10) && Period()>GrossPeriod) { ArrayInitialize(zz,0);ArrayInitialize(zzL,0);ArrayInitialize(zzH,0);ArrayInitialize(nen_ZigZag,0); init_zz=true; return; } counted_bars=IndicatorCounted(); if (NumWindow<1) { if (WindowFind(nameQTA)>=0) NumWindow=WindowFind(nameQTA); else { if (WindowsTotal()==2) NumWindow=1; } } if (tiks<2) { tiks++; centrWin=(WindowPriceMax(NumWindow) + WindowPriceMin(NumWindow))/2; tret=(WindowPriceMax(NumWindow)-centrWin)/3; } if (perTF!=Period()) { perTF=Period(); } //----------------------------------------- // // 1. // // Блок заполнения буферов. Начало. //----------------------------------------- // zz[] - буфер, данные из которого берутся для отрисовки самого ZigZag-a // zzL[] - массив минимумов черновой // zzH[] - массив максимумов черновой // //----------------------------------------- if (Bars-IndicatorCounted()>2) { cbi=Bars-1; tiZZ=0; if (ExtIndicator==1) {ti=0; ai=0; bi=0; tai=0; tbi=0; fs=0; si=0; sip=0;} lBar=0; hBar=0; ArrayInitialize(zz,0);ArrayInitialize(zzL,0);ArrayInitialize(zzH,0);ArrayInitialize(nen_ZigZag,0); init_zz=true; afrm=true;delete_objects_number(); } else { if (ExtIndicator==1) cbi=Bars-IndicatorCounted()-1; else cbi=Bars-IndicatorCounted(); if (lBar<=iLow(NULL,GrossPeriod,0) && hBar>=iHigh(NULL,GrossPeriod,0) && tiZZ==iTime(NULL,GrossPeriod,0)) return(0); else { lBar=iLow(NULL,GrossPeriod,0); hBar=iHigh(NULL,GrossPeriod,0); tiZZ=iTime(NULL,GrossPeriod,0); } } switch (ExtIndicator) { case 0 : {ZigZag_(); break;} case 1 : {ang_AZZ_(); break;} case 2 : {Ensign_ZZ(); break;} case 3 : {Ensign_ZZ(); break;} case 4 : {ZigZag_tauber();break;} case 5 : {GannSwing(); break;} case 6 : {nenZigZag(); break;} // DT-ZigZag - с исправленным, оптимизированным зигзагом ZigZag_new_nen3.mq4 case 7 : {nenZigZag(); break;} // DT-ZigZag - вариант зигзага, который любезно предоставил klot - DT_ZZ.mq4 case 8 : {nenZigZag(); break;} // DT-ZigZag - вариант зигзага, который любезно предоставил Candid - CZigZag.mq4 case 10 : {nenZigZag(); break;} // DT-ZigZag - вариант зигзага ExtIndicator=5 в режиме DT - внешний зигзаг Swing_zz.mq4 case 12 : {ZZTalex(minBars);break;} case 13 : {ZigZag_SQZZ();break;} // ZigZag товароведа } matriza(); //----------------------------------------- // Блок заполнения буферов. Конец. //----------------------------------------- //----------------------------------------- // Блок проверок. Начало. //----------------------------------------- if (Bars - counted_bars<3) { // Поиск времени бара первого экстремума, считая от нулевого бара for (shift1=0; shift10.0 && (zzH[shift1]==zz[shift1] || zzL[shift1]==zz[shift1])) { timeFr1new=Time[shift1]; break; } } // Поиск бара, на котором первый экстремум был ранее. shift=iBarShift(Symbol(),Period(),afr[0]); // Сравнение текущего значения экстремума с тем, который был ранее // Появился новый луч ZigZag if ((zzH[shift1]>0 && afrl[0]>0) || (zzL[shift1]>0 && afrh[0]>0)) { if (!ExtDinamic) { newRay=true; ExtNumberPeak=false; if (mft[3]>0 && tiks>1) ExtFiboTimeNum=0; } } // Образовался новый экстремум if (timeFr1new!=afr[0]) { flagFrNew=true; if (shift>=shift1) numBar=shift; else numBar=shift1; afrm=true; } // Экстремум на максимуме сдвинулся на другой бар if (afrh[0]>0 && zz[shift]==0.0) { flagFrNew=true; if (numBar3 && mft[3]==0) fiboTimeX(); afrm=true; } // Экстремум на минимуме сдвинулся на другой бар if (afrl[0]>0 && zz[shift]==0.0) { flagFrNew=true; if (numBar3 && mft[3]==0) fiboTimeX(); afrm=true; } //-----------3 Сместился максимум или минимум, но остался на том же баре. Начало. //============= 1 сместился максимум. Начало. if (afrh[0]-High[shift]!=0 && afrh[0]>0) { flagFrNew=true; numBar=0; afrx[0]=High[shift]; afrh[0]=High[shift]; } //============= 1 сместился максимум. Конец. // //============= 1 сместился минимум. Начало. if (afrl[0]-Low[shift]!=0 && afrl[0]>0) { flagFrNew=true; numBar=0; afrx[0]=Low[shift]; afrl[0]=Low[shift]; } //============= 1 сместился минимум. Конец. //-----------3 Сместился максимум или минимум, но остался на том же баре. Конец. matriza (); // Перезапись матрицы. } //----------------------------------------- // Блок проверок. Конец. //----------------------------------------- } // start // КОНЕЦ //---------------------------------------------------- // Подпрограммы и функции //---------------------------------------------------- //-------------------------------------------------------- // Формирование матрицы. Начало. // // Матрица используется для поиска исчезнувших экстремумов. // Это инструмент компенсации непредвиденных закидонов стандартного ZigZag-a. //------------------------------------------------------ void matriza() { if (afrm || tiks<2) { afrm=false; int shift,k; k=0; for (shift=0; shift0) { afrx[k]=zz[shift]; afr[k]=Time[shift]; if (zz[shift]==zzL[shift]) { if (ZigZagHighLow) afrl[k]=Low[shift]; else { if (k==0) afrl[k]=Low[shift]; else afrl[k]=zzL[shift]; } afrh[k]=0.0; } if (zz[shift]==zzH[shift]) { if (ZigZagHighLow) afrh[k]=High[shift]; else { if (k==0) afrh[k]=High[shift]; else afrh[k]=zzH[shift]; } afrl[k]=0.0; } k++; } } if ((newRay || mft[3]==0 || tiks<2) && ExtFiboTimeNum>2) fiboTimeX(); ExtSave=false; } if (newRay && ExtNumberPeak) NumberPeak(); newRay=false; } //-------------------------------------------------------- // Формирование матрицы. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Вывод номеров переломов зигзагов. Начало //-------------------------------------------------------- void NumberPeak() { int n=0,i,endNumber; string txt; if (ExtNumberPeak10) endNumber=iBarShift(Symbol(),Period(),afr[9]); else endNumber=Bars-minBars; delete_objects_number(); for (i=iBarShift(Symbol(),Period(),afr[0])+1;i0) { n++; if (ExtNumberPeakLow) { if (zzL[i]>0) { txt=DoubleToStr(n,0); nameObj="NPqta" + "_" + ExtComplekt + "_" + n; ObjectCreate(nameObj,OBJ_TEXT,NumWindow,Time[i],zz[i]); ObjectSetText(nameObj,txt,ExtNumberPeakFontSize,"Arial",ExtNumberPeakColor); } } else { txt=DoubleToStr(n,0); nameObj="NPqta" + "_" + ExtComplekt + "_" + n; ObjectCreate(nameObj,OBJ_TEXT,NumWindow,Time[i],zz[i]); ObjectSetText(nameObj,txt,ExtNumberPeakFontSize,"Arial",ExtNumberPeakColor); } } } } //-------------------------------------------------------- // Вывод номеров переломов зигзагов. Конец //-------------------------------------------------------- //-------------------------------------------------------- // Удаление объектов. Начало. // Удаление номеров переломов зигзага. //-------------------------------------------------------- void delete_objects_number() { int i; string txt; for (i=ObjectsTotal(); i>=0; i--) { txt=ObjectName(i); if (StringFind(txt,"NPqta" + "_" + ExtComplekt + "_")>-1) ObjectDelete (txt); } } //-------------------------------------------------------- // Удаление объектов. Конец. // Удаление номеров переломов зигзага. //-------------------------------------------------------- //-------------------------------------------------------- // фибо-Time. Начало. //-------------------------------------------------------- void fiboTimeX() { double cenaFT; if (ExtFiboTimeHH) { nameObj="FThh" + ExtComplekt+"_" + nameQTA; if (ExtSave) { nameObj=nameObj + save; } ObjectDelete(nameObj); cenaFT=centrWin + 2*tret; if (afrx[mft[0]]>afrx[mft[1]]) { ObjectCreate(nameObj,OBJ_FIBOTIMES,NumWindow,afr[mft[0]],cenaFT,afr[mft[2]],cenaFT); ObjectSet(nameObj,OBJPROP_LEVELCOLOR,ExtFiboTimeHHC); fiboTime (nameObj, afr[mft[0]], afr[mft[2]]-afr[mft[0]], 0, "HH_"); } else { ObjectCreate(nameObj,OBJ_FIBOTIMES,NumWindow,afr[mft[1]],cenaFT,afr[mft[3]],cenaFT); ObjectSet(nameObj,OBJPROP_LEVELCOLOR,ExtFiboTimeHHC); fiboTime (nameObj, afr[mft[1]], afr[mft[3]]-afr[mft[1]], 0, "HH_"); } } if (ExtFiboTimeLH) { nameObj="FTlh" + ExtComplekt+"_" + nameQTA; if (ExtSave) { nameObj=nameObj + save; } ObjectDelete(nameObj); cenaFT=centrWin + tret; if (afrx[mft[0]]>afrx[mft[1]]) { ObjectCreate(nameObj,OBJ_FIBOTIMES,NumWindow,afr[mft[1]],cenaFT,afr[mft[2]],cenaFT); ObjectSet(nameObj,OBJPROP_LEVELCOLOR,ExtFiboTimeLHC); fiboTime (nameObj, afr[mft[1]], afr[mft[2]]-afr[mft[1]], 1, "LH_"); } else ObjectCreate(nameObj,OBJ_FIBOTIMES,NumWindow,afr[mft[2]],cenaFT,afr[mft[3]],cenaFT); ObjectSet(nameObj,OBJPROP_LEVELCOLOR,ExtFiboTimeLHC); fiboTime (nameObj, afr[mft[1]], afr[mft[2]]-afr[mft[1]], 1, "LH_"); } if (ExtFiboTimeLL) { nameObj="FTll" + ExtComplekt+"_" + nameQTA; if (ExtSave) { nameObj=nameObj + save; } ObjectDelete(nameObj); cenaFT=centrWin-2*tret; if (afrx[mft[0]]2) { ftvisibleDT=ExtVisibleDateTime; ftvisible=ExtVisibleNumberFiboTime; } double fi_1[]={0.0, 1.0, 1.382, 1.5, phi, 1.786, 1.886, 2.0, 2.272, 2.618, 3.0, 3.618, 4.0}; string fitxt100_1[]={"0", "1.0", ".382", ".5", ".618", ".786", ".886", "1.0", "1.272", "1.618", "2.0", "2.618", "3.0"}; for (int i=0; i<=12; i++) { ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+i,fi_1[i]); if (ftvisibleDT && StringSubstr(ftvisible,number,1)=="1") { ObjectSetFiboDescription(nameObj, i, ftx + fitxt100_1[i] + " " + TimeToStr(t1 + t2*fi_1[i],TIME_DATE|TIME_MINUTES)); } else { ObjectSetFiboDescription(nameObj, i, ftx + fitxt100_1[i]); } } } //-------------------------------------------------------- // Фибы фибо-Time с числами Песавенто фибо-Time. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Фибы фибо-Time со стандартными числами. Начало. //-------------------------------------------------------- void fiboTimeS (string nameObj, datetime t1, datetime t2, int number, string ftx) { int ftvisibleDT; string ftvisible; if (ExtFiboTimeNum>2) { ftvisibleDT=ExtVisibleDateTime; ftvisible=ExtVisibleNumberFiboTime; } double fi_1[]={0.0, 1.0, 1.146, 1.236, 1.382, 1.5, phi, 1.764, 1.854, 2.0, 2.236, 2.382, 2.618, 3.0, 3.618, 4.0, 5.0}; string fitxt100_1[]={"0", "1.0", ".146", ".236", ".382", ".5", ".618", ".764", ".854", "1.0", "1.236", "1.382", "1.618", "2.0", "2.618", "3.0", "4.0"}; for (int i=0; i<=16; i++) { ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+i,fi_1[i]); if (ftvisibleDT && StringSubstr(ftvisible,number,1)=="1") { ObjectSetFiboDescription(nameObj, i, ftx + fitxt100_1[i] + " " + TimeToStr(t1 + t2*fi_1[i],TIME_DATE|TIME_MINUTES)); } else { ObjectSetFiboDescription(nameObj, i, ftx + fitxt100_1[i]); } } } //-------------------------------------------------------- // Фибы фибо-Time со стандартными числами. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Фибы фибо-Time с пользовательскими числами. Начало. //-------------------------------------------------------- void fiboTimeFree (string nameObj, datetime t1, datetime t2, int number, string strFibo, string ftx) { int ftvisibleDT; string ftvisible; if (ExtFiboTimeNum>2) { ftvisibleDT=ExtVisibleDateTime; ftvisible=ExtVisibleNumberFiboTime; } string str, str1; double fi; int j,k; j=quantityFibo (strFibo); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+0,0.0); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+1,1.0); if (ftvisibleDT && StringSubstr(ftvisible,number,1)=="1") { ObjectSetFiboDescription(nameObj, 0, ftx + "0" + " " + TimeToStr(t1,TIME_DATE|TIME_MINUTES)); ObjectSetFiboDescription(nameObj, 1, ftx + "1.0" + " " + TimeToStr(t1 + t2,TIME_DATE|TIME_MINUTES)); } else { ObjectSetFiboDescription(nameObj, 0, ftx + "0"); ObjectSetFiboDescription(nameObj, 1, ftx + "1.0"); } str=strFibo; for (int i=0; i<=j; i++) { k=StringFind(str, ",", 0); str1=StringTrimLeft(StringTrimRight(StringSubstr(str,0,k))); fi=StrToDouble(str1); if (fi<1) str1=StringSubstr(str1,1); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+(i+2),fi+1); if (ftvisibleDT && StringSubstr(ftvisible,number,1)=="1") { ObjectSetFiboDescription(nameObj, i+2, ftx + str1 + " " + TimeToStr(t1 + t2*(fi+1),TIME_DATE|TIME_MINUTES)); } else { ObjectSetFiboDescription(nameObj, i+2, ftx + str1); } if (k>=0) str=StringSubstr(str,k+1); } } //-------------------------------------------------------- // Фибы фибо-Time с пользовательскими числами. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Счетчик фиб. Начало. //-------------------------------------------------------- int quantityFibo (string sFibo) { int j=0,i,k; while (true) { k=StringFind(sFibo, ",",i+1); if (k>0) {j++; i=k;} else return (j); } } //-------------------------------------------------------- // Счетчик фиб. Конец. //-------------------------------------------------------- //---------------------------------------------------- // ZigZag (из МТ4 немного измененный). Начало. //---------------------------------------------------- void ZigZag_() { // ZigZag из МТ. Начало. int shift, back,lasthighpos,lastlowpos; double val,res; double curlow,curhigh,lasthigh,lastlow; int vDepth = 0; int Depth; bool endCyklDirection=true; Depth = minBars; // первый большой цикл for(shift=Bars-Depth; shift>=0; shift--) { val=Low[iLowest(NULL,0,MODE_LOW,Depth,shift)]; if(val==lastlow) val=0.0; else { lastlow=val; if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0; else { for(back=1; back<=ExtBackstep; back++) { res=zzL[shift+back]; if((res!=0)&&(res>val)) zzL[shift+back]=0.0; } } } if (Low[shift]==val) { zzL[shift]=val; } val=High[iHighest(NULL,0,MODE_HIGH,Depth,shift)]; if(val==lasthigh) val=0.0; else { lasthigh=val; if((val-High[shift])>(ExtDeviation*Point)) val=0.0; else { for(back=1; back<=ExtBackstep; back++) { res=zzH[shift+back]; if((res!=0)&&(res=0; shift--) { curlow=zzL[shift]; curhigh=zzH[shift]; if((curlow==0)&&(curhigh==0)) continue; if(curhigh!=0) { if(lasthigh>0) { if(lasthigh0) { if(lastlow>curlow) zzL[lastlowpos]=0; else zzL[shift]=0; } if((curlow=0; shift--) { zz[shift]=zzL[shift]; if(shift>=Bars-Depth) {zzH[shift]=0.0; zzL[shift]=0.0; zz[shift]=0.0;} else { res=zzH[shift]; if(res!=0.0) { zz[shift]=res; } } } NoGorb(Depth); // удаляем горбы зигзага } //-------------------------------------------------------- // ZigZag из МТ. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Исправление возникающих горбов зигзага. Начало. //-------------------------------------------------------- void NoGorb(int Depth) { double vel1, vel2, vel3, vel4; int bar1, bar2, bar3, bar4; int count; for(int bar=Bars-Depth; bar>=0; bar--) { if (zz[bar]!=0) { count++; vel4=vel3;bar4=bar3; vel3=vel2;bar3=bar2; vel2=vel1;bar2=bar1; vel1=zz[bar];bar1=bar; if (count<3) continue; if ((vel3vel2)&&(vel2>vel1)) {zz[bar2]=0;zzL[bar2]=0;zzH[bar2]=0;bar=bar3+1;} if ((vel2==vel1)&&(vel1!=0 )) {zz[bar1]=0;zzL[bar1]=0;zzH[bar1]=0;bar=bar3+1;} } } } //-------------------------------------------------------- // Исправление возникающих горбов зигзага. Конец. //-------------------------------------------------------- //---------------------------------------------------- // ZigZag Алекса немного измененный. Начало. //---------------------------------------------------- void ang_AZZ_() { int i,n; // cbi=Bars-IndicatorCounted()-1; //--------------------------------- for (i=cbi; i>=0; i--) { //------------------------------------------------- // запоминаем значение направления тренда fs и средней цены si на предыдущем баре if (tisi+di && Low[i]si-Low[i]) si=High[i]-di; // Отклонение хая от средней цены больше отклонения лова // else if (High[i]-si=si+di) si=High[i]-di; // else if (Low[i]si+di) si=High[i]-di; // } } // Вычисление начального значения средней цены if (i>Bars-2) {si=(High[i]+Low[i])/2;} // Определяем направление тренда для расчетного бара if (si>sip) fs=1; // Тренд восходящий if (sihm) {hm=High[i]; tai=Time[i]; si=High[i]-di;} if (fs==2 && Low[i]=0; n--) {zzH[n]=0; zz[n]=0;} zz[ai0]=High[ai0]; zzH[ai0]=High[ai0]; zzL[ai0]=0; } if (fs==2) { for (n=ai0-1; n>=0; n--) {zzL[n]=0; zz[n]=0;} zz[bi0]=Low[bi0]; zzL[bi0]=Low[bi0]; zzH[bi0]=0; } } //==================================================================================================== } //-------------------------------------------- } //-------------------------------------------------------- // ZigZag Алекса. Конец. //-------------------------------------------------------- //---------------------------------------------------- // Индикатор подобный встроенному в Ensign. Начало. //---------------------------------------------------- void Ensign_ZZ() { int i,n; // cbi=Bars-IndicatorCounted()-1; //--------------------------------- for (i=cbi; i>=0; i--) { //------------------------------------------------- // Устанавливаем начальные значения минимума и максимума бара if (lLast==0) {lLast=Low[i];hLast=High[i]; if (ExtIndicator==3) di=hLast-lLast;} // Определяем направление тренда до первой точки смены тренда. // Или до точки начала первого луча за левым краем. if (fs==0) { if (lLastLow[i] && hLast>High[i]) {fs=2; lLast=Low[i]; si=Low[i]; bi=i; tbi=Time[i]; if (ExtIndicator==3) di=High[i]-Low[i];} // тренд нисходящий } if (ti0) {countBar--; if (i==0 && countBar==0) fcount0=true;} // Остановка. Определение дальнейшего направления тренда. if (fs==1) { if (hLast>High[i] && !fh) fh=true; if (i==0) { if (Close[i+1]Low[i+1] && High[i+1]i+1 && fh && !fcount0) {fs=2; countBar=minBars; fh=false;} if (fs==2) // Тредн сменился с восходящего на нисходящий на предыдущем баре { zz[ai0]=High[ai0]; zzH[ai0]=High[ai0]; lLast=Low[i+1]; if (ExtIndicator==3) di=High[i+1]-Low[i+1]; si=Low[i+1]; bi=i+1; tbi=Time[i+1]; } } else { if (Close[i]Low[i] && High[i]hLast && fl) {fs=1; countBar=minBars; fl=false;} if (countBar==0 && si+dilLast && bi0>i+1 && fl && !fcount0) {fs=1; countBar=minBars; fl=false;} if (fs==1) // Тредн сменился с нисходящего на восходящий на предыдущем баре { zz[bi0]=Low[bi0]; zzL[bi0]=Low[bi0]; hLast=High[i+1]; if (ExtIndicator==3) di=High[i+1]-Low[i+1]; si=High[i+1]; ai=i+1; tai=Time[i+1]; } } else { if (Close[i]>hLast && fl) {fs=1; countBar=minBars; fl=false;} if (countBar==0 && si+dilLast && fl) {fs=1; countBar=minBars; fl=false;} if (fs==1) // Тредн сменился с нисходящего на восходящий { zz[bi]=Low[bi]; zzL[bi]=Low[bi]; hLast=High[i]; if (ExtIndicator==3) di=High[i]-Low[i]; si=High[i]; ai=i; tai=Time[i]; } } } } // Продолжение тренда if (fs==1 && High[i]>si) {ai=i; tai=Time[i]; hLast=High[i]; si=High[i]; countBar=minBars; fh=false; if (ExtIndicator==3) di=High[i]-Low[i];} if (fs==2 && Low[i]=0; n--) {zzH[n]=0; zz[n]=0;} zz[ai0]=High[ai0]; zzH[ai0]=High[ai0]; zzL[ai0]=0; } if (fs==2) { for (n=ai0-1; n>=0; n--) {zzL[n]=0; zz[n]=0;} zz[bi0]=Low[bi0]; zzL[bi0]=Low[bi0]; zzH[bi0]=0; } } //==================================================================================================== } //-------------------------------------------- } //-------------------------------------------------------- // Индикатор подобный встроенному в Ensign. Конец. //-------------------------------------------------------- //---------------------------------------------------- // ZigZag tauber. Начало. //---------------------------------------------------- void ZigZag_tauber() { // ZigZag из МТ. Начало. int shift, back,lasthighpos,lastlowpos; double val,res; double curlow,curhigh,lasthigh,lastlow; ArrayInitialize(zz,0.0); ArrayInitialize(zzL,0.0); ArrayInitialize(zzH,0.0); GetHigh(0,Bars,0.0,0); // final cutting lasthigh=-1; lasthighpos=-1; lastlow=-1; lastlowpos=-1; for(shift=Bars; shift>=0; shift--) { curlow=zzL[shift]; curhigh=zzH[shift]; if((curlow==0)&&(curhigh==0)) continue; //--- if(curhigh!=0) { if(lasthigh>0) { if(lasthigh0) { if(lastlow>curlow) zzL[lastlowpos]=0; else zzL[shift]=0; } //--- if((curlow=0; shift--) { zz[shift]=zzL[shift]; res=zzH[shift]; if(res!=0.0) zz[shift]=res; } } void GetHigh(int start, int end, double price, int step) { int count=end-start; if (count<=0) return; int i=iHighest(NULL,0,MODE_HIGH,count+1,start); double val=High[i]; if ((val-price)>(minSize*Point)) { zzH[i]=val; if (i==start) {GetLow(start+step,end-step,val,1-step); if (zzL[start-1]>0) zzL[start]=0; return;} if (i==end) {GetLow(start+step,end-step,val,1-step); if (zzL[end+1]>0) zzL[end]=0; return;} GetLow(start,i-1,val,0); GetLow(i+1,end,val,0); } } void GetLow(int start, int end, double price, int step) { int count=end-start; if (count<=0) return; int i=iLowest(NULL,0,MODE_LOW,count+1,start); double val=Low[i]; if ((price-val)>(minSize*Point)) { zzL[i]=val; if (i==start) {GetHigh(start+step,end-step,val,1-step); if (zzH[start-1]>0) zzH[start]=0; return;} if (i==end) {GetHigh(start+step,end-step,val,1-step); if (zzH[end+1]>0) zzH[end]=0; return;} GetHigh(start,i-1,val,0); GetHigh(i+1,end,val,0); } } //-------------------------------------------------------- // ZigZag tauber. Конец. //-------------------------------------------------------- //---------------------------------------------------- // Свинги Ганна. Начало. //---------------------------------------------------- void GannSwing() { int i,n; // Переменные для Свингов Ганна double lLast_m=0, hLast_m=0; int countBarExt=0; // счетчик внешних баров int countBarl=0,countBarh=0; fs=0; ti=0; // lLast, hLast - минимум и максимум активного бара // lLast_m, hLast_m - минимум и максимум "промежуточных" баров ArrayInitialize(zz,0.0); ArrayInitialize(zzL,0.0); ArrayInitialize(zzH,0.0); // cbi=Bars-IndicatorCounted()-1; //--------------------------------- cbi=Bars-1; for (i=cbi; i>=0; i--) { //------------------------------------------------- // Устанавливаем начальные значения минимума и максимума бара if (lLast==0) {lLast=Low[i]; hLast=High[i]; ai=i; bi=i;} if (ti!=Time[i]) { ti=Time[i]; if (lLast_m==0 && hLast_m==0) { if (lLast>Low[i] && hLastLow[i] && hLast>=High[i]) // Тенденция на текущем баре нисходящая { lLast_m=Low[i];hLast_m=0;countBarh=0;countBarExt=0; if (fs!=2) countBarl++; else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; bi=i; tbi=Time[i];} } } else if (lLast_m>0 && hLast_m>0) // Внешний бар (предыдущий) { if (lLast_m>Low[i] && hLast_mLow[i] && hLast_m>=High[i]) // Тенденция на текущем баре нисходящая { lLast_m=Low[i];hLast_m=0;countBarh=0;countBarExt=0; if (fs!=2) countBarl++; else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; bi=i; tbi=Time[i];} } } else if (lLast_m>0) { if (lLast_m>Low[i] && hLastLow[i] && hLast>=High[i]) // Тенденция на текущем баре нисходящая { lLast_m=Low[i];hLast_m=0;countBarh=0;countBarExt=0; if (fs!=2) countBarl++; else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; bi=i; tbi=Time[i];} } } else if (hLast_m>0) { if (lLast>Low[i] && hLast_mLow[i] && hLast_m>=High[i]) // Тенденция на текущем баре нисходящая { lLast_m=Low[i];hLast_m=0;countBarh=0;countBarExt=0; if (fs!=2) countBarl++; else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; bi=i; tbi=Time[i];} } } // Определяем направление тренда. if (fs==0) { if (lLasthLast_m) // внутренний бар { lLast=Low[i]; hLast=High[i]; ai=i; bi=i; countBarl=0;countBarh=0;countBarExt=0; } if (countBarh>countBarl && countBarh>countBarExt && countBarh>minBars) { lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; fs=1;countBarh=0;countBarl=0;countBarExt=0; zz[bi]=Low[bi]; zzL[bi]=Low[bi]; zzH[bi]=0; ai=i; tai=Time[i]; } else if (countBarl>countBarh && countBarl>countBarExt && countBarl>minBars) { lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; fs=2;countBarl=0;countBarh=0;countBarExt=0; zz[ai]=High[ai]; zzH[ai]=High[ai]; zzL[ai]=0; bi=i; tbi=Time[i]; } } else { if (lLast_m==0 && hLast_m==0) { countBarl=0;countBarh=0;countBarExt=0; } // Тенденция восходящая if (fs==1) { if (countBarl>countBarh && countBarl>countBarExt && countBarl>minBars) // Определяем точку смены тенденции. { // запоминаем значение направления тренда fs на предыдущем баре ai=iBarShift(Symbol(),Period(),tai); fs=2; countBarl=0; zz[ai]=High[ai]; zzH[ai]=High[ai]; zzL[ai]=0; bi=i; tbi=Time[i]; lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; for (n=0;countBarExtHigh[i+n+1]) {countBarExt++; countBarh++; lLast=Low[i+n+1]; hLast=High[i+n+1]; hLast_m=High[i];} else break; } lLast=Low[i]; hLast=High[i]; } } // Тенденция нисходящая if (fs==2) { if (countBarh>countBarl && countBarh>countBarExt && countBarh>minBars) // Определяем точку смены тенденции. { // запоминаем значение направления тренда fs на предыдущем баре bi=iBarShift(Symbol(),Period(),tbi); fs=1; countBarh=0; zz[bi]=Low[bi]; zzL[bi]=Low[bi]; zzH[bi]=0; ai=i; tai=Time[i]; lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; for (n=0;countBarExtHigh[i+n+1]) {countBarExt++; countBarl++; lLast=Low[i+n+1]; hLast=High[i+n+1]; lLast_m=Low[i];} else break; } lLast=Low[i]; hLast=High[i]; } } } } if (i==0) { if (hLastLow[i] && fs==2) // Тенденция на текущем баре нисходящая { bi=i; tbi=Time[i]; zz[bi]=Low[bi]; zzL[bi]=Low[bi]; zzH[bi]=0; } //=================================================================================================== // Нулевой бар. Расчет первого луча ZigZag-a ai0=iBarShift(Symbol(),Period(),tai); bi0=iBarShift(Symbol(),Period(),tbi); if (bi0>1) if (fs==1) { for (n=bi0-1; n>=0; n--) {zzH[n]=0.0; zz[n]=0.0;} zz[ai0]=High[ai0]; zzH[ai0]=High[ai0]; zzL[ai0]=0.0; } if (ai0>1) if (fs==2) { for (n=ai0-1; n>=0; n--) {zzL[n]=0.0; zz[n]=0.0;} zz[bi0]=Low[bi0]; zzL[bi0]=Low[bi0]; zzH[bi0]=0.0; } if (ti0) { datetime nen_time=iTime(NULL,GrossPeriod,0); int i=0, j=0; // j - номер бара с максимальным максимумом (минимальным минимумом) в полоске nen-ZigZag double nen_dt=0, last_j=0, last_nen=0; //last_j - значение максимального максимума (минимального минимума) в полоске nen_ZigZag int limit, big_limit, bigshift=0; int i_metka=-1, i_metka_m=-1, k, m, jm; bool fl_metka=false; double last_jm=0, last_nen_m=0; if (init_zz) { limit=Bars-1; big_limit=iBars(NULL,GrossPeriod)-1; } else { limit=iBarShift(NULL,0,afr[2]); big_limit=iBarShift(NULL,GrossPeriod,afr[2]); } while (bigshift=nen_time) { if (ExtIndicator==6) { nen_ZigZag[i]=iCustom(NULL,GrossPeriod,"ZigZag_new_nen4",minBars,ExtDeviation,ExtBackstep,0,0,bigshift); } else if (ExtIndicator==7) { nen_ZigZag[i]=iCustom(NULL,GrossPeriod,"DT_ZZ_nen",minBars,0,0,bigshift); } else if (ExtIndicator==8) nen_ZigZag[i]=iCustom(NULL,GrossPeriod,"CZigZag",minBars,ExtDeviation,0,bigshift); else if (ExtIndicator==10) { nen_ZigZag[i]=iCustom(NULL,GrossPeriod,"Swing_ZZ_1",minBars,1,0,bigshift); } i++; } else {bigshift++;nen_time=iTime(NULL,GrossPeriod,bigshift);} } if (init_zz) // обработка истории { double i1=0, i2=0; init_zz=false; for (i=limit;i>0;i--) // определение направления первого луча { if (nen_ZigZag[i]>0) { if (i1==0) i1=nen_ZigZag[i]; else if (i1>0 && i1!=nen_ZigZag[i]) i2=nen_ZigZag[i]; if (i2>0) { if (i1>i2) hi_nen=true; else hi_nen=false; break; } } } } else // режим реального времени { if (afrl[2]>0) hi_nen=false; else hi_nen=true; } for (i=limit;i>=0;i--) { // if (i0) { fl_metka=true; if (nen_dt>0 && nen_dt!=nen_ZigZag[i]) { if (i_metka>=0 && fl_metka) { m=i_metka-GrossPeriod/Period(); for (k=i_metka; k>m; k--) { ha[k]=0; la[k]=0; } if (hi_nen) ha[j]=last_nen; else la[j]=last_nen; i_metka=i; } if (hi_nen) {hi_nen=false;zzH[j]=last_nen;} else {hi_nen=true;zzL[j]=last_nen;} last_j=0;nen_dt=0;zz[j]=last_nen; } if (hi_nen) { nen_dt=nen_ZigZag[i]; if (last_jLow[i]) {j=i;last_j=Low[i];last_nen=nen_ZigZag[i];} } if (nen_dt>0 && i==0) // определение перелома на нулевом баре GrossPeriod { if (i_metka>=0 && fl_metka) { m=i_metka-GrossPeriod/Period(); for (k=i_metka; k>m; k--) { ha[k]=0; la[k]=0; } if (hi_nen) ha[j]=last_nen; else la[j]=last_nen; fl_metka=false; } zz[j]=last_nen; if (hi_nen) zzH[j]=last_nen; else zzL[j]=last_nen; } } else { if (last_j>0 && fl_metka) { if (i_metka>=0 && fl_metka) { m=i_metka-GrossPeriod/Period(); for (k=i_metka; k>m; k--) { ha[k]=0; la[k]=0; } if (hi_nen) ha[j]=last_nen; else la[j]=last_nen; } fl_metka=false; if (hi_nen) {hi_nen=false;zzH[j]=last_nen;} else {hi_nen=true;zzL[j]=last_nen;} last_j=0;nen_dt=0;zz[j]=last_nen; i_metka=-1; } } } } } //-------------------------------------------------------- // nen-ZigZag. Режим DT. Конец. //-------------------------------------------------------- /*------------------------------------------------------------------+ | ZigZag_Talex, ищет точки перелома на графике. Количество точек | | задается внешним параметром ExtPoint. | +------------------------------------------------------------------*/ void ZZTalex(int n) { /*переменные*/ int i,j,k,zzbarlow,zzbarhigh,curbar,curbar1,curbar2,EP,Mbar[]; double curpr,Mprice[]; bool flag,fd; /*начало*/ // for(i=0;i<=Bars-1;i++) // {zz[i]=0.0;zzL[i]=0.0;zzH[i]=0.0;} ArrayInitialize(zz,0);ArrayInitialize(zzL,0);ArrayInitialize(zzH,0); EP=ExtPoint; zzbarlow=iLowest(NULL,0,MODE_LOW,n,0); zzbarhigh=iHighest(NULL,0,MODE_HIGH,n,0); if(zzbarlowzzbarhigh) {curbar=zzbarhigh; curpr=High[zzbarhigh];} if(zzbarlow==zzbarhigh){curbar=zzbarlow;curpr=funk1(zzbarlow, n);} ArrayResize(Mbar,ExtPoint); ArrayResize(Mprice,ExtPoint); j=0; endpr=curpr; endbar=curbar; Mbar[j]=curbar; Mprice[j]=curpr; EP--; if(curpr==Low[curbar]) flag=true; else flag=false; fl=flag; i=curbar+1; while(EP>0) { if(flag) { while(i<=Bars-1) { curbar1=iHighest(NULL,0,MODE_HIGH,n,i); curbar2=iHighest(NULL,0,MODE_HIGH,n,curbar1); if(curbar1==curbar2){curbar=curbar1;curpr=High[curbar];flag=false;i=curbar+1;j++;break;} else i=curbar2; } Mbar[j]=curbar; Mprice[j]=curpr; EP--; } if(EP==0) break; if(!flag) { while(i<=Bars-1) { curbar1=iLowest(NULL,0,MODE_LOW,n,i); curbar2=iLowest(NULL,0,MODE_LOW,n,curbar1); if(curbar1==curbar2){curbar=curbar1;curpr=Low[curbar];flag=true;i=curbar+1;j++;break;} else i=curbar2; } Mbar[j]=curbar; Mprice[j]=curpr; EP--; } } /* исправление вершин */ if(Mprice[0]==Low[Mbar[0]])fd=true; else fd=false; for(k=0;k<=ExtPoint-1;k++) { if(k==0) { if(fd==true) { Mbar[k]=iLowest(NULL,0,MODE_LOW,Mbar[k+1]-Mbar[k],Mbar[k]);Mprice[k]=Low[Mbar[k]];endbar=minBars; } if(fd==false) { Mbar[k]=iHighest(NULL,0,MODE_HIGH,Mbar[k+1]-Mbar[k],Mbar[k]);Mprice[k]=High[Mbar[k]];endbar=minBars; } } if(k=0 && a=a; i--) {zzH[i]=zzH[i-a]; zzL[i]=zzL[i-a];} for(;i>=0;i--) {zzH[i]=0; zzL[i]=0;} } } else { ii=barz; H1=ii+1; L1=ii; H2=ii+3; L2=ii+2; L2p=Low[L2];H2p=High[H2]; L1p=Low[L1];H1p=High[H1]; H3=H2; H3p=H2p; L3=L2; L3p=L2p; } act_time=Time[1]; for(c=0; ii>=0; c++, ii--) { // if(c>tb) if(zzFill) zz[ii+mnm]=MathMax(zzL[ii+mnm],zzH[ii+mnm]); // if(c>tb) if(zzFill) zz[ii]=MathMax(zzL[ii],zzH[ii]); H=ii; L=ii; Hp= High[H]; Lp= Low[L]; //------------------------------------------------------------------------------------- if(H2=H1p ) { H1=H; H1p=Hp; if( H1p>H2p ) { zzH[H2]=0; H1=H; H1p=Hp; H2=H1; H2p=H1p; L1=H1; L1p=H1p; zzH[H2]=H2p; } } else if( Lp<=L1p ) { L1=L; L1p=Lp; x=ray_value(L2,L2p,H2+(L2-H3)*0.5,H2p+(L2p-H3p)*0.5,L1); if( L1p<=L2p//также работает L1p<=L2p*0.75+H2p*0.25 или любые другие условия || tb*tb*Point<(H2p-L1p)*(H2-L1)) { //сдвигаем все Low L4=L3; L4p=L3p; L3=L2; L3p=L2p; L2=L1; L2p=L1p; H1=L1; H1p=L1p; zzL[L2]=L2p; } } } //-------------------------------------------------------------- if(L2=H1p ) { H1=H; H1p=Hp; x=ray_value(H2,H2p,L2+0.5*(H2-L3),L2p+0.5*(H2p-L3p),H1); if( H1p>=H2p//можно и так: H1p>=H2p*0.75+L2p*0.25 || tb*tb*Point<(H1p-L2p)*(L2-H1)) { //сдвигаем все High H4=H3; H4p=H3p; H3=H2; H3p=H2p; H2=H1; H2p=H1p; L1=H1; L1p=H1p; zzH[H2]=H2p; } } }//-------------------------------------------------------------------------------- }//for for(ii=bb-1; ii>=0; ii--) zz[ii]=MathMax(zzL[ii],zzH[ii]); }//°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° // SQZZ by tovaroved.lv. Конец. //--------------------------------------------------------=======================================================================