Author: Copyright � 2008-2009, GreenDog
_iGDR_FL
0 Views
0 Downloads
0 Favorites
_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);
}

Comments