_iGDR_FL





// 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: