// Indicators Pack - Green Digger Reseach //+------------------------------------------------------------------+ //| [IP-GDR] Fractal Levels | //| Copyright © 2008-2009, GreenDog, Russia | //| krot@inbox.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008-2009, GreenDog" #property link "krot@inbox.ru" #property indicator_chart_window extern int frNum = 2; // количество баров фрактала, 2=5-барный фрактал, 3=7-барный и тд extern int frType = 1; // тип определения фрактала 0=строгий, 1=нестрогий extern int frMode = 0; // режимы - MODE_LOW(1)=Sup, MODE_HIGH(2)=Res, 0=S&R extern double dlt = 0.24; // погрешность от средей высоты баров extern int sBars = 480; // количество баров, однако обрабатывается не более 200 bool Go = true; int lastBars=0,lastTime=0; double aData[240][2],aRes[3][2]; int aCol[6]={MistyRose, OldLace, Honeydew, Red, Gold, Green}; int init(){ if (frNum!=0 && frNum<2) { Go=false; return(-1); } if (sBars!=0 && sBars0 && lastExt==High[i])){ aData[sh][0]=High[i]; lastExt=High[i]; sh++; } } if (sh>=240) break; if (frMode!=MODE_HIGH && dwFrac(i)) { // добавляем впадины [кроме режима вершин] // при нестрогом условии пропускаем дублирующие соседние впадины if (!(frType!=0 && lastExt>0 && lastExt==Low[i])){ aData[sh][0]=Low[i]; lastExt=Low[i]; sh++; } } if (sh>=240) break; } // определяем средний размах свеч и соотв допуск double sHL=0; for(i=1;i<=sBars;i++) sHL=sHL+(High[i]-Low[i]); sHL=sHL/sBars; dlt=sHL*dlt; // определяем рейтинги для каждого уровня for(i=0;iaData[i][0]-dlt && aData[j][0]aRes[0][1]) { // если рейтинг больше 1го места, то 1е становицо текущим tmp[0]=aRes[0][0]; tmp[1]=aRes[0][1]; aRes[0][0]=cur[0]; aRes[0][1]=cur[1]; cur[0]=tmp[0]; cur[1]=tmp[1]; } // если рейтинг выше 2го места и при этом не принадлежит 1му - замещаем 2е место if (cur[1]>aRes[1][1] && (cur[0]aRes[0][0]+dlt)) { tmp[0]=aRes[1][0]; tmp[1]=aRes[1][1]; aRes[1][0]=cur[0]; aRes[1][1]=cur[1]; cur[0]=tmp[0]; cur[1]=tmp[1]; } // если рейтинг выше 3го места и при этом не принадлежит 1му и 2му - замещаем 3е место if (cur[1]>aRes[2][1] && (cur[0]aRes[0][0]+dlt) && (cur[0]aRes[1][0]+dlt)) { aRes[2][0]=cur[0]; aRes[2][1]=cur[1]; } } // отрисовываем сильные уровни for(i=0;i<3;i++){ double dwL=aRes[i][0]-dlt, upL=aRes[i][0]+dlt; string name="IPGDR_Lv"+i; ObjectCreate(name,OBJ_CHANNEL,0,Time[24],upL,Time[1],upL,Time[24],dwL); ObjectSet(name,OBJPROP_COLOR,aCol[i]); ObjectSet(name,OBJPROP_BACK,true); ObjectSet(name,OBJPROP_RAY,true); name=name+"Up"; ObjectCreate(name,OBJ_TREND,0,Time[24],upL,Time[1],upL); ObjectSet(name,OBJPROP_COLOR,aCol[i+3]); ObjectSet(name,OBJPROP_RAY,true); name=name+"Dw"; ObjectCreate(name,OBJ_TREND,0,Time[24],dwL,Time[1],dwL); ObjectSet(name,OBJPROP_COLOR,aCol[i+3]); ObjectSet(name,OBJPROP_RAY,true); name=name+"Tx"; ObjectCreate(name,OBJ_TEXT,0,Time[32],upL+2*Point); ObjectSetText(name,DoubleToStr(aRes[i][0],Digits),14,"tahoma",aCol[i+3]); } // выводим комментарии string rem=""; if (frType==1) rem=rem+"Классические "; else rem=rem+"Строгие "; rem=rem+(frNum*2+1)+"-барные фракталы"; if (frMode==MODE_LOW) rem=rem+", впадины"; else if (frMode==MODE_LOW) rem=rem+", вершины"; rem=rem+"\nНайдено "+(sh)+" фрактала(ов) \nНаиболее сильные уровни "; rem=StringConcatenate(rem,aRes[0][0],"[",aRes[0][1],"], ",aRes[1][0],"[",aRes[1][1],"], ",aRes[2][0],"[",aRes[2][1], "], погрешность ±",NormalizeDouble(dlt/Point,1)," пункта(ов)"); Comment(rem); return(0); } bool upFrac(int cnt){ for(int i=1;i<=frNum;i++){ if (frType==0) { // если строгое условие и пост или пред бары выше-равны соседа - нет фрактала if (High[cnt+i]>=High[cnt+i-1] || High[cnt-i]>=High[cnt-i+1]) return(false); } else { // если нестрогое условие и пост или пред бары выше центра - нет фрактала if (High[cnt+i]>High[cnt] || High[cnt-i]>High[cnt]) return(false); } } return(true); } bool dwFrac(int cnt){ for(int i=1;i<=frNum;i++){ if (frType==0) { // если строгое условие и пост или пред бары ниже-равны соседа - нет фрактала if (Low[cnt+i]<=Low[cnt+i-1] || Low[cnt-i]<=Low[cnt-i+1]) return(false); } else { // если нестрогое условие и пост или пред бары ниже центра - нет фрактала if (Low[cnt+i]