//+-----------------------------------------------------------------+ //| FZR.mq4 | //| Copyright c FOREX&STOX | //| roman_kr_2006@mail.ru | //|12.2007 Версия 1.0 | //+-----------------------------------------------------------------+ //| Индикатор Фрактально-зигзагового разворота. | //| Написан по идеям из книги3 Masterforex-V. | //| Правильность интерпретации идеи не гарантирую. | //| | //| | //+-----------------------------------------------------------------+ #property copyright "FOREX&STOX" #property link "roman_kr_2006@mail.ru " #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Red #property indicator_color2 Green //---- ВХОДНЫЕ ПАРАМЕТРЫ----// int fPeriod=1; int fShift=0; extern int ДлиннаЛинии=8; extern color ЦветВеерх=Green; extern color ЦветВниз=Red; extern int СтильЛиний=STYLE_SOLID; extern int ТолщинаЛиний=2; extern string M="FZR"; //---- БУФЕРА ----ВЫХОДНые ----// double ExtMapBuffer1[]; double ExtMapBuffer2[]; //---- int ExtCountedBars=0; int mMonth; int mYear ; int mDay ; datetime mDatBegin; //+------------------------------------------------------------------+ //| ИНИЦИАЛИЗАЦИЯ | //+------------------------------------------------------------------+ int init() { int draw_begin; string short_name; //---- drawing settings SetIndexStyle(0,DRAW_LINE); SetIndexShift(0,fShift); SetIndexStyle(1,DRAW_LINE); SetIndexShift(1,fShift); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)); if(fPeriod<2) fPeriod=13; draw_begin=fPeriod-1; //---- indicator short name short_name="FZR("; draw_begin=0; IndicatorShortName(M); SetIndexDrawBegin(0,draw_begin); //---- indicator buffers mapping SetIndexBuffer(0,ExtMapBuffer1); SetIndexBuffer(1,ExtMapBuffer2); //---- initialization done return(0); } //+------------------------------------------------------------------+ //| ПОДГОТОВОЧКА | //+------------------------------------------------------------------+ int start() { if(Bars<=fPeriod) return(0); ExtCountedBars=IndicatorCounted(); //---- check for possible errors if (ExtCountedBars<0) return(-1); //---- last counted bar will be recounted if (ExtCountedBars>0) ExtCountedBars--; //+------------------------------------------------------------------+ //| ГЛАВНЫЙ МОДУЛЬ | //+------------------------------------------------------------------+ double FractalUPn; //ПОСЛЕДНИЙ UP ФРАКТАЛ double POSFractalUPn; //его позиция с конца double FractalUPp; //ПРЕДПОСЛЕДНИЙ UP ФРАКТАЛ double POSFractalUPp; //его позиция с конца double FractalDn; //ПОСЛЕДНИЙ DOWN ФРАКТАЛ double POSFractalDn; //его позиция с конца double FractalDp; //ПРЕДПОСЛЕДНИЙ DOWN ФРАКТАЛ double POSFractalDp; //его позиция с конца int Cond1,Cond2,Cond3,ЛинияВверх, ЛинияВниз; string d; int i,pos=Bars-ExtCountedBars-1,f; //---- initial accumulation if(pos=0) //ВОТ ВОТ, ЗДЕСЬ ВСЁ КРУТИТСЯ {f=0; // UP ФРАКТАЛЫ________________________________________________________________________________________________ if (iFractals(NULL,0,MODE_UPPER, pos)!=0) //находим последний UP фрактал, { FractalUPn=iFractals(NULL,0,MODE_UPPER, pos); // его значение POSFractalUPn=pos; //и позицию с конца } i=10; //ну уж на дести то барах ранее должен появиться предыдущий фрактал while(i>0) {//======= if (iFractals(NULL,0,MODE_UPPER, POSFractalUPn+i)!=0) //находим предпоследний UP фрактал, { FractalUPp=iFractals(NULL,0,MODE_UPPER, POSFractalUPn+i); // его значение POSFractalUPp=POSFractalUPn+i; //и позицию с конца } i--; }//======= // DOWN ФРАКТАЛЫ_______________________________________________________________________________________________ if (iFractals(NULL,0,MODE_LOWER, pos)!=0) //находим последний DOWN фрактал, { FractalDn=iFractals(NULL,0,MODE_LOWER, pos); // его значение POSFractalDn=pos; //и позицию с конца } /**/ i=10; //ну уж на дести то барах ранее должен появиться предыдущий фрактал /**/ while(i>0) /**/ {//======= /**/ if (iFractals(NULL,0,MODE_LOWER, POSFractalDn+i)!=0) //находим предпоследний DOWN фрактал, /**/ { /**/ FractalDp=iFractals(NULL,0,MODE_LOWER, POSFractalDn+i); // его значение /**/ POSFractalDp=POSFractalDn+i; //и позицию с конца /**/ } /**/ i--; /**/ }//======= // ЗАКОНЧИЛИ С ФРАКТАЛАМИ______________________________________________________________________________________ //-- SELL SELL SELL -- if(FractalUPp>FractalUPn){Cond1=-1;}//верхний фрактал меньше предыдущего(это коррекционное движение) if(FractalDp>FractalDn){Cond2=-1;}// нижний фрактал меньше предыдущего if(POSFractalDnPOSFractalUPn){Cond3=-1;}// последний нижний фрактал располагается между двумя верхними if (Cond1==-1 && Cond2==-1 && Cond3==-1 && ЛинияВниз<0)//все 3 условия вместе собираем { //ExtMapBuffer1[pos]=FractalDn; //Comment("ГОТОВИМСЯ ПРОДАВАТЬ!"); ЛинияВниз=7; //- для того, чтобы несколько раз одно и тоже не рисовал if (pos-ДлиннаЛинии<0){f=ДлиннаЛинии-pos;} //- чтобы на правом краю хорошо отображался //ну РИСУЕМ ObjectCreate ("FZR "+TimeToStr(iTime(NULL,0, pos)), OBJ_TREND,0,iTime(NULL,0, pos+POSFractalDn-POSFractalUPn),FractalDn,iTime(NULL,0, pos-ДлиннаЛинии+f),FractalDn); if (pos>10){ObjectSet ("FZR "+TimeToStr(iTime(NULL,0,pos)),OBJPROP_RAY, false);}//- чтобы на правом краю отображался как луч ObjectSet ("FZR "+TimeToStr(iTime(NULL,0,pos)),OBJPROP_COLOR, ЦветВниз); ObjectSet ("FZR "+TimeToStr(iTime(NULL,0,pos)),OBJPROP_STYLE, СтильЛиний); ObjectSet ("FZR "+TimeToStr(iTime(NULL,0,pos)),OBJPROP_WIDTH, ТолщинаЛиний); } // ОТОБРАЖАЕМ НА //-- BUY BUY BUY -- if(FractalUPpPOSFractalUPn && POSFractalUPn>POSFractalDn){Cond3=1;}// if (Cond1==1 && Cond2==1 && Cond3==1 && ЛинияВверх<0) { //ExtMapBuffer2[pos]=FractalUPn; // Comment("ГОТОВИСМСЯ ПОКУПАТЬ!"); ЛинияВверх=7; if (pos-ДлиннаЛинии<0){f=ДлиннаЛинии-pos;} //ну РИСУЕМ ObjectCreate ("FZR "+TimeToStr(iTime(NULL,0, pos)), OBJ_TREND,0,iTime(NULL,0, pos+POSFractalUPn-POSFractalDn),FractalUPn,iTime(NULL,0, pos-ДлиннаЛинии+f),FractalUPn); if (pos>10){ ObjectSet ("FZR "+TimeToStr(iTime(NULL,0,pos)),OBJPROP_RAY, false);} ObjectSet ("FZR "+TimeToStr(iTime(NULL,0,pos)),OBJPROP_COLOR, ЦветВеерх); ObjectSet ("FZR "+TimeToStr(iTime(NULL,0,pos)),OBJPROP_STYLE, СтильЛиний); ObjectSet ("FZR "+TimeToStr(iTime(NULL,0,pos)),OBJPROP_WIDTH, ТолщинаЛиний); } // ОТОБРАЖАЕМ НА Cond1=0;Cond2=0;Cond3=0; ЛинияВверх--; ЛинияВниз--; pos--; } return(0); } //+-----------------------------+