//+------------------------------------------------------------------+ //| GannZIGZAG.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "" #property link "" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 DeepSkyBlue #property indicator_color2 Black //---- input parameters extern int GSv_range=2; //---- buffers double GSv_sl[]; double GSv_m[]; //---- bool draw_up=0,draw_dn=0,initfl=0; int fPoint_i,sPoint_i,s_up,s_dn,drawf,lb,idFile; double h,l; bool cur_h=0,cur_l=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_SECTION,STYLE_DOT); //SetIndexStyle(1,DRAW_SECTION); SetIndexBuffer(0,GSv_sl); //SetIndexBuffer(1,GSv_m); SetIndexEmptyValue(0,0.0); //SetIndexEmptyValue(1,0.0); FileDelete("Gann.txt"); idFile=FileOpen("Gann.txt",FILE_READ|FILE_WRITE," "); //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int cb,limit,i; //---- if( GSv_range<1 ) { Alert("Индикатор рассчитывает значения /n при параметре GSv_range не меньше 1!!!"); return(-1); } if( counted_bars<0 ) { return(-1); } else { if( Bars-1-counted_bars<=0 ) { limit=0; } else { limit=Bars-1-counted_bars; } } //первоначальная инициализация if( initfl!=1 ) { myInit(); } //FileWrite(idFile," 0. Баров на графике "+Bars); //цикл по барам for( cb=limit;cb>=0;cb--) { if( cb==0 ) FileWrite(idFile,"---- индекс текущего бара "+cb+" "+(Bars-1-cb)+" время "+TimeToStr(Time[cb])+" баров на графике "+Bars); //если на предыдущем баре был отрисован экстремум if( GSv_sl[cb+1]>0 && lb!=Bars-1-cb ) { if( draw_up!=0 ) { s_dn=0; if( cb==0 ) FileWrite(idFile," 1. Был отрисован максимум, счетчик минимумов обнулен"); } else { if( draw_dn!=0 ) { s_up=0; if( cb==0 ) FileWrite(idFile," 2. Был отрисован минимум, счетчик максимумов обнулен"); } } } if( lb!=Bars-1-cb ) { cur_h=0; cur_l=0; if( cb==0 ) FileWrite(idFile," 2.1 новый бар флаги наличия максимума и минимума сброшены"); } if( cb>Bars-2-drawf || (High[cb]<=High[cb+1] && Low[cb]>=Low[cb+1]) ) { if( cb==0 ) FileWrite(idFile," 3. Бар либо 'внутренний', либо до первого экстремума"); continue; } if( draw_up!=0 ) { if( cb==0 ) FileWrite(idFile," 4. Индикатор направлен вверх"); //если линия направлена вверх if( High[cb]>h ) { //если достигнут новый максимум h=High[cb]; cur_h=1; if( cb==0 ) FileWrite(idFile," 5. Достигнут новый максимум = "+h+" cur_h "+cur_h); } if( Low[cb]h ) { //если достигнут новый максимум h=High[cb]; if( cb==0 ) FileWrite(idFile," 17. Достигнут новый максимум "+h); if( lb!=Bars-1-cb || cur_h!=1 ) s_up++; cur_h=1; //если это не тот же самый бар if( cb==0 ) FileWrite(idFile," 18. Новый бар, счетчик максимумов увеличен "+s_up+" cur_h "+cur_h+" h "+h); } if( Low[cb]=0;cb--) { if( High[cb]>High[cb+1] || Low[cb]h && High[cb]>High[cb+1] ) { s_up++; } if( Low[cb]=Open[cb] ) { s_dn=0; GSv_sl[Bars-1]=Low[Bars-1]; GSv_sl[cb]=High[cb]; draw_up=1; break; } else { s_up=0; GSv_sl[Bars-1]=High[Bars-1]; GSv_sl[cb]=Low[cb]; draw_dn=1; break; } } else { h=High[cb]; l=Low[cb]; sPoint_i=Bars-1-cb; if( s_up==GSv_range ) { s_dn=0; GSv_sl[Bars-1]=Low[Bars-1]; GSv_sl[cb]=High[cb]; draw_up=1; break; } else { if( s_dn==GSv_range ) { s_up=0; GSv_sl[Bars-1]=High[Bars-1]; GSv_sl[cb]=Low[cb]; draw_dn=1; break; } } } } initfl=1; drawf=sPoint_i; //---- return(0); } //+------------------------------------------------------------------+