//+------------------------------------------------------------------+
//|                                            Winning Indicator.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                              mykautsar@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, mykautsar@gmail.com."

#property indicator_chart_window

extern color Maingrid = Red;
extern color Subgrid  = Orange;
extern color Mid = Gainsboro; //rectangle in the middle
extern int   Div = 5;         // divider

 
double   high,low,range,mid,x,y,z,lot,lot2;
int      barHigh,barLow,midV,Grid;
datetime v1,v2;
string   timez,C,dowStr,timeleft;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   ObjectsDeleteAll(0,EMPTY);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   
   if (TimeHour(Time[0])>=0 && TimeHour(Time[0])<3)
   timez = "Sydney";
   else if (TimeHour(Time[0])==3) timez = "Sydney / Tokyo Open";     
   else if (TimeHour(Time[0])>3 && TimeHour(Time[0])<9) timez =  "Sydney / Tokyo";     
   else if (TimeHour(Time[0])==9) timez =  "Sydney Close / Tokyo";     
   else if (TimeHour(Time[0])>9 && TimeHour(Time[0])<10) timez =  "Tokyo";     
   else if (TimeHour(Time[0])==10) timez =  "Tokyo / London Open";
   else if (TimeHour(Time[0])>10 && TimeHour(Time[0])<12) timez =  "Tokyo / London ";
   else if (TimeHour(Time[0])==12) timez =  "Tokyo Close / London";
   else if (TimeHour(Time[0])>12 && TimeHour(Time[0])<15) timez =  "London";
   else if (TimeHour(Time[0])==15 ) timez =  "London / Newyork Open";
   else if (TimeHour(Time[0])>15 && TimeHour(Time[0])<19) timez =  "London / Newyork";
   else if (TimeHour(Time[0])==19 ) timez =  "London Close / Newyork";
   else if (TimeHour(Time[0])>19 ) timez =  "Newyork";

//----
   int CalcPeriod = 1440;       
   int shift	= iBarShift(NULL,CalcPeriod,Time[0])+ 1;//default = one period ago	 
	int StartTime = iTime(NULL,CalcPeriod,shift);	 
	int dow = TimeDayOfWeek(StartTime);string dowStr;
	   switch(dow)
	      {
   	   case 5: dowStr = " MONDAY";break;
   	   //Monday = Friday value 2 periods ago 
         case 0: shift=iBarShift(NULL,CalcPeriod,Time[0])+2; dowStr = "MONDAY"; break;
         case 1: dowStr = " TUESDAY"; break;       
         case 2: dowStr = " WEDNESDAY"; break;
         case 3: dowStr = " THURSDAY"; break;
         case 4: dowStr = " FRIDAY"; break;	 	   
         } 
         
      //Get time (H/M/S) remaining on current candle		
   	int h,m,s,t;    
      t=Time[0]+(Period()*60)-CurTime();
      s=t%60; string seconds = (s); if (s<10) {seconds = ("0"+seconds);} 
      m=(t-t%60)/60;   
      for(int i=0; i<24; i++){
         if(m>=60){m=m-60;h=h+1;}
         string minutes = (m); if (m<10) {minutes = ("0"+minutes);}   
         string hours = (h); if (h<10) {hours = ("0"+hours);} 
         string timeleft = (minutes+":"+seconds);
         if (h>=1) {timeleft = (hours+":"+minutes+":"+seconds);}
      }
ObjectsDeleteAll(0,EMPTY);
   draw_hl();
   
string   C= "\n";      
         C=C + "\n ----------  WinGrid  ----------\n";  
         C=C + " GridDiv              "+Div+"\n";  
         C=C + " TimeLeft             "+timeleft+"\n";
         C=C + " ServerTime        "+TimeToStr(Time[0],TIME_MINUTES|TIME_SECONDS)+"\n";
         C=C + " Profit / Equity     "+DoubleToStr(AccountProfit(),2)+" / "+DoubleToStr(AccountEquity(),2)+"\n"+"\n";
         C=C + dowStr+"\n"+"\n";
         
   Comment(C);

   return(0);
  }
//+------------------------------------------------------------------+

void draw_hl(){
barHigh = iHighest(Symbol(),0,MODE_HIGH,WindowFirstVisibleBar(),0);
barLow =  iLowest(Symbol(),0,MODE_LOW,WindowFirstVisibleBar(),0);

if (barHigh>barLow) 
{int barback1 = barHigh;
 int barback2 = barLow;  
 int arcode   = 238;
 double p1 = High[barHigh];
 double p2 = Low[barLow];
}
else 
{barback1 = barLow;
 barback2 = barHigh;
 arcode   = 236;
 p2 = High[barHigh];
 p1 = Low[barLow];

}

v1 = iTime(Symbol(),0,barback1);
v2 = iTime(Symbol(),0,barback2);
high = High[barHigh];        
low =  Low[barLow];        
midV  = NormalizeDouble(0.5*(barHigh+barLow),0);
int midV2 = 0.5*(iBarShift(Symbol(),0,v2)+1);

range = (high - low)/Point;
Grid  = MathCeil(range/(Div*2));
mid   = NormalizeDouble(0.5*(high+low),Digits);
x=mid-MathMod(mid,0.01);
y=MathMod(mid,0.01)/Point;
z=MathCeil(y/10)*10*Point;
z=z+x;

lot = AccountEquity()/range/Div;
lot2= AccountEquity()/range;
 
double   spd = MarketInfo(Symbol(),MODE_SPREAD);
         spd = (spd + 1)*Point;
         
ObjectCreate("mid_",OBJ_RECTANGLE,0,v2,mid+Grid*Point+spd,Time[1],mid-(Grid-1)*Point);
ObjectSet("mid_" ,OBJPROP_COLOR,Mid);

for (int i=1;i<Div+1;i++){
   if (i<Div){
   ObjectCreate("gridH"+i,OBJ_TREND,0,v1,mid+i*Grid*Point+spd,Time[1],mid+i*Grid*Point+spd);
   ObjectCreate("gridL"+i,OBJ_TREND,0,v1,mid-(i*Grid-1)*Point,Time[1],mid-(i*Grid-1)*Point);
   ObjectSet("gridH"+i,OBJPROP_RAY,false);
   ObjectSet("gridL"+i,OBJPROP_RAY,false);
   ObjectSet("gridH"+i,OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("gridL"+i,OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("gridH"+i,OBJPROP_COLOR,Subgrid);
   ObjectSet("gridL"+i,OBJPROP_COLOR,Subgrid);
   }
   
   ObjectCreate("LabelH"+i,OBJ_TEXT,0,Time[midV],mid+i*Grid*Point+spd);
   ObjectCreate("LabelL"+i,OBJ_TEXT,0,Time[midV],mid-(i*Grid-1)*Point);
   ObjectSetText("LabelH"+i,DoubleToStr( (Bid-(mid+i*Grid*Point+spd))/Point,0)+" pips   "+DoubleToStr(mid+i*Grid*Point+spd,Digits),8,"Verdana",Black);
   ObjectSetText("LabelL"+i,DoubleToStr( (Bid-(mid-(i*Grid-1)*Point))/Point,0)+" pips   "+DoubleToStr(mid-(i*Grid-1)*Point,Digits),8,"Verdana",Black); 
}

ObjectCreate("ob",OBJ_RECTANGLE,0,v1,mid+Div*Grid*Point+spd,v2,mid+(Div-1)*Grid*Point+spd);
ObjectSet("ob" ,OBJPROP_COLOR,MistyRose);
ObjectCreate("os",OBJ_RECTANGLE,0,v1,mid-(Div*Grid-1)*Point,v2,mid-((Div-1)*Grid-1)*Point);
ObjectSet("os" ,OBJPROP_COLOR,LightGreen);

ObjectCreate("arrow",OBJ_ARROW,0,Time[barback1-10],mid+Grid*Point);
ObjectSet("arrow" ,OBJPROP_ARROWCODE,arcode);
ObjectSet("arrow" ,OBJPROP_COLOR,Maingrid);
ObjectSet("arrow" ,OBJPROP_WIDTH,4);

double Bid1   = Bid-MathMod(Bid,1/(MathPow(10,Digits-2)) );
double Bid2   = MathMod(Bid,1/(MathPow(10,Digits-2)))*MathPow(10,Digits) ;

string bidtxt = DoubleToStr( Bid1 , Digits-2);
string bidtxt2= DoubleToStr( Bid2 ,0);

if (Bid2<=9)  bidtxt2 = "0"+bidtxt2;
if (Digits<4) bidtxt  = bidtxt+".";

ObjectCreate ("bid",OBJ_TEXT,0,Time[midV+7],mid);
ObjectSetText("bid",bidtxt,20,"Calibri Bold",Black);

ObjectCreate("bid2",OBJ_TEXT,0,Time[midV-15],mid);
ObjectSetText("bid2",bidtxt2,20,"Calibri Bold",Red);

ObjectCreate("note",OBJ_TEXT,0,Time[midV],mid+5*Point);
ObjectSetText("note",DoubleToStr(lot,2)+" - "+DoubleToStr(lot2,2),9,"Calibri",White);//

/*   ObjectCreate("box", OBJ_LABEL, 0, 0, 0, 0, 0);
      ObjectSetText("box", "WinGrid", 10, "Calibri");
      ObjectSet("box", OBJPROP_CORNER, 1);
      ObjectSet("box", OBJPROP_XDISTANCE, 20);
      ObjectSet("box", OBJPROP_YDISTANCE, 5 );      
      ObjectSet("box", OBJPROP_COLOR, Black);
      ObjectSet("box", OBJPROP_BACK, false);
*/
      
ObjectCreate("bigrect",OBJ_RECTANGLE,0,v1,mid-(Div*Grid-1)*Point,v2,mid+Div*Grid*Point+spd);
ObjectSet("bigrect" ,OBJPROP_COLOR,White);
ObjectSet("bigrect" ,OBJPROP_WIDTH,3);
ObjectSet("bigrect" ,OBJPROP_BACK,false);

   ObjectCreate("session",OBJ_TEXT,0,Time[0],mid);
   ObjectSetText("session",timez,9,"Calibri",Green);
   ObjectSet("session",OBJPROP_ANGLE,90);


   ObjectCreate("vMax",OBJ_TREND,0,Time[barback2-15],mid+Div*Grid*Point+spd,Time[barback2-15],mid+Grid*Point+spd);
   ObjectCreate("vMax2",OBJ_TREND,0,Time[barback2-15],mid-(Div*Grid-1)*Point,Time[barback2-15],mid-(Grid-1)*Point);
   ObjectSet("vMax",OBJPROP_RAY,false);
   ObjectSet("vMax2",OBJPROP_RAY,false);
   
   ObjectCreate("vh1",OBJ_TREND,0,Time[barback2-13],mid+Div*Grid*Point+spd,Time[barback2-17],mid+Div*Grid*Point+spd);
   ObjectCreate("vh2",OBJ_TREND,0,Time[barback2-13],mid-(Div*Grid-1)*Point,Time[barback2-17],mid-(Div*Grid-1)*Point);
   ObjectSet("vh1",OBJPROP_RAY,false);
   ObjectSet("vh2",OBJPROP_RAY,false);
   
   ObjectCreate("vMaxTxt",OBJ_TEXT,0,Time[barback2-12],mid);
   ObjectSetText("vMaxTxt",DoubleToStr(range,0),10,"Calibri",Green);
   ObjectSet("vMaxTxt",OBJPROP_ANGLE,90);
   
   ObjectCreate("tri_1",OBJ_TRIANGLE,0,Time[15],mid+Grid*Point+spd,Time[12],mid+Grid*Point+spd+4*Point,Time[8],mid+Grid*Point+spd);
   ObjectCreate("tri_2",OBJ_TRIANGLE,0,Time[15],mid-(Grid-1)*Point,Time[12],mid-(Grid+3)*Point,Time[9],mid-(Grid-1)*Point);
   ObjectCreate("vGridTxt",OBJ_TEXT,0,Time[17],mid);
   ObjectSetText("vGridTxt",DoubleToStr(Grid*2,0),10,"Calibri",Green);
   ObjectSet("vGridTxt",OBJPROP_ANGLE,90);
}