//+------------------------------------------------------------------+ //| Copyright © 2010 | //| | //| | //+------------------------------------------------------------------+ #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Gold #property indicator_color2 LightBlue //---- input parameters extern int BarsBefore=2; // Баров до... extern int BarsAfter=2; // Баров после extern int Width=2; // Размер значка extern int BarsToProcess=100; // Количество баров для поиска //---- buffers double FractUpBuffer1[]; double FractDnBuffer2[]; string sy, Prefix, NameIND; int tf; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_ARROW,EMPTY,0); SetIndexBuffer(0,FractUpBuffer1); SetIndexArrow(0,119); SetIndexLabel(0,"Fractal Up"); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_ARROW,EMPTY,0); SetIndexBuffer(1,FractDnBuffer2); SetIndexArrow(1,119); SetIndexLabel(1,"Fractal Dn"); SetIndexEmptyValue(1,0.0); //---- NameIND="Pattern_v1_01"; IndicatorShortName(NameIND+"_"+GetNameTF(Period())); Prefix=NameIND+"_"+GetNameTF(Period()); // Префикс для имён объектов sy=Symbol(); tf=Period(); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { // -------- Блок удаления всех объектов, построенных на графике -------- string Name_Del[1]; int Quant_Del=0; int Quant_Objects=ObjectsTotal(); int LenPref=StringLen(Prefix); ArrayResize(Name_Del,Quant_Objects); for(int k=0; k0) counted_bars--; limit=Bars-counted_bars; if(limit>BarsToProcess) limit=BarsToProcess; // if (limit>0) FindUpFractals(BarsBefore, BarsAfter); FindDnFractals(BarsBefore, BarsAfter); //---- return(0); } //============================================================================== // --------------------------------- Функции ----------------------------------+ //============================================================================== int FindDnFractals(int nl, int nr) { int i, k, nb; double fractal; datetime tm; string nm; bool fl, fr; int delta=SetDistance(Period()); for (i=BarsToProcess; i>0; i--) { fl=false; FractDnBuffer2[i]=0; if (Open[i]Close[i+k]) fl=true; else { fl=false; break; } } if (!fl || Open[i+nl+1]>Close[i+nl+1]) continue; fr=false; for (k=0; k0; i--) { fl=false; FractUpBuffer1[i]=0; if (Open[i]>Close[i]) { for (k=1; k<=nl; k++) { if (Open[i+k]Close[i-k]) fr=true; else { fr=false; break; } } if (!fr || Open[i-nr]>Close[i-nr] || iBarShift(sy,tf,Time[i-nr])==0) continue; if (High[i]>High[i+1]) { fractal=High[i]; nb=i; tm=Time[i];} else { fractal=High[i+1]; nb=i+1; tm=Time[i+1]; } FractUpBuffer1[nb]=fractal; nm=Prefix+"_Up_Fractal_"+nl+"/"+nr+"_"+TimeToStr(tm); fractal=MathMax(High[i], High[i+1]); SetArrow(217, PaleGoldenrod, nm, tm, fractal+4*delta*Point, Width); WindowRedraw(); } } return(0); } //+----------------------------------------------------------------------------+ string GetNameTF(int TimeFrame=0) { switch (TimeFrame) { case PERIOD_M1: return("M1"); case PERIOD_M5: return("M5"); case PERIOD_M15: return("M15"); case PERIOD_M30: return("M30"); case PERIOD_H1: return("H1"); case PERIOD_H4: return("H4"); case PERIOD_D1: return("Daily"); case PERIOD_W1: return("Weekly"); case PERIOD_MN1: return("Monthly"); default: return("UnknownPeriod"); } } //+----------------------------------------------------------------------------+ int SetDistance(int TimeFrame) { switch (TimeFrame) { case PERIOD_M1: return(1); case PERIOD_M5: return(1); case PERIOD_M15: return(2); case PERIOD_M30: return(3); case PERIOD_H1: return(4); case PERIOD_H4: return(4); case PERIOD_D1: return(4); case PERIOD_W1: return(4); case PERIOD_MN1: return(4); default: return(0); } } //+----------------------------------------------------------------------------+ void SetArrow(int cd, color cl, string nm, datetime t1=0, double p1=0, int sz=0) { if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_ARROW, 0, 0, 0); ObjectSet(nm, OBJPROP_TIME1 , t1); ObjectSet(nm, OBJPROP_PRICE1 , p1); ObjectSet(nm, OBJPROP_ARROWCODE, cd); ObjectSet(nm, OBJPROP_COLOR , cl); ObjectSet(nm, OBJPROP_WIDTH , sz); } //+----------------------------------------------------------------------------+