//+----------------------------------------------------------------------+ //|ZigZag подобный применяемому в Ensign с небольшими отличиями (v1) | //| С выводом статических и динамических фиб и вил Эндрюса | //|----------------------------------------------------------------------+ //|minBars - фильтр баровый (задается количество баров) | //|minSize - фильтр по количеству пунктов (задается количество пунктов) | //| | //|ExtFiboType = true - фибы с числами Песавенто | //| false - стандартные фибы | //| | //|ExtFiboDinamic - разрешает вывод днамических уровней фибо. | //| Динамические уровни фибо выводятся на первом луче | //| ZigZag-a. | //| | //|ExtFiboStatic - разрешает вывод статических уровней фибо | //| | //|ExtFiboStaticNum - номер луча ZigZag-a, от которого будут выводиться | //| статические уровни Фибоначчи. 19) ExtFiboStaticNum=9; return(0); } //+------------------------------------------------------------------+ //| Деинициализация. Удаление всех трендовых линий и текстовых объектов //+------------------------------------------------------------------+ int deinit() { ObjectDelete("fiboS1");ObjectDelete("fiboD1");ObjectDelete("pitchfork1");ObjectDelete("pmediana1"); return(0); } //******************************************************** // НАЧАЛО int start() { int i,n,cbi; cbi=Bars-IndicatorCounted()-1; //--------------------------------- for (i=cbi; i>=0; i--) { //------------------------------------------------- // Устанавливаем начальные значения минимума и максимума бара if (lLast==0) {lLast=Low[i];hLast=High[i];} // Определяем направление тренда до первой точки смены тренда. // Или до точки начала первого луча за левым краем. if (fs==0) { if (lLastLow[i] && hLast>High[i]) {fs=2; lLast=Low[i]; si=Low[i]; bi=i; tbi=Time[i];} // тренд нисходящий } if (ti!=Time[i]) { // запоминаем значение направления тренда fs на предыдущем баре ti=Time[i]; ai0=iBarShift(Symbol(),Period(),tai); bi0=iBarShift(Symbol(),Period(),tbi); fcount0=false; if ((fh || fl) && countBar>0) {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]; si=Low[i+1]; bi=i+1; tbi=Time[i+1]; } } else { if (Close[i]Low[i] && High[i]hLast && fl) {fs=1; afrm=true; countBar=minBars; fl=false;} if (countBar==0 && si+dilLast && bi0>i+1 && fl && !fcount0) {fs=1; countBar=minBars; fl=false;} if (fs==1) // Тредн сменился с нисходящего на восходящий на предыдущем баре { zzL[bi0]=Low[bi0]; zz[bi0]=Low[bi0]; hLast=High[i+1]; si=High[i+1]; ai=i+1; tai=Time[i+1]; } } else { if (Close[i]>hLast && fl) {fs=1; afrm=true; 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]; si=High[i]; ai=i; tai=Time[i]; } } } } // Продолжение тренда if (fs==1 && High[i]>si) {ai=i; tai=Time[i]; afrm=true; hLast=High[i]; si=High[i]; countBar=minBars; fh=false;} 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;} // if (fs==1) { for (n=bi0-1; n>0; n--) {zz[n]=0;} zz[ai0]=High[ai0];} // if (fs==2) {for (n=ai0-1; n>0; n--) {zz[n]=0;} zz[bi0]=Low[bi0];} } //==================================================================================================== } matriza(); //-------------------------------------------- } //-------------------------------------------------------- // Формирование матрицы. Начало. // // Матрица используется для поиска исчезнувших фракталов. // Это инструмент компенсации непредвиденных закидонов стандартного ZigZag-a. //-------------------------------------------------------- void matriza() { if (afrm && (ExtFiboStatic || ExtFiboDinamic || ExtPitchfork>0)) { int shift,k,k1; double ab2,ac2,bc2; datetime tab2,tac2,tbc2; k=0; for (shift=0; shift0) { afr[k]=Time[shift]; if (zz[shift]==zzL[shift]) {afrl[k]=Low[shift]; afrh[k]=0.0;} if (zz[shift]==zzH[shift]) {afrh[k]=High[shift]; afrl[k]=0.0;} k++; } } afrm=false; // Вывод статических и динамических фиб. if (ExtFiboStatic) { ExtFiboStatic=false; screenFiboS(); } if (ExtFiboDinamic) { screenFiboD(); } if (ExtPitchfork>0) { // nameObj="pf" + Period() + "_" + afr[3]; nameObj="pitchfork1"; numOb=ObjectFind(nameObj); if (numOb>-1) ObjectDelete(nameObj); if (afrl[3]>0) { ObjectCreate(nameObj,OBJ_PITCHFORK,0,afr[3],afrl[3],afr[2],afrh[2],afr[1],afrl[1]); } else { ObjectCreate(nameObj,OBJ_PITCHFORK,0,afr[3],afrh[3],afr[2],afrl[2],afr[1],afrh[1]); } ObjectSet(nameObj,OBJPROP_STYLE,STYLE_SOLID); ObjectSet(nameObj,OBJPROP_COLOR,ExtLinePitchfork); if (ExtPitchfork==2) { k1=MathCeil((iBarShift(Symbol(),Period(),afr[3])+iBarShift(Symbol(),Period(),afr[2]))/2); tab2=Time[k1]; k1=MathCeil((iBarShift(Symbol(),Period(),afr[2])+iBarShift(Symbol(),Period(),afr[1]))/2); tbc2=Time[k1]; k1=MathCeil((iBarShift(Symbol(),Period(),afr[3])+iBarShift(Symbol(),Period(),afr[1]))/2); tac2=Time[k1]; // nameObj="pm" + Period() + "_" + afr[3]; nameObj="pmediana1"; numOb=ObjectFind(nameObj); if (numOb>-1) ObjectDelete(nameObj); if (afrl[3]>0) { ObjectCreate(nameObj,OBJ_TREND,0,tab2,(afrl[3]+afrh[2])/2,tbc2,(afrh[2]+afrl[1])/2); } else { ObjectCreate(nameObj,OBJ_TREND,0,tab2,(afrh[3]+afrl[2])/2,tbc2,(afrl[2]+afrh[1])/2); } ObjectSet(nameObj,OBJPROP_STYLE,STYLE_DASH); ObjectSet(nameObj,OBJPROP_COLOR,ExtLinePitchfork); } } } return ; } //-------------------------------------------------------- // Формирование матрицы. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Вывод фиб статических. Начало. //-------------------------------------------------------- void screenFiboS() { double fibo_0, fibo_100, fiboPrice, fiboPrice1; nameObj="fiboS1"; numOb=ObjectFind(nameObj); if (numOb>-1) ObjectDelete(nameObj); if (afrl[ExtFiboStaticNum-1]>0) { fibo_0=afrh[ExtFiboStaticNum];fibo_100=afrl[ExtFiboStaticNum-1]; fiboPrice=afrh[ExtFiboStaticNum]-afrl[ExtFiboStaticNum-1];fiboPrice1=afrl[ExtFiboStaticNum-1]; } else { fibo_0=afrl[ExtFiboStaticNum];fibo_100=afrh[ExtFiboStaticNum-1]; fiboPrice=afrl[ExtFiboStaticNum]-afrh[ExtFiboStaticNum-1];fiboPrice1=afrh[ExtFiboStaticNum-1]; } ObjectCreate(nameObj,OBJ_FIBO,0,afr[2],fibo_0,afr[1],fibo_100); ObjectSet(nameObj,OBJPROP_LEVELSTYLE,STYLE_DOT); ObjectSet(nameObj,OBJPROP_LEVELCOLOR,ExtFiboS); if (ExtFiboType) { ObjectSet(nameObj,OBJPROP_FIBOLEVELS,18); fibo_patterns(fiboPrice, fiboPrice1); } else { ObjectSet(nameObj,OBJPROP_FIBOLEVELS,11); fibo_standart (fiboPrice, fiboPrice1); } return ; } //-------------------------------------------------------- // Вывод фиб статических. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Вывод фиб динамических. Начало. //-------------------------------------------------------- void screenFiboD() { double fibo_0, fibo_100, fiboPrice, fiboPrice1; nameObj="fiboD1"; numOb=ObjectFind(nameObj); if (numOb>-1) ObjectDelete(nameObj); if (afrh[1]>0) {fibo_0=afrh[1];fibo_100=afrl[0];fiboPrice=afrh[1]-afrl[0];fiboPrice1=afrl[0];} else {fibo_0=afrl[1];fibo_100=afrh[0];fiboPrice=afrl[1]-afrh[0];fiboPrice1=afrh[0];} ObjectCreate(nameObj,OBJ_FIBO,0,afr[2],fibo_0,afr[1],fibo_100); ObjectSet(nameObj,OBJPROP_LEVELSTYLE,STYLE_DOT); ObjectSet(nameObj,OBJPROP_LEVELCOLOR,ExtFiboD); if (ExtFiboType) { ObjectSet(nameObj,OBJPROP_FIBOLEVELS,18); fibo_patterns(fiboPrice, fiboPrice1); } else { ObjectSet(nameObj,OBJPROP_FIBOLEVELS,14); fibo_standart (fiboPrice, fiboPrice1); } return ; } //-------------------------------------------------------- // Вывод фиб динамических. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Фибы с паттернами. Начало. //-------------------------------------------------------- void fibo_patterns(double fiboPrice,double fiboPrice1) { ObjectSet(nameObj,OBJPROP_FIRSTLEVEL,0); ObjectSetFiboDescription(nameObj, 0, "0 --> "+DoubleToStr(fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+1,0.382); ObjectSetFiboDescription(nameObj, 1, "38.2 --> "+DoubleToStr(fiboPrice*0.382+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+2,0.5); ObjectSetFiboDescription(nameObj, 2, "50.0 --> "+DoubleToStr(fiboPrice*0.5+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+3,0.618); ObjectSetFiboDescription(nameObj, 3, "61.8 --> "+DoubleToStr(fiboPrice*0.618+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+4,0.707); ObjectSetFiboDescription(nameObj, 4, "70.7 --> "+DoubleToStr(fiboPrice*0.707+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+5,0.786); ObjectSetFiboDescription(nameObj, 5, "78.6 --> "+DoubleToStr(fiboPrice*0.786+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+6,0.841); ObjectSetFiboDescription(nameObj, 6, "84.1 --> "+DoubleToStr(fiboPrice*0.841+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+7,0.886); ObjectSetFiboDescription(nameObj, 7, "88.6 --> "+DoubleToStr(fiboPrice*0.886+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+8,1.0); ObjectSetFiboDescription(nameObj, 8, "100.0 --> "+DoubleToStr(fiboPrice+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+9,1.127); ObjectSetFiboDescription(nameObj, 9, "112.8 --> "+DoubleToStr(fiboPrice*1.128+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+10,1.272); ObjectSetFiboDescription(nameObj, 10, "127.2 --> "+DoubleToStr(fiboPrice*1.272+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+11,1.414); ObjectSetFiboDescription(nameObj, 11, "141.4 --> "+DoubleToStr(fiboPrice*1.414+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+12,1.618); ObjectSetFiboDescription(nameObj, 12, "161.8 --> "+DoubleToStr(fiboPrice*1.618+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+13,2.0); ObjectSetFiboDescription(nameObj, 13, "200.0 --> "+DoubleToStr(fiboPrice*2.0+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+14,2.414); ObjectSetFiboDescription(nameObj, 14, "241.4 --> "+DoubleToStr(fiboPrice*2.414+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+15,2.618); ObjectSetFiboDescription(nameObj, 15, "261.8 --> "+DoubleToStr(fiboPrice*2.618+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+16,4.236); ObjectSetFiboDescription(nameObj, 16, "423.6 --> "+DoubleToStr(fiboPrice*4.236+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+17,6.854); ObjectSetFiboDescription(nameObj, 17, "685.4 --> "+DoubleToStr(fiboPrice*6.854+fiboPrice1, cPoint) ); return ; } //-------------------------------------------------------- // Фибы с паттернами. Конец. //-------------------------------------------------------- //-------------------------------------------------------- // Фибы стандартные. Начало. //-------------------------------------------------------- void fibo_standart(double fiboPrice,double fiboPrice1) { ObjectSet(nameObj,OBJPROP_FIRSTLEVEL,0); ObjectSetFiboDescription(nameObj, 0, "0 --> "+DoubleToStr(fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+1,0.146); ObjectSetFiboDescription(nameObj, 1, "14.6 --> "+DoubleToStr(fiboPrice*0.146+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+2,0.236); ObjectSetFiboDescription(nameObj, 2, "23.6 --> "+DoubleToStr(fiboPrice*0.236+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+3,0.382); ObjectSetFiboDescription(nameObj, 3, "38.2 --> "+DoubleToStr(fiboPrice*0.382+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+4,0.5); ObjectSetFiboDescription(nameObj, 4, "50.0 --> "+DoubleToStr(fiboPrice*0.5+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+5,0.618); ObjectSetFiboDescription(nameObj, 5, "61.8 --> "+DoubleToStr(fiboPrice*0.618+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+6,0.764); ObjectSetFiboDescription(nameObj, 6, "76.4 --> "+DoubleToStr(fiboPrice*0.764+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+7,0.854); ObjectSetFiboDescription(nameObj, 7, "85.4 --> "+DoubleToStr(fiboPrice*0.854+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+8,1.0); ObjectSetFiboDescription(nameObj, 8, "100.0 --> "+DoubleToStr(fiboPrice+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+9,1.236); ObjectSetFiboDescription(nameObj, 9, "1.236 --> "+DoubleToStr(fiboPrice*1.236+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+10,1.618); ObjectSetFiboDescription(nameObj, 10, "161.8 --> "+DoubleToStr(fiboPrice*1.618+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+11,2.618); ObjectSetFiboDescription(nameObj, 11, "261.8 --> "+DoubleToStr(fiboPrice*2.618+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+12,4.236); ObjectSetFiboDescription(nameObj, 12, "423.6 --> "+DoubleToStr(fiboPrice*4.236+fiboPrice1, cPoint) ); ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+13,6.854); ObjectSetFiboDescription(nameObj, 13, "685.4 --> "+DoubleToStr(fiboPrice*6.854+fiboPrice1, cPoint) ); return ; } //-------------------------------------------------------- // Фибы стандартные. Конец. //--------------------------------------------------------