iclock_mod1

Download script
Author: mladen
iclock_mod1

Overview

This script is a specialized visual tool for traders that functions as a real-time countdown clock on your trading chart. Its primary purpose is to show you exactly how much time remains before the current candle closes and a new one begins. Unlike many indicators that rely solely on price movements (ticks) to update, this script uses an internal timer, ensuring it remains accurate even during periods of low market activity.

Core Functionalities

1. Real-Time Countdown Display The tool calculates the remaining time for the current timeframe (e.g., 1 minute, 5 minutes, 1 hour, etc.) and displays it directly on your chart as a text label. It automatically detects which timeframe you are viewing and adjusts the calculation accordingly.

2. Dynamic Visual Alerts The script includes a visual status indicator. The color of the clock changes based on your selected "Alert Mode":

  • Off: Displays in one color (Green).
  • Pop-Up Alert: Displays in another (Magenta).
  • Sound Only: Displays in a third color (Blue). This allows you to see at a glance which notification settings are currently active.

3. Automated Notifications You can configure the script to notify you the moment a new candle appears. There are two main ways to receive these alerts:

  • Pop-up Alerts: A visual window will appear on your screen announcing that a new candle has started for the specific currency pair and timeframe you are watching.
  • Audio Alerts: A sound file will play automatically when the time expires and a new candle opens.

4. Intelligent Time Synchronization One of the most robust features of this script is its ability to handle different time zones automatically. It adjusts for:

  • The Broker's GMT offset.
  • Daylight Saving Time (DST) changes.
  • Local computer time. This ensures that the countdown you see on your screen matches reality, regardless of where in the world you are located or how your broker sets its clock.

5. Smart Positioning To ensure the text is always readable, the script includes logic to position the clock correctly on your chart. It attempts to place the label in a way that doesn't obstruct price action, adjusting its vertical and horizontal placement based on your current chart settings.

Key Features for Traders

  • Independence: Works consistently even when the market is slow because it uses an internal timer rather than waiting for new price data.
  • Customizable Appearance: You can modify the font size, whether the text is bold, and the specific colors used for various alert states to suit your personal chart layout.
  • No Log Clutter: The script is designed to run efficiently without creating unnecessary log entries, keeping your trading platform clean and performant.
Miscellaneous
It issuies visual alerts to the screenIt plays sound alerts
5 Views
0 Downloads
0 Favorites
iclock_mod1
//+------------------------------------------------------------------------+
//|                         Copyright 2015, MetaQuotes Software Corp.      |
//|                                             https://www.mql5.com       |
//| Indicator: iClock_Mod1                                                |                                                                  |
//| Author: mladen - https://www.forex-tsd.com                             |
//| Modifier: File45 - https://www.mql5.com/en/users/file45/publications   |
//| * 2015/4/09: Convert from mql5 to mql4                                 |
//| * 2015/4/09: Add alerts and label colored alert states.                |
//+------------------------------------------------------------------------+
#property copyright "mladen"
#property link      "www.forex-tsd.com"
#property version   "1.00"
#property description "Continuous-no-log candle timer with new candle alert options." 
#property description "Not dependent on incoming ticks."
#property description "Pop up and Sound only alert options."
#property description "Timer label colored according to Alert Mode: Off, On, Sound only."
#property description "Automatic Broker GMT and Daylight Saving Time adjustment."
//---
#property indicator_chart_window
//#property indicator_buffers 1
//#property indicator_plots   1

//#define clockName "CandleTimer"
//#property strict
enum AlertMode_z
  {
   NoAlert_z=0,// Off
   PopUpAlert_z = 1,// On
   SoundAlert_z = 2 // Sound only 
  };
input AlertMode_z AlertMode=0;                      // Select Alert Mode 
//input color ValuesPositiveColor = MediumSeaGreen; // Color for positive timer values
input color AlertOff            = LimeGreen;
input color AlertOn             = Magenta;
input color SoundOnly           = DodgerBlue;
input color NoBarColor=Red;                        // Color for negative timer values
input int   FontSize= 13;                          // Font Size 
input bool  FontBold            = true;            // Font Bold
input int   FontShift           = 8;               // Font Shift
//int  atrHandle;
datetime LastAlertTime;
string TMz;
string theFont;
string clockName="CandleTimer";
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int  OnInit()
  {
   switch(FontBold)
     {
      case 0: theFont = "Arial"; break;
      case 1: theFont = "Arial Bold"; break;
     }
   switch(Period())
     {
      case 1:     TMz = "M1";  break;
      case 2:     TMz = "M2";  break;
      case 3:     TMz = "M3";  break;
      case 4:     TMz = "M4";  break;
      case 5:     TMz = "M5";  break;
      case 6:     TMz = "M6";  break;
      case 7:     TMz = "M7";  break;
      case 8:     TMz = "M8";  break;
      case 9:     TMz = "M9";  break;
      case 10:    TMz = "M10"; break;
      case 11:    TMz = "M11"; break;
      case 12:    TMz = "M12"; break;
      case 13:    TMz = "M13"; break;
      case 14:    TMz = "M14"; break;
      case 15:    TMz = "M15"; break;
      case 20:    TMz = "M20"; break;
      case 25:    TMz = "M25"; break;
      case 30:    TMz = "M30"; break;
      case 40:    TMz = "M40"; break;
      case 45:    TMz = "M45"; break;
      case 50:    TMz = "M50"; break;
      case 60:    TMz = "H1";  break;
      case 120:   TMz = "H2";  break;
      case 180:   TMz = "H3";  break;
      case 240:   TMz = "H4";  break;
      case 300:   TMz = "H5";  break;
      case 360:   TMz = "H6";  break;
      case 420:   TMz = "H7";  break;
      case 480:   TMz = "H8";  break;
      case 540:   TMz = "H9";  break;
      case 600:   TMz = "H10"; break;
      case 660:   TMz = "H11"; break;
      case 720:   TMz = "H12"; break;
      case 1440:  TMz = "D1";  break;
      case 10080: TMz = "W1";  break;
      case 43200: TMz = "M1";  break;
     }
   LastAlertTime=TimeCurrent();
// atrHandle = (iATR(NULL,0,30,0)); 
   EventSetTimer(1);
//---
   return(0);
  }
void OnDeinit(const int reason) { EventKillTimer(); ObjectDelete(clockName);}
void OnTimer( )                 { refreshClock();  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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((AlertMode==1) && (LastAlertTime<Time[0]))
     {
      Alert("New Bar  -  ",Symbol(),"  -  "+TMz+"  -  "+AccountCompany());
      LastAlertTime=Time[0];
     }
   else if((AlertMode==2) && (LastAlertTime<Time[0]))
     {
      PlaySound("Alert.wav");
      LastAlertTime=Time[0];
     }
   refreshClock();
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void refreshClock()
  {
   static bool inRefresh=false;
   if(inRefresh) return;
   inRefresh=true;
   ShowClock(); ChartRedraw();
   inRefresh=false;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ShowClock()
  {
   int periodMinutes = periodToMinutes(Period());
   int shift         = periodMinutes*FontShift*60;
   int currentTime   = (int)TimeCurrent();
   int localTime     = (int)TimeLocal();
   int barTime       = (int)iTime();
   int diff          = (int)MathMax(round((currentTime-localTime)/3600.0)*3600,-24*3600);
//---
   color  theColor;
   string time=getTime(barTime+periodMinutes*60-localTime-diff,theColor);
   time=(TerminalInfoInteger(TERMINAL_CONNECTED)) ? time : time+" x";
//---
   if(ObjectFind(0,clockName)<0)
      ObjectCreate(0,clockName,OBJ_TEXT,0,barTime+shift,0);
   ObjectSetString(0,clockName,OBJPROP_TEXT,time);
   ObjectSetString(0,clockName,OBJPROP_FONT,theFont);
   ObjectSetInteger(0,clockName,OBJPROP_FONTSIZE,FontSize);
   ObjectSetInteger(0,clockName,OBJPROP_COLOR,theColor);
   if(ChartGetInteger(0,CHART_SHIFT,0)==0 && (shift>=0))
      ObjectSetInteger(0,clockName,OBJPROP_TIME,barTime-shift*3);
   else  ObjectSetInteger(0,clockName,OBJPROP_TIME,barTime+shift);
//---
   double price[]; if(CopyClose(Symbol(),0,0,1,price)<=0) return;
   double atr[];
//if (CopyBuffer(atrHandle,0,0,1,atr)<=0) return;
   price[0]+=3.0*atr[0]/4.0;
//---
   bool visible=((ChartGetInteger(0,CHART_VISIBLE_BARS,0)-ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0))>0);
   if(visible && price[0]>=ChartGetDouble(0,CHART_PRICE_MAX,0))
      ObjectSetDouble(0,clockName,OBJPROP_PRICE,price[0]-1.5*atr[0]);
   else  ObjectSetDouble(0,clockName,OBJPROP_PRICE,price[0]);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string getTime(int times,color &theColor)
  {
   string stime="";
   int    seconds;
   int    minutes;
   int    hours;
// if (times < 0) {theColor = ValuesNegativeColor; times = (int)fabs(times);}
// else  theColor = ValuesPositiveColor;
   if(times<0)
     {
      theColor=NoBarColor; times=(int)fabs(times);
     }
   else if(times>0)
     {
      switch(AlertMode)
        {
         case 0: theColor = AlertOff; break;
         case 1: theColor = AlertOn; break;
         case 2: theColor = SoundOnly;
        }
     }
   seconds = (times%60);
   hours   = (times-times%3600)/3600;
   minutes = (times-seconds)/60-hours*60;
//---
   if(hours>0)
      if(minutes<10)
         stime = stime+(string)hours+":0";
   else  stime = stime+(string)hours+":";
   stime=stime+(string)minutes;
   if(seconds<10)
      stime=stime+":0"+(string)seconds;
   else  stime=stime+":"+(string)seconds;
   return(stime);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime iTime(ENUM_TIMEFRAMES forPeriod=PERIOD_CURRENT)
  {
   datetime times[]; if(CopyTime(Symbol(),forPeriod,0,1,times)<=0) return(TimeLocal());
   return(times[0]);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int periodToMinutes(int period)
  {
   int i;
   static int _per[]={1,2,3,4,5,6,10,12,15,20,30,60,120,180,240,360,480,720,1440,10080,43200,0x4001,0x4002,0x4003,0x4004,0x4006,0x4008,0x400c,0x4018,0x8001,0xc001};
   static int _min[]={1,2,3,4,5,6,10,12,15,20,30,60,120,180,240,360,480,720,1440,10080,43200};
//---
   if(period==PERIOD_CURRENT)
      period=Period();
   for(i=0;i<20;i++) if(period==_per[i]) break;
   return(_min[i]);
  }
//+------------------------------------------------------------------+

Comments