timezonerectangle

Author: Copyright 2015, Daisuke
Price Data Components
Series array that contains open time of each barSeries array that contains close prices for each barSeries array that contains open prices of each barSeries array that contains the highest prices of each barSeries array that contains the lowest prices of each bar
0 Views
0 Downloads
0 Favorites
timezonerectangle
ÿþ//+------------------------------------------------------------------+

//| Time Zone Rectangles                                             |

//+------------------------------------------------------------------+

#property copyright "Copyright 2015,  Daisuke"

#property link      "http://mt4program.blogspot.jp/"

#property version   "1.10"

#property strict

#property indicator_chart_window



// ONE HOUR

#define ONEHOUR (60*60)

// OBJECT NAME

#define OBJECT_NAME_RANGE "OBJ_TIMERANGE"

// GMT offset of america

#define GMT_TO_AMERICA (-18000)



input int GMTOffset=2;// Gmt Offset 

input bool IsSummerTime=true;// Chart summer time enabled

                             // Black on White Colors

input color JapanColor=C'0xaa, 0xaa, 0xff';// Japan color

input color EuColor=C'0xff,0xff,0xaa';// EU color

input color AmericaColor=C'0xff, 0xaa, 0xaa';// America color

/*

// Green on Black Colors

input color JapanColor=C'0x11, 0x11, 0xbb';// Japan color

input color EuColor=C'0x40,0x40,0x0';// EU color

input color AmericaColor=C'0xaa, 0x0, 0x0';// America color

*/

//+------------------------------------------------------------------+

//| Initialize                                                       |

//+------------------------------------------------------------------+

int OnInit()

  {

   string short_name="TR";

   IndicatorShortName(short_name);



   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| DeInitialize                                                     |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

   long chartId=ChartID();



   int total=ObjectsTotal(chartId);

   for(int i=total-1; i>=0; i--)

     {

      string name=ObjectName(chartId,i);



      if(StringFind(name,OBJECT_NAME_RANGE)==0)

        {

         ObjectDelete(chartId,name);

        }

     }

  }

//+------------------------------------------------------------------+

//| OnCalculate                                                      |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

  {

   if( Period() > PERIOD_H1 ) return rates_total;



   int i=0;

   while(!IsStopped() && i<(rates_total-prev_calculated))

     {

      bool includeTime=false;



      int offset=GMTOffset*ONEHOUR;

      if(IsSummerTime && IsAmericaSummerTime(time[i]))

        {

         offset+=ONEHOUR;

        }

      datetime gmt=time[i]-offset;



      datetime japan=gmt+9*ONEHOUR;



      MqlDateTime current;

      TimeToStruct(japan,current);



      MqlDateTime startStruct;

      startStruct.year= current.year;

      startStruct.mon = current.mon;

      startStruct.day = current.day;

      startStruct.hour= 9;

      startStruct.min = 0;

      startStruct.sec = 0;

      datetime start=StructToTime(startStruct);



      MqlDateTime endStruct;

      endStruct.year= current.year;

      endStruct.mon = current.mon;

      endStruct.day = current.day;

      endStruct.hour= 15;

      endStruct.min = 0;

      endStruct.sec = 0;

      datetime end=StructToTime(endStruct);



      if(start<=japan && japan<end)

        {

         datetime chartStart=start+offset-9*ONEHOUR;

         datetime chartEnd=end+offset-9*ONEHOUR;



         FourValue result = GetFourValue(Symbol(),PERIOD_M30,chartStart,chartEnd);

         if(result.close != 0 && result.open != 0 )

           {

            string name=GetObjectName("JP",japan);

            CreateRectangleObject(name,chartStart,chartEnd,result.high,result.low,JapanColor);

           }

         while(i<rates_total && time[i]>=chartStart) i++;

         includeTime=true;

        }



      int summerTimeOffset=0;

      if(IsEnglandSummerTime(gmt))

        {

         summerTimeOffset=ONEHOUR;

        }

      datetime eu=gmt+summerTimeOffset;



      TimeToStruct(eu,current);



      startStruct.year= current.year;

      startStruct.mon = current.mon;

      startStruct.day = current.day;

      startStruct.hour= 7;

      startStruct.min = 0;

      startStruct.sec = 0;

      start=StructToTime(startStruct);



      endStruct.year= current.year;

      endStruct.mon = current.mon;

      endStruct.day = current.day;

      endStruct.hour= 16;

      endStruct.min = 30;

      endStruct.sec = 0;

      end=StructToTime(endStruct);



      if(start<=eu && eu<end)

        {

         datetime chartStart=start+offset-summerTimeOffset;

         datetime chartEnd=end+offset-summerTimeOffset;



         FourValue result = GetFourValue(Symbol(),PERIOD_M30,chartStart,chartEnd);

         if(result.close != 0 && result.open != 0 )

           {

            string name=GetObjectName("EU",eu);

            CreateRectangleObject(name,chartStart,chartEnd,result.high,result.low,EuColor);

           }

         while(i<rates_total && time[i]>=chartStart) i++;

         includeTime=true;

        }



      summerTimeOffset=0;

      if(IsAmericaSummerTime(gmt))

        {

         summerTimeOffset=ONEHOUR;

        }

      datetime america=gmt+summerTimeOffset-5*ONEHOUR;



      TimeToStruct(america,current);



      startStruct.year= current.year;

      startStruct.mon = current.mon;

      startStruct.day = current.day;

      startStruct.hour= 9;

      startStruct.min = 0;

      startStruct.sec = 0;

      start=StructToTime(startStruct);



      endStruct.year= current.year;

      endStruct.mon = current.mon;

      endStruct.day = current.day;

      endStruct.hour= 16;

      endStruct.min = 00;

      endStruct.sec = 0;

      end=StructToTime(endStruct);



      if(start<=america && america<end)

        {

         datetime chartStart=start+offset+5*ONEHOUR-summerTimeOffset;

         datetime chartEnd=end+offset+5*ONEHOUR-summerTimeOffset;



         FourValue result = GetFourValue(Symbol(),PERIOD_M30,chartStart,chartEnd);

         if(result.close != 0 && result.open != 0 )

           {

            string name=GetObjectName("NY",eu);

            CreateRectangleObject(name,chartStart,chartEnd,result.high,result.low,AmericaColor);

           }

         while(i<rates_total && time[i]>=chartStart) i++;

         includeTime=true;

        }



      if(!includeTime) i++;

     }



   return(rates_total - 1);

  }

//+------------------------------------------------------------------+

//| Create Object Name                                               |

//+------------------------------------------------------------------+

string GetObjectName(string prefix,datetime localTime)

  {

   MqlDateTime current;

   TimeToStruct(localTime,current);



   MqlDateTime start;

   start.year= current.year;

   start.mon = current.mon;

   start.day = current.day;

   start.hour= 0;

   start.min = 0;

   start.sec = 0;



   return OBJECT_NAME_RANGE + prefix + TimeToString( StructToTime( start ) );

  }

//+------------------------------------------------------------------+

//| Draw Rectangle                                                   |

//+------------------------------------------------------------------+

bool CreateRectangleObject(string name,

                           datetime startTime,

                           datetime endTime,

                           double top,

                           double bottom,

                           color backColor)

  {

   long chartId=ChartID();



   int index=ObjectFind(chartId,name);

   if(index<0)

     {

      if(ObjectCreate(chartId,name,OBJ_RECTANGLE,0,startTime,top,endTime,bottom)==false)

        {

         return false;

        }

     }

   else

     {

      ObjectSetInteger(chartId,name,OBJPROP_TIME1,startTime);

      ObjectSetInteger(chartId,name,OBJPROP_TIME2,endTime);

      ObjectSetDouble(chartId,name,OBJPROP_PRICE1,top);

      ObjectSetDouble(chartId,name,OBJPROP_PRICE2,bottom);

     }

   ObjectSetInteger(chartId,name,OBJPROP_COLOR,backColor);

   return true;

  }

//+------------------------------------------------------------------+

//| America Summer Time                                              |

//+------------------------------------------------------------------+

bool IsAmericaSummerTime(datetime gmt)

  {

   datetime americaTime=gmt+GMT_TO_AMERICA;



   MqlDateTime dt;

   TimeToStruct(americaTime,dt);



   datetime startSummerTime;

   datetime endSummerTime;

   MqlDateTime work;

   int week;

   if(dt.year<2007)

     {

      work.year= dt.year;

      work.mon = 4;

      work.day = 1;

      work.hour= 2;

      work.min = 0;

      work.sec = 0;

      week=TimeDayOfWeek(StructToTime(work));



      if(week!=SUNDAY)

         work.day=work.day+7-week;

      startSummerTime=StructToTime(work);



      work.mon = 10;

      work.day = EndOfMonth(work.year, work.mon);

      work.hour= 2;

      work.min =  0;

      work.sec = 0;

      week=TimeDayOfWeek(StructToTime(work));

      work.day=work.day-week;



      endSummerTime=StructToTime(work);

     }

   else

     {

      work.year= dt.year;

      work.mon = 3;

      work.day = 8;

      work.hour= 2;

      work.min = 0;

      work.sec = 0;



      week=TimeDayOfWeek(StructToTime(work));

      if(week!=SUNDAY)

         work.day=work.day+7-week;

      startSummerTime=StructToTime(work);



      work.mon = 11;

      work.day = 1;

      work.hour= 2;

      work.min = 0;

      work.sec = 0;

      week=TimeDayOfWeek(StructToTime(work));

      if(week!=SUNDAY)

         work.day=work.day+7-week;

      endSummerTime=StructToTime(work);

     }



   return startSummerTime <= americaTime && americaTime < endSummerTime;

  }

//+------------------------------------------------------------------+

//| Eu Summer Time                                                   |

//+------------------------------------------------------------------+

bool IsEnglandSummerTime(datetime gmt)

  {

   datetime londonTime=gmt;



   MqlDateTime dt;

   TimeToStruct(londonTime,dt);



   datetime startSummerTime;

   datetime endSummerTime;

   MqlDateTime work;

   int week;



   work.year= dt.year;

   work.mon = 3;

   work.day = EndOfMonth(work.year, work.mon);;

   work.hour= 1;

   work.min = 0;

   work.sec = 0;

   week=TimeDayOfWeek(StructToTime(work));

   work.day=work.day-week;



   startSummerTime=StructToTime(work);



   work.mon = 10;

   work.day = EndOfMonth(work.year, work.mon);

   work.hour= 1;

   work.min = 0;

   work.sec = 0;

   week=TimeDayOfWeek(StructToTime(work));

   work.day=work.day-week;



   endSummerTime=StructToTime(work);



   return startSummerTime <= londonTime && londonTime < endSummerTime;

  }

//+------------------------------------------------------------------+

//| End Of Month                                                     |

//+------------------------------------------------------------------+

int EndOfMonth(int year,

               int month)

  {

   MqlDateTime work;

   work.year= year;

   work.mon = month + 1;

   work.day = 1;

   work.hour= 0;

   work.min = 0;

   work.sec = 0;



   if(work.mon>=13)

     {

      work.mon=1;

      work.year=work.year+1;

     }

   return TimeDay( StructToTime(work) - 1 );

  }

//+------------------------------------------------------------------+

//| Four Values                                                      |

//+------------------------------------------------------------------+

struct FourValue

  {

   double            open;

   double            close;

   double            high;

   double            low;

  };

//+------------------------------------------------------------------+

//| Get Time Zone Four Values                                        |

//+------------------------------------------------------------------+

FourValue GetFourValue(string symbol,

                       ENUM_TIMEFRAMES timeframe,

                       datetime startTime,

                       datetime endTime)

  {

   FourValue result;

   result.open=0;

   result.close= 0;

   result.high = 0;

   result.low=0;



   datetime lastTime=iTime(symbol,timeframe,0);

   int i=0;

   if(lastTime>endTime)

     {

      i=iBarShift(symbol,timeframe,endTime-PeriodSeconds(timeframe),true);

      if(i<0)

        {

         return result;

        }

     }



   i--;

   if(i<0) i=0;



   double close= 0;

   double open = 0;

   double low=iClose(symbol,timeframe,0)*1000;

   double high=0;

   while(!IsStopped())

     {

      datetime current=iTime(symbol,timeframe,i);

      if(current<=0) break;



      if(startTime<=current && current<endTime)

        {

         if(close==0) close=iClose(symbol,timeframe,i);

         open=iOpen(symbol,timeframe,i);

         double currentHigh= iHigh(symbol,timeframe,i);

         double currentLow = iLow(symbol,timeframe,i);



         if(low>currentLow) low=currentLow;

         if(high<currentHigh) high=currentHigh;

        }

      if(current<startTime) break;

      i++;

     }



   result.open=open;

   result.close= close;

   result.high = high;

   result.low=low;



   return result;

  }

//+------------------------------------------------------------------+

Comments