//+------------------------------------------------------------------+
//|                              ICT_NY_00_open_and_NY_0830_open.mq4 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

string id="ny_times";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
  
  
int deinit()
{
   remove_objects();
   Comment("");
   
   return(0);
}

void remove_objects()
{

   string name;
   for(int i=ObjectsTotal()-1;i>=0;i--)
   {
      name=ObjectName(0,i);
      if(StringFind(name,id)>=0)ObjectDelete(0,name);
   }
   return;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   
   datetime ny_midnight,ny_830,london_kill_start,london_kill_end;
   int PST_hour_offset = 10;
   int EST_hour_offset = 7;
   int EST_hour_0830_offset = 14;
   int London_kill_zone_start = 9;
   int London_kill_zone_end = 12;

   datetime today=StrToTime(TimeToStr(Time[0],TIME_DATE));
   datetime tomorrow=StrToTime(TimeToStr(Time[0],TIME_DATE))+24*3600;
   ny_midnight=today+(EST_hour_offset*3600);
   ny_830=today+(EST_hour_0830_offset*3600);
   
   london_kill_start=today+(London_kill_zone_start*3600);
   london_kill_end=today+(London_kill_zone_end*3600);
   
   if(ny_midnight>Time[0])ny_midnight-=24*3600;
   if(ny_830>Time[0])ny_830-=24*3600;
   if(london_kill_start>Time[0])london_kill_start-=24*3600;
   //if(london_kill_end>Time[0])london_kill_end-=24*3600;
   
   
   int ny_open_shift = (int(Time[0])-int(ny_midnight))/(Period()*60);
   int ny_830_shift = (int(Time[0])-int(ny_830))/(Period()*60);
   int london_kill_zone_start_shift = (int(Time[0])-int(london_kill_start))/(Period()*60);
   int london_kill_zone_end_shift = (int(Time[0])-int(london_kill_end))/(Period()*60);
   
   //make_vline("ny midnight ",ny_midnight,Bid,clrAqua,1,STYLE_DASH);
   //make_vline("ny 08:30 ",ny_830,Bid,clrDarkOrange,1,STYLE_DASH);
   //make_vline("london_kill_start ",london_kill_start,Bid,clrRed,1,STYLE_DASH);
   //make_vline("nlondon_kill_end ",london_kill_end,Bid,clrRed,1,STYLE_DASH);
   
   int candle_num = MathMin(3*(PERIOD_H1/Period()),(int(Time[0])-int(london_kill_start))/(Period()*60));
   //Comment(candle_num);
   double london_kill_zone_high = iHigh(Symbol(),0,iHighest(Symbol(),0,MODE_HIGH,candle_num,0));
   double london_kill_zone_low = iLow(Symbol(),0,iLowest(Symbol(),0,MODE_LOW,candle_num,0));
   
   make_box("london kill zone box ",london_kill_start,london_kill_zone_high,london_kill_end,london_kill_zone_low,clrRed,0,false,STYLE_DASH);

   
   make_trend("midnight trend ",ny_midnight,iOpen(Symbol(),0,ny_open_shift),tomorrow,iOpen(Symbol(),0,ny_open_shift),clrAqua,1,STYLE_DASH);
   make_trend("ny 08:30 trend ",ny_830,iOpen(Symbol(),0,ny_830_shift),tomorrow,iOpen(Symbol(),0,ny_830_shift),clrDarkOrange,1,STYLE_DASH);
   


//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


void make_text(string name,string text, int t1,double p1,color c,int width, int style)
{
   name+=id;
   ObjectCreate(0,name,OBJ_TEXT,0,0,0);
   ObjectSet(name,OBJPROP_COLOR,c);
   ObjectSet(name,OBJPROP_WIDTH,width);
   ObjectSet(name,OBJPROP_STYLE,style);
   ObjectSetText(name,text,12,"",c);
   ObjectMove(name,0,t1,p1);
   return;
}


void make_label(string name, string text, int font_size, color label_color, int corner, int xPos, int yPos)
{
   name+=id;
   ObjectCreate(0,name,OBJ_LABEL,0,0,0);
   ObjectSetText(name,text);
   ObjectSet(name,OBJPROP_FONTSIZE,font_size);
   ObjectSet(name,OBJPROP_COLOR,label_color);
   ObjectSet(name,OBJPROP_CORNER,corner);
   ObjectSet(name,OBJPROP_XDISTANCE,xPos);
   ObjectSet(name,OBJPROP_YDISTANCE,yPos);

   return;
}

void make_arrow(string name,int dir, int t1,double p1,color c,int arrowcode,int width)
{
   name+=id;
   ObjectCreate(0,name,OBJ_ARROW,0,0,0);
   ObjectSet(name,OBJPROP_COLOR,c);
   ObjectSet(name,OBJPROP_ARROWCODE,arrowcode);
   //if(arrowcode==SYMBOL_ARROWUP)
   if(dir<0)ObjectSet(name,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
   //if(arrowcode==SYMBOL_ARROWDOWN)
   if(dir>0)ObjectSet(name,OBJPROP_ANCHOR,ANCHOR_TOP);
   ObjectSet(name,OBJPROP_WIDTH,width);
   ObjectMove(name,0,t1,p1);
   return;
}

void make_vline(string name,int t1,double p1,color c,int width, int style)
{
   name+=id;
   ObjectCreate(0,name,OBJ_VLINE,0,0,0);
   ObjectSet(name,OBJPROP_COLOR,c);
   ObjectSet(name,OBJPROP_WIDTH,width);
   ObjectSet(name,OBJPROP_STYLE,style);
   ObjectMove(name,0,t1,p1);
   return;
}

void make_hline(string name,int t1,double p1,color c,int width, int style)
{
   name+=id;
   ObjectCreate(0,name,OBJ_HLINE,0,0,0);
   ObjectSet(name,OBJPROP_COLOR,c);
   ObjectSet(name,OBJPROP_WIDTH,width);
   ObjectSet(name,OBJPROP_STYLE,style);
   ObjectSetText(name,name);
   ObjectMove(name,0,t1,p1);
   return;
}

void make_trend(string name, int t1, double p1, int t2, double p2,color c, int w, int s)
{
   name+=id; 
   ObjectCreate(name,OBJ_TREND,0,t1,p1,t2,p2);
   ObjectMove(name,0,t2,p2);
   ObjectMove(name,1,t1,p1);
   ObjectSet(name,OBJPROP_RAY,false);
   ObjectSet(name,OBJPROP_COLOR,c);
   ObjectSet(name,OBJPROP_WIDTH,w);
   ObjectSet(name,OBJPROP_STYLE,s);
   ObjectSetText(name,name);

   return;
}

void make_trend2(string name, int t1, double p1, int t2, double p2,color c, int w, int s)
{
   //name+=id;
   ObjectCreate(name,OBJ_TREND,0,t1,p1,t2,p2);
   ObjectMove(name,0,t2,p2);
   ObjectMove(name,1,t1,p1);
   ObjectSet(name,OBJPROP_RAY,false);
   ObjectSet(name,OBJPROP_COLOR,c);
   ObjectSet(name,OBJPROP_WIDTH,w);
   ObjectSet(name,OBJPROP_STYLE,s);
   ObjectSetText(name,name);

   return;
}

void make_trend3(string name, int t1, double p1, int t2, double p2,color c, int w, int s,bool ray)
{
   name+=id; 
   ObjectCreate(name,OBJ_TREND,0,t1,p1,t2,p2);
   ObjectMove(name,0,t2,p2);
   ObjectMove(name,1,t1,p1);
   ObjectSet(name,OBJPROP_RAY,ray);
   ObjectSet(name,OBJPROP_COLOR,c);
   ObjectSet(name,OBJPROP_WIDTH,w);
   ObjectSet(name,OBJPROP_STYLE,s);
   ObjectSetText(name,name);

   return;
}

void make_box(string name, int t1, double p1, int t2, double p2,color c, int w, bool back,int style)
{
   name+=id;
   ObjectCreate(name,OBJ_RECTANGLE,0,t1,p1,t2,p2);
   ObjectMove(name,0,t2,p2);
   ObjectMove(name,1,t1,p1);
   ObjectSet(name,OBJPROP_BACK,back);
   ObjectSet(name,OBJPROP_COLOR,c);
   ObjectSet(name,OBJPROP_WIDTH,w);
   ObjectSet(name,OBJPROP_STYLE,style);
   ObjectSetText(name,name);

   return;
}