//+------------------------------------------------------------------+
//|                                           Counter Trend Fibs.mq4 |
//|                                                           Miyagi |
//|                                                        2011Nov21 |
//+------------------------------------------------------------------+
#property copyright "Miyagi"
#property link      "http://www.forexfactory.com/showthread.php?t=325703"
#property indicator_chart_window

//----input parameters
extern color   Level_Color = SaddleBrown;
extern int     Level_Width = 1;
extern color   Label_Color = SaddleBrown;
extern int     Label_Size  = 6;
extern string  Label_Font  = "Arial";
       string  Label_Space = "                                         ";
       bool    MergeSundayWithFriday = true;

//----object name prefix
string Prefix = "Counter Trend Fibs";
datetime Time_0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
//----include Sunday into Friday
   for (int i=0; i<7; i++) {
      if (TimeDayOfWeek(iTime(NULL, PERIOD_D1, i)) == 0 /*sunday*/) MergeSundayWithFriday = True; }
//----
   DeleteObjects(Prefix);
   Time_0 = 0;
//----
return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{
//----
   DeleteObjects(Prefix);
//----
return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
//----
   static int openbar;
   int closebar, opentime, i;
   double high, low;
   static double level[5];
   double fib[5] = {0.236, 0.382, 0.500, 0.618, 0.764};
   string label[5] = {"CT Trade 1", "CT Trade 2", "CT Trade 3", "CT Trade 2", "CT Trade 1"};
//----new day?
   if (iTime(NULL, PERIOD_D1, 0) > Time_0) {
      Time_0 = iTime(NULL, PERIOD_D1, 0);
//----
      openbar = 1;
      closebar = 1;
//----merge sunday
      opentime = iTime(NULL, PERIOD_D1, openbar);
      if (MergeSundayWithFriday) {
         if (TimeDayOfWeek(opentime) == 5 /*friday*/) { openbar++; closebar++; }
         else if (TimeDayOfWeek(opentime) == 0 /*sunday*/) { openbar++; }
      }
//----calc
      high = MathMax(iHigh(NULL, PERIOD_D1, openbar), iHigh(NULL, PERIOD_D1, closebar));
      low = MathMin(iLow(NULL, PERIOD_D1, openbar), iLow(NULL, PERIOD_D1, closebar));
      for (i = 0; i < 5; i++) {
         level[i] = low + (high - low) * fib[i]; }
   }
//----draw/update
   for (i = 0; i < 5; i++) {
      DrawLevel(i, iTime(NULL, PERIOD_D1, openbar), level[i], iTime(NULL, PERIOD_D1, 0), Level_Color, Level_Width);
      DrawLabel(i, Time[0], level[i], Label_Space+label[i], Label_Size, Label_Font, Label_Color); }
//----
return(0);
}

//+------------------------------------------------------------------+
//| DrawLevel                                                        |
//+------------------------------------------------------------------+
void DrawLevel(int number, datetime time1, double level1, datetime time2, color clr, int wdth)
{
//----
   string obj = Prefix + " level #" + number;
//----line
   if (clr >= 0) {
      if (ObjectFind(obj) >= 0) {
         ObjectMove(obj, 0, time1, level1);
         ObjectMove(obj, 1, time2, level1); }
      else {
         ObjectCreate(obj, OBJ_TREND, 0, time1, level1, time2, level1);
         ObjectSet(obj, OBJPROP_COLOR, clr);
         ObjectSet(obj, OBJPROP_WIDTH, wdth);
         ObjectSet(obj, OBJPROP_STYLE, STYLE_SOLID);
         ObjectSet(obj, OBJPROP_RAY, true);
         ObjectSet(obj, OBJPROP_BACK, false); }
   }
//----
}

//+------------------------------------------------------------------+
//| DrawLabel                                                        |
//+------------------------------------------------------------------+  
void DrawLabel(int number, datetime time1, double level1, string text, int size, string font, color clr)
{
//----
   string obj = Prefix + " label #" + number;
//----text
   if (clr >= 0) {
      if (ObjectFind(obj) >= 0) {
         ObjectMove(obj, 0, time1, level1); }
      else {
         ObjectCreate(obj, OBJ_TEXT, 0, time1, level1);
         ObjectSetText(obj, text, size, font, clr);
         ObjectSet(obj, OBJPROP_BACK, false); }
   }
//----
}

//+------------------------------------------------------------------+
//| DeleteObjects                                                    |
//+------------------------------------------------------------------+
void DeleteObjects(string obj)
{
//----
   for (int i = ObjectsTotal(); i>=0; i--) {
      if(StringFind(ObjectName(i), obj, 0)>-1) ObjectDelete(ObjectName(i));
   }
//----
}

