// 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 && sBars<frNum*10) { Go=false; return(-1); } if (sBars==0) sBars=Bars; return(0); } int deinit(){ Comment(""); for(int i=0;i<3;i++){ string name="IPGDR_Lv"+i; ObjectDelete(name); name=name+"Up"; ObjectDelete(name); name=name+"Dw"; ObjectDelete(name); name=name+"Tx"; ObjectDelete(name); } } int start(){ if (!Go) { Comment("Íåêîððåêòíûå ïàðàìåòðû èíäèêàòîðà!"); return(-1); } if (Bars<sBars) { Comment("Íåäîñòàòî÷íî áàðîâ íà ãðàôèêå!"); return(0); } if (Bars==lastBars) return(0); // ñ÷èòàåì òîêà â íà÷àëå áàðà lastBars=Bars; // èùåì ôðàêòàëû, çàíîñèì èõ â ìàññèâ, íî íå áîëåå äîïóñòèìîãî êîëè÷åñòâà int sh=0; ArrayInitialize(aData,0); double lastExt=0; for(int i=frNum+1;i<sBars-2*frNum;i++){ if (frMode!=MODE_LOW && upFrac(i)) { // äîáàâëÿåì âåðøèíû [êðîìå ðåæèìà âïàäèí] // ïðè íåñòðîãîì óñëîâèè ïðîïóñêàåì äóáëèðóþùèå ñîñåäíèå âåðøèíû if (!(frType!=0 && lastExt>0 && 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;i<sh;i++){ for(int j=i+1;j<sh;j++){ if (aData[j][0]>aData[i][0]-dlt && aData[j][0]<aData[i][0]+dlt) { aData[i][1]=aData[i][1]+1; aData[j][1]=aData[j][1]+1; } } } // îïðåäåëÿåì òðè ñèëüíåéøèõ óðîâíÿ double cur[2],tmp[2]; aRes[0][0]=aData[0][0]; aRes[0][1]=aData[0][1]; for(i=1;i<sh;i++){ cur[0]=aData[i][0]; cur[1]=aData[i][1]; if (cur[1]>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 || 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[0][0]+dlt) && (cur[0]<aRes[1][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]<Low[cnt] || Low[cnt-i]<Low[cnt]) return(false); } } return(true); }
Sample
Analysis
Market Information Used:
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains open time of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: