//+------------------------------------------------------------------+ //| Golden_section_v2.mq4 | //| Talex | //| tan@gazinter.net | //+------------------------------------------------------------------+ // Very rough English translation by http://translation2.paralink.com/ // Feel free to translate the rest of the comments. #property copyright "Talex" #property link "tan@gazinter.net" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Lime extern int ExtDepth=8; /* Parameter for ZZ */ /*extern*/ int ExtIndicator=0; /* Defines ? which will search for points for construction of a pattern while only 0 */ extern double ExtDopusk=0.01; /* параметры паттерна будут отличаться не более чем величина ExtDopusk */ extern int ExtPoint=3; /* число считаемых точек перелома, если сделать больше 3, то возможно строить от любой точки перелома */ extern string ExtComplect="0"; /* это для того,чтобы выводить несколько индикаторов на графике */ extern int ExtMovePoint=0; /*переместить точку отрисовки веера от вил на количество баров указанное переменной */ extern bool ExtPitchfork=true; /* используется построение с помощью вил */ extern bool ExtPitchforkRevers=false; /* переворачивает веник, зачем? спросите Vadimcha */ extern bool ExtBack=true; /* если true, то объекты будут показаны в фоновом режиме */ extern bool ExtFan=true; /* если true, то фибовеник будет выведен на график */ extern bool ExtRec=true; /* если true, то прямоугольник будет выведен на график */ extern bool ExtArc=true; /* если true, то фибоарка будет выведена на график */ extern bool ExtLeftChannel=false; /* если true, то линии канала будут выведены на график */ extern bool ExtRightChannel=false; /* если true, то линии канала будут выведены на график */ extern double ExtFiboLeftChannel=1.618; /* устанавливает фибо точку построения левых линий */ extern double ExtFiboRightChannel=1.618; /* устанавливает фибо точку построения правых линий */ extern bool ExtSave=false; /* если true, то построения будут сохранены на графике */ extern double ExtScale=0; /* устанавливает масштаб дуги */ extern int ExtFanStyle=0; /* устанавливает стиль линий фибовеника */ extern int ExtFanWidth=1; /* устанавливает ширину линий фибовеника */ extern color ExtFanColor=DeepPink; /* цвет фибовеников */ extern int ExtRecStyle=4; /* устанавливает стиль линий прямоугольника */ extern int ExtRecWidth=1; /* устанавливает ширину линий прямоугольника */ extern color ExtRecColor=Yellow; /* цвет прямоугольника */ extern int ExtArcStyle=0; /* устанавливает стиль линий фибоарки */ extern int ExtArcWidth=1; /* устанавливает ширину линий фибоарки */ extern color ExtArcColor=Red; /* цвет дуги */ extern int ExtChannelStyle=0; /* устанавливает стиль линий канала */ extern int ExtChannelWidth=1; /* устанавливает ширину линий канала */ extern color ExtChannelColor=Blue; /* цвет линий канала */ extern int ExtPitchforkStyle=0; /* устанавливает стиль линий вил */ extern int ExtPitchforkWidth=1; /* устанавливает ширину линий вил */ extern color ExtPitchforkColor=Lime; /* цвет вил */ /* Ниже координаты точек можно вводить ручками */ extern datetime TimePointX=0; /* время точки X в формате '1980.07.19 12:30' */ extern datetime TimePointA=0; /* время точки A в формате '1980.07.19 12:30' */ extern datetime TimePointB=0; /* время точки B в формате '1980.07.19 12:30' */ extern double FiboFanMediana1=0.382; extern double FiboFanMediana2=1.272; extern double Fibo1=0.0; extern double Fibo2=0.382; extern double Fibo3=0.5; extern double Fibo4=0.618; extern double Fibo5=0.786; extern double Fibo6=0.886; extern double Fibo7=1.0; extern double Fibo8=1.272; extern double Fibo9=1.618; extern double Fibo10=2.0; extern double Fibo11=2.618; /* Совет - настройте для себя цвет, стиль, ширину линий объектов, фибо-уровни и уберите перед соответствующими параметрами extern */ double zz[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { IndicatorBuffers(1); SetIndexBuffer(0,zz); SetIndexStyle(0,DRAW_SECTION); SetIndexEmptyValue(0,0.0); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- int i; for(i=0;i<=ExtDepth;i++) { ObjectDelete("FiboFan1"+"_"+i+"_"+ExtComplect+"_"); ObjectDelete("FiboFan2"+"_"+i+"_"+ExtComplect+"_"); ObjectDelete("FiboArc"+"_"+i+"_"+ExtComplect+"_"); ObjectDelete("Rectangle"+"_"+i+"_"+ExtComplect+"_"); ObjectDelete("LeftChannel"+"_"+i+"_"+ExtComplect+"_"); ObjectDelete("RightChannel"+"_"+i+"_"+ExtComplect+"_"); ObjectDelete("LeftLine"+"_"+i+"_"+ExtComplect+"_"); ObjectDelete("RightLine"+"_"+i+"_"+ExtComplect+"_"); ObjectDelete("Pitchfork"+"_"+i+"_"+ExtComplect+"_"); ObjectDelete("Mediana"+"_"+i+"_"+ExtComplect+"_"); } //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int PP[]; int i,j,X,A,B; double R0382=0.382, R0786=0.786, retXB, minret, maxret,AutoScale; double p1,p2,p3,p4,p5,p6,p7; datetime t1,t2,t3,t4,t5,t6,t7; string save=""; double tang; if(ExtSave==true) { save=TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS); } minret=1-ExtDopusk; maxret=1+ExtDopusk; ArrayResize(PP,ExtPoint); if(TimePointX!=0 && TimePointA!=0 && TimePointB!=0) { ExtPoint=3; PP[0]=iBarShift(NULL,0,TimePointB); PP[1]=iBarShift(NULL,0,TimePointA); PP[2]=iBarShift(NULL,0,TimePointX); if((High[PP[0]]>High[PP[1]] && High[PP[2]]>High[PP[1]]) || (Low[PP[0]]>Low[PP[1]] && Low[PP[2]]>Low[PP[1]])) { zz[PP[0]]=High[PP[0]]; zz[PP[1]]=Low[PP[1]]; zz[PP[2]]=High[PP[2]]; }else { zz[PP[0]]=Low[PP[0]]; zz[PP[1]]=High[PP[1]]; zz[PP[2]]=Low[PP[2]]; } } else { switch (ExtIndicator) { case 0: {ZZTalex(ExtDepth); break;} /* здесь можно добавлять функции по расчету точек паттернов */ default:{ZZTalex(ExtDepth); break;} } if(ExtIndicator==0) { j=0; for(i=0;izz[PP[ExtPoint-3]] && zz[PP[ExtPoint-3]]>zz[PP[ExtPoint-2]])) { retXB=(zz[PP[ExtPoint-2]]-zz[PP[ExtPoint-3]])/(zz[PP[ExtPoint-2]]-zz[PP[ExtPoint-1]]+0.000001); if(retXB>=R0382*minret && retXB<=R0786*maxret) { t1=Time[PP[ExtPoint-1]];p1=zz[PP[ExtPoint-1]]; t2=Time[PP[ExtPoint-3]];p2=zz[PP[ExtPoint-3]]; if(2*PP[ExtPoint-3]-PP[ExtPoint-1]<=0) { t3=Time[0]-(2*PP[ExtPoint-3]-PP[ExtPoint-1])*Period()*60;p3=zz[PP[ExtPoint-3]]-(zz[PP[ExtPoint-1]]-zz[PP[ExtPoint-3]]); } else {t3=Time[2*PP[ExtPoint-3]-PP[ExtPoint-1]];p3=zz[PP[ExtPoint-3]]-(zz[PP[ExtPoint-1]]-zz[PP[ExtPoint-3]]);} } } if(ExtScale==0) {/* расчет AutoScale предложил Vadimcha к нему все вопросы */ AutoScale=MathAbs((p1-p3)*MathPow(10,Digits)/(2*(PP[ExtPoint-1]-PP[ExtPoint-3]))); }else AutoScale=ExtScale; CreateObject(p1,p2,p3,t1,t2,t3,save,AutoScale); } if(ExtPitchfork) { t1=Time[PP[ExtPoint-1]];p1=zz[PP[ExtPoint-1]]; t2=Time[PP[ExtPoint-2]];p2=zz[PP[ExtPoint-2]]; t3=Time[PP[ExtPoint-3]];p3=zz[PP[ExtPoint-3]]; p4=(zz[PP[ExtPoint-2]]+zz[PP[ExtPoint-3]])/2; ObjectCreate("Pitchfork"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,OBJ_PITCHFORK,0,t1,p1,t2,p2,t3,p3); ObjectSet("Pitchfork"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,OBJPROP_BACK,ExtBack); ObjectSet("Pitchfork"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,OBJPROP_COLOR,ExtPitchforkColor); ObjectSet("Pitchfork"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,OBJPROP_STYLE,ExtPitchforkStyle); ObjectSet("Pitchfork"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,OBJPROP_WIDTH,ExtPitchforkWidth); tang=(p1-p4)/(PP[ExtPoint-1]-(PP[ExtPoint-2]-(PP[ExtPoint-2]-PP[ExtPoint-3])/2.0)); t5=t3; p5=p1-tang*(PP[ExtPoint-1]-PP[ExtPoint-3]); ObjectCreate("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,OBJ_TREND,0,t1,p1,t5,p5); ObjectSet("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,OBJPROP_BACK,ExtBack); ObjectSet("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,OBJPROP_COLOR,ExtPitchforkColor); if((p1p2 && p1>p4)) { /* в этом случае совпадут уровни менее 100% */ p6=(p5-p3)/FiboFanMediana1+p3;//-tang*ExtMovePoint; if(ObjectGetShiftByValue("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,p6)<-100) { Alert("The point for construction of a fan to be too far, try to use greater value for FiboFanMediana1"); } if(ObjectGetShiftByValue("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,p6)>0) { t6=Time[ObjectGetShiftByValue("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,p6)]+ExtMovePoint*Period()*60; } else t6=Time[0]-ObjectGetShiftByValue("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,p6)*Period()*60+ExtMovePoint*Period()*60; } if((p1p4) || (p1>p2 && p1=0) { t6=Time[ObjectGetShiftByValue("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,p6)]+ExtMovePoint*Period()*60; } else t6=Time[0]-ObjectGetShiftByValue("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,p6)*Period()*60+ExtMovePoint*Period()*60; } if(2*ObjectGetShiftByValue("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,p6)-PP[ExtPoint-3]-2*ExtMovePoint>=0) { t7=Time[2*ObjectGetShiftByValue("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,p6)-PP[ExtPoint-3]-2*ExtMovePoint]; } else t7=t6+(PP[ExtPoint-3]-ObjectGetShiftByValue("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,p6))*Period()*60+ExtMovePoint*Period()*60; /* коррекция цены p6 */ p6=ObjectGetValueByShift("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,ObjectGetShiftByValue("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,p6)); p7=2*p6-p3; //Print("t6=",TimeToStr(t6,TIME_DATE),"; p6=",p6,"; NbarMediana=",ObjectGetShiftByValue("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,p6)); //Print("t3=",TimeToStr(t3,TIME_DATE),"; p3=",p3,"; t7=",TimeToStr(t7,TIME_DATE),"; p7=",p7); if(p1==p4) { Alert("Fan to construct it is impossible."); p3=0;p6=0;p7=0;t3=0;t6=0;t7=0; } if(ExtScale==0) { AutoScale=MathAbs((p7-p3)*MathPow(10,Digits)/(2*(PP[ExtPoint-3]-ObjectGetShiftByValue("Mediana"+"_"+ExtDepth+"_"+ExtComplect+"_"+save,p6)))); }else AutoScale=ExtScale; CreateObject(p3,p6,p7,t3,t6,t7,save,AutoScale); } //---- //---- return(0); } //+------------------------------------------------------------------+ /*------------------------------------------------------------------+ | ZigZag_Talex, ищет точки перелома на графике. Количество точек | | задается внешним параметром ExtPoint. | +------------------------------------------------------------------*/ void ZZTalex(int n) { /*переменные*/ int i,j,k,zzbarlow,zzbarhigh,curbar,curbar1,curbar2,EP,Mbar[]; double curpr,Mprice[]; bool flag,fd; static int endbar; static double endpr; /*начало*/ for(i=0;i<=Bars-1;i++) {zz[i]=0.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; 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=ExtDepth; } if(fd==false) { Mbar[k]=iHighest(NULL,0,MODE_HIGH,Mbar[k+1]-Mbar[k],Mbar[k]);Mprice[k]=High[Mbar[k]];endbar=ExtDepth; } } if(k