MQL5 Strategy tester only drawing my objects once yet they are meant to run every new day.

 

Please help debug this code, I have tried for days and failed. The EA is meant to draw these sessions every day but it only works once when I try it in the strategy tester. When I forward test it seems to work.

Where would my error be?

//+------------------------------------------------------------------+
//| Input Variables                                                  |
//+------------------------------------------------------------------+
input group "=== GENERAL SETTINGS ==="
input string MidNightOpenPrice  = "7:00";                      // New York Midnight Open Price.
input string LondonSessionOpen  = "9:00";                      // London Session Open.
input string LondonSessionClose = "12:00";                     // London Session Close.
input string NewYorkSessionOpen = "15:30";                     // New York Session Open.
input string NewYorkSessionClose= "19:00";                     // New York Session Close.

input group "=== SILVER BULLET TIME === "
input string LondonSilverBulletOpen   = "10:00";               // London Silver Bullet Open.
input string LondonSilverBulletClose  = "11:00";               // London Silver Bullet Close.
input string NewYorkSilverBulletOpen  = "17:00";               // New York Silver Bullet Open.
input string NewYorkSilverBulletClose = "18:00";               // New York Silver Bullet Close.

// Convert input string variables into time variables //
datetime midNightOpenPrice       = StringToTime(MidNightOpenPrice);
datetime londonSessionOpen       = StringToTime(LondonSessionOpen);
datetime londonSessionClose      = StringToTime(LondonSessionClose);
datetime newYorkSessionOpen      = StringToTime(NewYorkSessionOpen);
datetime newYorkSessionClose     = StringToTime(NewYorkSessionClose);
datetime londonSilverBulletOpen  = StringToTime(LondonSilverBulletOpen);
datetime londonSilverBulletClose = StringToTime(LondonSilverBulletClose);
datetime newYorkSilverBulletOpen = StringToTime(NewYorkSilverBulletOpen);
datetime newYorkSilverBulletClose= StringToTime(NewYorkSilverBulletClose);

//+------------------------------------------------------------------+
//| London Session Range Structure                                   |
//+------------------------------------------------------------------+
struct LondonSession{
   string SessionName;           // Session Name
   datetime StartTime;           // Session Start Time
   datetime EndTime;             // Session End Time
   double high;                  // Session High
   double low;                   // Session Low
}londonSession;

//+------------------------------------------------------------------+
//| New York Session Range Structure                                 |
//+------------------------------------------------------------------+
struct NewYorkSession{
   string SessionName;           // Session Name
   datetime StartTime;           // Session Start Time
   datetime EndTime;             // Session End Time
   double high;                  // Session High
   double low;                   // Session Low
}newYorkSession;

//+------------------------------------------------------------------+
//| London Session Silver Bullet Structure                           |
//+------------------------------------------------------------------+
struct LondonSessionSilverBullet{
   datetime StartTime;           // Session Start Time
   datetime EndTime;             // Session End Time
   double high;                  // Session High
   double low;                   // Session Low
}LNDSilverBullet;

//+------------------------------------------------------------------+
//| New York Session Silver Bullet Structure                         |
//+------------------------------------------------------------------+
struct NewYorkSessionSilverBullet{
   datetime StartTime;           // Session Start Time
   datetime EndTime;             // Session End Time
   double high;                  // Session High
   double low;                   // Session Low
}NYSilverBullet;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(){
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
   ObjectsDeleteAll(NULL, "London ");
   ObjectsDeleteAll(NULL, "New York ");
   ObjectsDeleteAll(NULL, "fvg ");
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(){
   datetime startOfDay   = iTime(NULL,PERIOD_D1,0);

   // If a new day starts then calculate these ranges //
   if(startOfDay){
      LondonSessionRange();
      LondonSilverBullet();
      NewYorkSessionRange();
      NewYorkSilverBullet();
   } 
}

//+------------------------------------------------------------------+
//| London Session Range                                             |
//+------------------------------------------------------------------+
void LondonSessionRange(){
   
   // Reset London session variables //
   londonSession.SessionName  = "";
   londonSession.StartTime    = 0;
   londonSession.EndTime      = 0;
   londonSession.high         = 0;
   londonSession.low          = 0;
   
   // Get London session variables //
   londonSession.SessionName  = "London Session";
   londonSession.StartTime    = londonSessionOpen;
   londonSession.EndTime      = londonSessionClose;
   
   // Index of the start and end time //
   int start = iBarShift(_Symbol,PERIOD_CURRENT,londonSession.StartTime,false);
   int end   = iBarShift(_Symbol,PERIOD_CURRENT,londonSession.EndTime,false);
   
   // High and Low of the London session range //
   londonSession.high = iHigh(_Symbol,PERIOD_CURRENT,iHighest(_Symbol,PERIOD_CURRENT,MODE_HIGH,start - end + 1, end));
   londonSession.low  = iLow(_Symbol,PERIOD_CURRENT,iLowest(_Symbol,PERIOD_CURRENT,MODE_LOW,start - end + 1, end));
   
   // Visualize Session //
   DrawSessionRange();  
}

//+------------------------------------------------------------------+
//| London Session Silver Bullet                                     |
//+------------------------------------------------------------------+
void LondonSilverBullet(){

   // Reset London session silver bullet variables //
   LNDSilverBullet.StartTime = 0;
   LNDSilverBullet.EndTime   = 0;
   LNDSilverBullet.high      = 0;
   LNDSilverBullet.low       = 0;
   
   // Get london session silver bullet variables //
   LNDSilverBullet.StartTime = londonSilverBulletOpen;
   LNDSilverBullet.EndTime   = londonSilverBulletClose;
   
   // Index of the start and end time //
   int start = iBarShift(_Symbol,PERIOD_CURRENT,LNDSilverBullet.StartTime,false);
   int end   = iBarShift(_Symbol,PERIOD_CURRENT,LNDSilverBullet.EndTime,false);
   
   // High and Low of the London silver bullet //
   LNDSilverBullet.high = iHigh(_Symbol,PERIOD_CURRENT,iHighest(_Symbol,PERIOD_CURRENT,MODE_HIGH,start - end + 1, end));
   LNDSilverBullet.low  = iLow(_Symbol,PERIOD_CURRENT,iLowest(_Symbol,PERIOD_CURRENT,MODE_LOW,start - end + 1, end));
   
   // Visualize Silver Bullet //
   DrawSilverBullet();
}

//+------------------------------------------------------------------+
//| NewYork Session Range                                            |
//+------------------------------------------------------------------+
void NewYorkSessionRange(){

   // Reset London session variables //
   newYorkSession.SessionName  = "";
   newYorkSession.StartTime    = 0;
   newYorkSession.EndTime      = 0;
   newYorkSession.high         = 0;
   newYorkSession.low          = 0;
   
   // Get London session variables //
   newYorkSession.SessionName  = "NewYork Session";
   newYorkSession.StartTime    = newYorkSessionOpen;
   newYorkSession.EndTime      = newYorkSessionClose;
   
   // Index of the start and end time //
   int start = iBarShift(_Symbol,PERIOD_CURRENT,newYorkSession.StartTime,false);
   int end   = iBarShift(_Symbol,PERIOD_CURRENT,newYorkSession.EndTime,false);
   
   // High and Low of the London session range //
   newYorkSession.high = iHigh(_Symbol,PERIOD_CURRENT,iHighest(_Symbol,PERIOD_CURRENT,MODE_HIGH,start - end + 1, end));
   newYorkSession.low  = iLow(_Symbol,PERIOD_CURRENT,iLowest(_Symbol,PERIOD_CURRENT,MODE_LOW,start - end + 1, end));
   
   // Visualize Session //
   DrawSessionRange(); 
}

//+------------------------------------------------------------------+
//| NewYork Session Silver Bullet                                    |
//+------------------------------------------------------------------+
void NewYorkSilverBullet(){

   // Reset London session silver bullet variables //
   NYSilverBullet.StartTime = 0;
   NYSilverBullet.EndTime   = 0;
   NYSilverBullet.high      = 0;
   NYSilverBullet.low       = 0;
   
   // Get london session silver bullet variables //
   NYSilverBullet.StartTime = newYorkSilverBulletOpen;
   NYSilverBullet.EndTime   = newYorkSilverBulletClose;
   
   // Index of the start and end time //
   int start = iBarShift(_Symbol,PERIOD_CURRENT,NYSilverBullet.StartTime,false);
   int end   = iBarShift(_Symbol,PERIOD_CURRENT,NYSilverBullet.EndTime,false);
   
   // High and Low of the London silver bullet //
   NYSilverBullet.high = iHigh(_Symbol,PERIOD_CURRENT,iHighest(_Symbol,PERIOD_CURRENT,MODE_HIGH,start - end + 1, end));
   NYSilverBullet.low  = iLow(_Symbol,PERIOD_CURRENT,iLowest(_Symbol,PERIOD_CURRENT,MODE_LOW,start - end + 1, end));
   
   // Visualize Silver Bullet //
   DrawSilverBullet();
}

//+------------------------------------------------------------------+
//| Visualise Session Ranges                                         |
//+------------------------------------------------------------------+
void DrawSessionRange(){

   // Draw London session start time
   if(londonSession.StartTime > 0){
      ObjectCreate(NULL,"London Session Start",OBJ_VLINE,0,londonSession.StartTime,0);
      ObjectSetString(NULL,"London Session Start",OBJPROP_TOOLTIP,"London Session Start \n"+TimeToString(londonSession.StartTime,TIME_DATE|TIME_MINUTES));
      ObjectSetInteger(NULL,"London Session Start",OBJPROP_COLOR,clrBlue);
      ObjectSetInteger(NULL,"London Session Start",OBJPROP_BACK,true);
   }
   
   // Draw London session end time
   if(londonSession.StartTime > 0){
      ObjectCreate(NULL,"London Session End",OBJ_VLINE,0,londonSession.EndTime,0);
      ObjectSetString(NULL,"London Session End",OBJPROP_TOOLTIP,"London Session End \n"+TimeToString(londonSession.EndTime,TIME_DATE|TIME_MINUTES));
      ObjectSetInteger(NULL,"London Session End",OBJPROP_COLOR,clrBlue);
      ObjectSetInteger(NULL,"London Session End",OBJPROP_BACK,true);
   }
   
   // Draw London Session High
   if(londonSession.StartTime > 0){
      ObjectCreate(NULL,"London Session High",OBJ_TREND,0,londonSession.StartTime,londonSession.high,londonSession.EndTime,londonSession.high);
      ObjectSetString(NULL,"London Session High",OBJPROP_TOOLTIP,"London Session High "+DoubleToString(londonSession.high,_Digits));
      ObjectSetInteger(NULL,"London Session High",OBJPROP_COLOR,clrBlue);
      ObjectSetInteger(NULL,"London Session High",OBJPROP_BACK,true);
      
      ObjectCreate(NULL,"London Session High ",OBJ_TREND,0,londonSession.EndTime,londonSession.high,londonSession.EndTime,londonSession.high);
      ObjectSetString(NULL,"London Session High ",OBJPROP_TOOLTIP,"London Session High "+DoubleToString(londonSession.high,_Digits));
      ObjectSetInteger(NULL,"London Session High ",OBJPROP_COLOR,clrBlue);
      ObjectSetInteger(NULL,"London Sesssion High ",OBJPROP_STYLE,STYLE_DOT);
   }
   
   // Draw London Session Low
   if(londonSession.StartTime > 0){
      ObjectCreate(NULL,"London Session Low",OBJ_TREND,0,londonSession.StartTime,londonSession.low,londonSession.EndTime,londonSession.low);
      ObjectSetString(NULL,"London Session Low",OBJPROP_TOOLTIP,"London Session Low "+DoubleToString(londonSession.low,_Digits));
      ObjectSetInteger(NULL,"London Session Low",OBJPROP_COLOR,clrBlue);
      ObjectSetInteger(NULL,"London Session Low",OBJPROP_BACK,true);
      
      ObjectCreate(NULL,"London Session Low ",OBJ_TREND,0,londonSession.EndTime,londonSession.low,londonSession.EndTime,londonSession.low);
      ObjectSetString(NULL,"London Session Low ",OBJPROP_TOOLTIP,"London Session Low "+DoubleToString(londonSession.low,_Digits));
      ObjectSetInteger(NULL,"London Session Low ",OBJPROP_COLOR,clrBlue);
      ObjectSetInteger(NULL,"London Sesssion Low ",OBJPROP_STYLE,STYLE_DOT);
   }
   
   // Draw New York session start time
   if(newYorkSession.StartTime > 0){
      ObjectCreate(NULL,"New York Session Start",OBJ_VLINE,0,newYorkSession.StartTime,0);
      ObjectSetString(NULL,"New York Session Start",OBJPROP_TOOLTIP,"New York Session Start \n"+TimeToString(newYorkSession.StartTime,TIME_DATE|TIME_MINUTES));
      ObjectSetInteger(NULL,"New York Session Start",OBJPROP_COLOR,clrRed);
      ObjectSetInteger(NULL,"New York Session Start",OBJPROP_BACK,true);
   }
   
   // Draw New York session end time
   if(newYorkSession.StartTime > 0){
      ObjectCreate(NULL,"New York Session End",OBJ_VLINE,0,newYorkSession.EndTime,0);
      ObjectSetString(NULL,"New York Session End",OBJPROP_TOOLTIP,"New York Session End \n"+TimeToString(newYorkSession.EndTime,TIME_DATE|TIME_MINUTES));
      ObjectSetInteger(NULL,"New York Session End",OBJPROP_COLOR,clrRed);
      ObjectSetInteger(NULL,"New York Session End",OBJPROP_BACK,true);
   }
   
   // Draw New York Session High
   if(newYorkSession.StartTime > 0){
      ObjectCreate(NULL,"New York Session High",OBJ_TREND,0,newYorkSession.StartTime,newYorkSession.high,newYorkSession.EndTime,newYorkSession.high);
      ObjectSetString(NULL,"New York Session High",OBJPROP_TOOLTIP,"New York Session High "+DoubleToString(newYorkSession.high,_Digits));
      ObjectSetInteger(NULL,"New York Session High",OBJPROP_COLOR,clrRed);
      ObjectSetInteger(NULL,"New York Session High",OBJPROP_BACK,true);
   }
   
   // Draw New York Session Low
   if(newYorkSession.StartTime > 0){
      ObjectCreate(NULL,"New York Session Low",OBJ_TREND,0,newYorkSession.StartTime,newYorkSession.low,newYorkSession.EndTime,newYorkSession.low);
      ObjectSetString(NULL,"New York Session Low",OBJPROP_TOOLTIP,"New York Session Low "+DoubleToString(newYorkSession.low,_Digits));
      ObjectSetInteger(NULL,"New York Session Low",OBJPROP_COLOR,clrRed);
      ObjectSetInteger(NULL,"New York Session Low",OBJPROP_BACK,true);
   }
}

//+------------------------------------------------------------------+
//| Visualise Silver Bullet Windows                                  |
//+------------------------------------------------------------------+
void DrawSilverBullet(){

   // Visualize London silver bullet //
   if(LNDSilverBullet.StartTime > 0){
      ObjectCreate(0,"London Silver Bullet",OBJ_RECTANGLE,0,LNDSilverBullet.StartTime,LNDSilverBullet.high,LNDSilverBullet.EndTime,LNDSilverBullet.low);
      ObjectSetInteger(0,"London Silver Bullet",OBJPROP_COLOR,clrBlue);
      ObjectSetInteger(0,"London Silver Bullet",OBJPROP_STYLE,STYLE_DASHDOTDOT);
   }
   
   // Visualize NewYork silver bullet //
   if(NYSilverBullet.StartTime > 0){
      ObjectCreate(0,"New York Silver Bullet",OBJ_RECTANGLE,0,NYSilverBullet.StartTime,NYSilverBullet.high,NYSilverBullet.EndTime,NYSilverBullet.low);
      ObjectSetInteger(0,"New York Silver Bullet",OBJPROP_COLOR,clrRed);
      ObjectSetInteger(0,"New York Silver Bullet",OBJPROP_STYLE,STYLE_DASHDOTDOT);
   }
}
Reason: