//+------------------------------------------------------------------+
//|Harmonic             leftbrain_v2.mq4 |
//|Harmonic   Copyright � 2006, Akuma99. |
//|                                    http://www.beginnertrader.com |
//+------------------------------------------------------------------+

#property copyright "Copyright � 2006, Akuma99."
#property link      "http://www.beginnertrader.com"

#property indicator_chart_window

extern int       fib_number=180;
extern int       stickyBuffer=5;
extern int       sets=25;
extern bool      override=false;
extern double    baseline=0.0;

double base1000[200], base382[200], base236[200], base146[200], base90[200], base50[200]; 

int deinit() {
   
   clearBuffers();
   return(0);
   
}

int start() {
   
   double bases[200];
   double base;
   int lineWidth;
   
   if (override == false) {
   
         string sym = Symbol();
   
         if (sym == "EURUSD") base=1.2000;
         if (sym == "USDCHF") base=1.2000;
         if (sym == "USDCAD") base=1.2000;
         if (sym == "GBPUSD") base=2.0000;
         if (sym == "GBPCHF") base=2.0000;
         if (sym == "EURAUD") base=2.0000;
         if (sym == "USDJPY") base=100.00;
         if (sym == "AUDJPY") base=100.00;
         if (sym == "CHFJPY") base=100.00;
         if (sym == "CADJPY") base=100.00;
         if (sym == "NZDJPY") base=100.00;
         if (sym == "EURJPY") base=120.00;
         if (sym == "GBPJPY") base=200.00;
         if (sym == "USDCNY") base=8.0000;
         if (sym == "EURCHF") base=1.5000;
         if (sym == "AUDUSD") base=1.0000;
         if (sym == "EURGBP") base=1.0000;
         if (sym == "AUDCAD") base=1.0000;
         if (sym == "NZDUSD") base=0.5000;
         

         for (int i=99; i>0; i--) {
         
            bases[i] = base-((fib_number*Point)*(100-i));
            
            base1000[i] = base-((1000*Point)*(100-i));
            base382[i] = base-((382*Point)*(100-i));
            base236[i] = base-((236*Point)*(100-i));
            base146[i] = base-((146*Point)*(100-i));
            base90[i] = base-((90*Point)*(100-i));
            base50[i] = base-((50*Point)*(100-i));
            
         }
   
         bases[100] = base;
         
         base1000[100] = base;
         base382[100] = base;
         base236[100] = base;
         base146[100] = base;
         base90[100] = base;
         base50[100] = base;
   
         for (i=101; i<201; i++) {
            
            bases[i] = base+((fib_number*Point)*(i-100));
            
            base1000[i] = base+((1000*Point)*(i-100));
            base382[i] = base+((382*Point)*(i-100));
            base236[i] = base+((236*Point)*(i-100));
            base146[i] = base+((146*Point)*(i-100));
            base90[i] = base+((90*Point)*(i-100));
            base50[i] = base+((50*Point)*(i-100));
         
         }
   
         baseline = bases[ArrayBsearch(bases,Close[1],WHOLE_ARRAY,0,MODE_ASCEND)];
         
   }
   
   double b;
   
   double bottom = baseline-((fib_number*(sets+1))*Point);
   
   int s = sets*2;
   
   // draw sets above baseline
   for (i=1; i<=s; i++) {
      
      b = bottom+((fib_number*i)*Point);
      lineWidth = getStickyValue(b);

      ObjectCreate("Harmonic Base line "+fib_number+" "+i, OBJ_HLINE, 0, Time[40], b);
      ObjectSet("Harmonic Base line "+fib_number+" "+i, OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetText("Harmonic Base line "+fib_number+" "+i, "Harmonic baseline ("+DoubleToStr(b,4)+") ["+lineWidth+"]", 8, "Tahoma", Green);
      if (lineWidth > 0) {
         ObjectSet("Harmonic Base line "+fib_number+" "+i, OBJPROP_COLOR, Red);
      } else {
         ObjectSet("Harmonic Base line "+fib_number+" "+i, OBJPROP_COLOR, LimeGreen);
      }
   
   }
  
   setFibonaccis(bottom);
   
   Comment("" + fib_number + " Harmonic Fibo by Akuma99 and Accrete",
   "\n1/2 Beat Harmonics on a " + DoubleToStr(baseline,4)," Baseline",
   "\nVisit beginnertrader.com and accrete.com :-)",);
//   "\nBaseline used: " + DoubleToStr(baseline,4)," with 1/2Beat Harmonics and 34CHLema Tunnel",);
   
   return(0);
   
}

void setFibonaccis (double b) {
   
   double f146,f236,f382,f50,f618,f764,f854,b1;
   int lineWidth;
   
   lineWidth = getStickyValue(f146);
   int i;
   
   int s = sets*2;
   
   // draw sets above baseline
   for (i=1; i<=s; i++) {
      
      b1 = b+((fib_number*i)*Point);
      f146 = b1+((fib_number*0.146)*Point);
      
      lineWidth = getStickyValue(f146);

      ObjectCreate("Harmonic f146"+fib_number+" "+i, OBJ_HLINE, 0, Time[40], f146);
      ObjectSet("Harmonic f146"+fib_number+" "+i, OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetText("Harmonic f146"+fib_number+" "+i, "Harmonic 14.6% ("+DoubleToStr(f146,4)+") ["+lineWidth+"]", 8, "Tahoma", Purple);
      if (lineWidth > 0) {
         ObjectSet("Harmonic f146"+fib_number+" "+i, OBJPROP_COLOR, FireBrick);
      } else {
         ObjectSet("Harmonic f146"+fib_number+" "+i, OBJPROP_COLOR, Purple);
      }

   }
   
   for (i=1; i<=s; i++) {
      
      b1 = b+((fib_number*i)*Point);
      f236 = b1+((fib_number*0.236)*Point);
      
      lineWidth = getStickyValue(f236);
      
      ObjectCreate("Harmonic f236"+fib_number+" "+i, OBJ_HLINE, 0, Time[40], f236);
      ObjectSet("Harmonic f236"+fib_number+" "+i, OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetText("Harmonic f236"+fib_number+" "+i, "Harmonic 23.6% ("+DoubleToStr(f236,4)+") ["+lineWidth+"]", 8, "Tahoma", Purple);
      if (lineWidth > 0) {
         ObjectSet("Harmonic f236"+fib_number+" "+i, OBJPROP_COLOR, Orange);
      } else {
         ObjectSet("Harmonic f236"+fib_number+" "+i, OBJPROP_COLOR, Aqua);
      }
      
   }
   
   for (i=1; i<=s; i++) {
      
      b1 = b+((fib_number*i)*Point);
      f382 = b1+((fib_number*0.382)*Point);
      
      lineWidth = getStickyValue(f382);

      ObjectCreate("Harmonic f382"+fib_number+" "+i, OBJ_HLINE, 0, Time[40], f382);
      ObjectSet("Harmonic f382"+fib_number+" "+i, OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetText("Harmonic f382"+fib_number+" "+i, "Harmonic 38.2% ("+DoubleToStr(f382,4)+") ["+lineWidth+"]", 8, "Tahoma", Green);
      if (lineWidth > 0) {
         ObjectSet("Harmonic f382"+fib_number+" "+i, OBJPROP_COLOR, Orange);
      } else {
         ObjectSet("Harmonic f382"+fib_number+" "+i, OBJPROP_COLOR, Aqua);
      }
      
   }
   
   for (i=1; i<=s; i++) {

      b1 = b+((fib_number*i)*Point);
      f50 = b1+((fib_number*0.500)*Point);

      lineWidth = getStickyValue(f50);

      ObjectCreate("Harmonic f50"+fib_number+" "+i, OBJ_HLINE, 0, Time[40], f50);
      ObjectSet("Harmonic f50"+fib_number+" "+i, OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetText("Harmonic f50"+fib_number+" "+i, "Harmonic 50.0% ("+DoubleToStr(f50,4)+") ["+lineWidth+"]", 8, "Tahoma", Green);
      if (lineWidth > 0) {
         ObjectSet("Harmonic f50"+fib_number+" "+i, OBJPROP_COLOR, Orange);
      } else {
         ObjectSet("Harmonic f50"+fib_number+" "+i, OBJPROP_COLOR, Aqua);
      }
   
   }
   
   
   for (i=1; i<=s; i++) {

      b1 = b+((fib_number*i)*Point);
      f618 = b1+((fib_number*0.618)*Point);

      lineWidth = getStickyValue(f618);

      ObjectCreate("Harmonic f618"+fib_number+" "+i, OBJ_HLINE, 0, Time[40], f618);
      ObjectSet("Harmonic f618"+fib_number+" "+i, OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetText("Harmonic f618"+fib_number+" "+i, "Harmonic 61.8% ("+DoubleToStr(f618,4)+") ["+lineWidth+"]", 8, "Tahoma", Green);
      if (lineWidth > 0) {
         ObjectSet("Harmonic f618"+fib_number+" "+i, OBJPROP_COLOR, Orange);
      } else {
         ObjectSet("Harmonic f618"+fib_number+" "+i, OBJPROP_COLOR, Aqua);
      }

   }
   
   for (i=1; i<=s; i++) {

      b1 = b+((fib_number*i)*Point);
      f764 = b1+((fib_number*0.764)*Point);

      lineWidth = getStickyValue(f764);

      ObjectCreate("Harmonic f764"+fib_number+" "+i, OBJ_HLINE, 0, Time[40], f764);
      ObjectSet("Harmonic f764"+fib_number+" "+i, OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetText("Harmonic f764"+fib_number+" "+i, "Harmonic 76.4% ("+DoubleToStr(f764,4)+") ["+lineWidth+"]", 8, "Tahoma", Green);
      if (lineWidth > 0) {
         ObjectSet("Harmonic f764"+fib_number+" "+i, OBJPROP_COLOR, Orange);
      } else {
         ObjectSet("Harmonic f764"+fib_number+" "+i, OBJPROP_COLOR, Aqua);
      }

   }
   
   for (i=1; i<=s; i++) {
      
      b1 = b+((fib_number*i)*Point);
      f854 = b1+((fib_number*0.854)*Point);
      
      lineWidth = getStickyValue(f764);

      ObjectCreate("Harmonic f854"+fib_number+" "+i, OBJ_HLINE, 0, Time[40], f854);
      ObjectSet("Harmonic f854"+fib_number+" "+i, OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetText("Harmonic f854"+fib_number+" "+i, "Harmonic 85.4% ("+DoubleToStr(f854,4)+") ["+lineWidth+"]", 8, "Tahoma", Purple);
      if (lineWidth > 0) {
         ObjectSet("Harmonic f854"+fib_number+" "+i, OBJPROP_COLOR, FireBrick);
      } else {
         ObjectSet("Harmonic f854"+fib_number+" "+i, OBJPROP_COLOR, Purple);
      }

      
   }
   
   return(0);

}


int getStickyValue (double val) {

   int cnt=0;
   
   for (int i=0; i<201; i++) {
      if ((base1000[i] >= val-stickyBuffer*Point) && (base1000[i] <= val+stickyBuffer*Point) && fib_number != 1000) cnt++;
      if ((base382[i] >= val-stickyBuffer*Point) && (base382[i] <= val+stickyBuffer*Point) && fib_number != 382) cnt++;
      if ((base236[i] >= val-stickyBuffer*Point) && (base236[i] <= val+stickyBuffer*Point) && fib_number != 236) cnt++;
      if ((base146[i] >= val-stickyBuffer*Point) && (base146[i] <= val+stickyBuffer*Point) && fib_number != 146) cnt++;
      if ((base90[i] >= val-stickyBuffer*Point) && (base90[i] <= val+stickyBuffer*Point) && fib_number != 90) cnt++;
      if ((base50[i] >= val-stickyBuffer*Point) && (base50[i] <= val+stickyBuffer*Point) && fib_number != 50) cnt++;
   }
   
   return (cnt);
   
}


void clearBuffers () {
   
   int s = sets*2, i;
   
   for (i=1; i<=s; i++) {
      ObjectDelete("Harmonic f854"+fib_number+" "+i);
      ObjectDelete("Harmonic f764"+fib_number+" "+i);
      ObjectDelete("Harmonic f618"+fib_number+" "+i);
      ObjectDelete("Harmonic f50"+fib_number+" "+i);
      ObjectDelete("Harmonic f382"+fib_number+" "+i);
      ObjectDelete("Harmonic f236"+fib_number+" "+i);
      ObjectDelete("Harmonic f146"+fib_number+" "+i);
   
      ObjectDelete("Harmonic Base line "+fib_number+" "+i);
   }
}