//
// "00-Scr-RateUpdateWatcher_v100.mq4" -- warning when rate update delay
//
//    Ver. 1.00  2008/11/24(Mon)  initial version
//
//
#property  copyright  "00 - 00mql4@gmail.com"
#property  link       "http://www.mql4.com/"

//---- indicator settings
#property  show_inputs

//---- defines

//---- indicator parameters
extern int    tWatchDogTimeInSec  = 30;
extern bool   bAlertDialog        = false;
extern bool   bAlertBack          = true;
extern color  colLabelElapsed     = Yellow;
extern color  colRectAlert        = Red;
extern string sElapsed            = "最終更新から";
extern string sMin                = "(分)";
extern string sSec                = "(秒)";
extern int    cornerLabelElapsed  = 1;
extern int    xLabelElapsed       = 4;
extern int    yLabelElapsed       = 4;
extern int    fontSize            = 12;
extern string fontName            = "MS UI Gothic";

//---- vars
string sScriptName = "00-Scr-ComWarn_v100";
string sLabelElapsed;
string sRectAlert;
int    tCheckPeriodInSec = 1;

//----------------------------------------------------------------------
string TimeFrameToStr(int timeFrame)
{
    switch (timeFrame) {
    case 1:     return("M1");
    case 5:     return("M5");
    case 15:    return("M15");
    case 30:    return("M30");
    case 60:    return("H1");
    case 240:   return("H4");
    case 1440:  return("D1");
    case 10080: return("W1");
    case 43200: return("MN");
    }
    
    return("??");
}

//----------------------------------------------------------------------
void init()
{
    sLabelElapsed = sScriptName + " label Elapsed";
    sRectAlert   = sScriptName + " rect Alert";
    
    tWatchDogTimeInSec = MathMax(tWatchDogTimeInSec, 1);
    if (tCheckPeriodInSec < 1) {
	tCheckPeriodInSec = MathMax(tWatchDogTimeInSec / 5, 1);
    }
    
    Print("Start watchdog timer, tWatchDogTimeInSec= ", tWatchDogTimeInSec,
	  ", tCheckPeriodInSec= ", tCheckPeriodInSec);
}

//----------------------------------------------------------------------
void deinit()
{
    Print("terminated");
    
    ObjectDelete(sLabelElapsed);
    ObjectDelete(sRectAlert);
}

//----------------------------------------------------------------------
string SecToStr(int sec)
{
    string t = sElapsed + " ";
    int m = sec / 60;
    int s = sec % 60;
    
    if (m > 0) {
	t = StringConcatenate(m, sMin, " ");
    }
    
    return(StringConcatenate(t, s, sSec));
}

//----------------------------------------------------------------------
void start()
{
    datetime tLast = LocalTime();
    int volLast = Volume[0];
    
    while (!IsStopped()) {
	int elapsed = LocalTime() - tLast;
	
	ObjectCreate(sLabelElapsed, OBJ_LABEL, 0, 0, 0);
	ObjectSetText(sLabelElapsed, SecToStr(elapsed), fontSize, fontName, colLabelElapsed);
	ObjectSet(sLabelElapsed, OBJPROP_CORNER, cornerLabelElapsed);
	ObjectSet(sLabelElapsed, OBJPROP_XDISTANCE, xLabelElapsed);
	ObjectSet(sLabelElapsed, OBJPROP_YDISTANCE, yLabelElapsed);
	
	bool bForce = false;
	if (elapsed >= tWatchDogTimeInSec) {
	    string s =
		StringConcatenate(Symbol(), "(", TimeFrameToStr(Period()), "), ",
				  "No tick update in last ", tWatchDogTimeInSec, "(sec)");
	    if (bAlertBack) {
		ObjectCreate(sRectAlert, OBJ_RECTANGLE, 0, 0, 0);
		ObjectSet(sRectAlert, OBJPROP_STYLE, STYLE_SOLID);
		ObjectMove(sRectAlert, 0, Time[WindowFirstVisibleBar()], WindowPriceMin());
		ObjectMove(sRectAlert, 1, Time[0], WindowPriceMax());
		ObjectSet(sRectAlert, OBJPROP_COLOR, colRectAlert);
	    }
	    if (bAlertDialog) {
		Alert(s);
	    }
	    bForce = true;
	}
	if (bForce || Volume[0] != volLast) {
	    volLast = Volume[0];
	    tLast = LocalTime();
	    if (!bForce) {
		ObjectMove(sRectAlert, 0, Time[0], 0);
		ObjectMove(sRectAlert, 1, Time[0], 0);
	    }
	}
	
	WindowRedraw();
	
	Sleep(tCheckPeriodInSec * 1000 * 0.9);
	RefreshRates();
    }
}
