I found an interesting MT4 indicator which shows remaining time of the next bar in the chart. But that works for the particular pairs which I would choose.
But I want that program to work/applied on all opened pairs by just applying to any of the opened one pair.
Please check the code below::::
//--- input parameters
input string LabelFont = "Arial";
input int LabelSize = 15;
input color LabelColor = clrRed;
input int LabelDistance = 15;
const string LabelName = "TimeToNextCandle";
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
EventSetTimer(1);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
EventKillTimer();
ObjectDelete(0, LabelName);
}
//+------------------------------------------------------------------+
//| 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[])
{
//---
CalcTime();
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
CalcTime();
}
//+------------------------------------------------------------------+
void CalcTime(void)
{
// checking is there output label. create it if necessary
if (ObjectFind(LabelName) == -1)
{
ObjectCreate(0, LabelName, OBJ_LABEL, 0, 0, 0);
ObjectSetString(0, LabelName, OBJPROP_FONT, LabelFont);
ObjectSetInteger(0, LabelName, OBJPROP_FONTSIZE, LabelDistance);
ObjectSetInteger(0, LabelName, OBJPROP_COLOR, LabelColor);
ObjectSetInteger(0, LabelName, OBJPROP_ANCHOR, ANCHOR_RIGHT_LOWER);
ObjectSetInteger(0, LabelName, OBJPROP_CORNER, CORNER_RIGHT_LOWER);
ObjectSetInteger(0, LabelName, OBJPROP_XDISTANCE, LabelDistance);
ObjectSetInteger(0, LabelName, OBJPROP_YDISTANCE, LabelDistance);
}
// calculating remaining time to next candle
datetime TimeTo = PeriodSeconds() - (TimeCurrent() - Time[0]);
// assembling the output string depending on current period on the chart
string Out = StringFormat("%.2d", TimeSeconds(TimeTo));
if (TimeTo >= 3600)
{
Out = StringFormat("%.2d:%s", TimeMinute(TimeTo), Out);
if (TimeTo >= 86400)
Out = StringFormat("%d day(s) %.2d:%s", int(TimeTo / 86400), TimeHour(TimeTo), Out);
else
Out = StringFormat("%d:%s", TimeHour(TimeTo), Out);
}
else
Out = StringFormat("%d:%s", TimeMinute(TimeTo), Out);
ObjectSetString(0, LabelName, OBJPROP_TEXT, StringFormat("%s (%.0f%s)", Out, 100.0 / PeriodSeconds() * TimeTo, "%"));
}
//+------------------------------------------------------------------+
Let's split the task into two parts:
Part I.:
How to measure the time.
Metatrader Terminal architecture has moved the code-execution units into three principal types:
-
{0|1}
-unique ExpertAdvisor-type of MQL4-code, per MT4.graph-
{0|1|..|n}
CustomIndicatero-type of MQL4-code, per MT4.graph-
{0|1}
-unique Script-type of MQL4-code, per MT4.graphThis may sound interesting to use more and more CustomIndicators, but there is a catch.
Catch XXII.
All CustomIndicators and all ExpertAdvisors are responsively executed upon a Market Event message arrival. That means, whenever a Market Event arrives, all ExpertAdvisors and all CustomIndicators are pushed to execute their respective processing (
OnTick(){...}
function is called in ExpertAdvisor(s),OnCalculate(){...}
function is called in CustomIndicator ). That still sounds reasonable. The Catch XXII. is hidden in the fact, that all CustomIndicators share a SINGLE THREAD. Yes, ALL !This translated into plain english means, avoid everything that could block from CustomIndicators and put it elsewhere, but the CustomIndicator MQL4-code.
Using New-
MQL4.56789
EventSetTimer()
-facilities does not improve the already obvious problem, just the very opposite, so let's forget to useOnTimer()
.So, how to safely design such feature?
The possible way is to use a low-profile service design, deployed in a helper-( non-trading )-MT4.graph for such utility service and best use a Script ( as it is absolutely under one's control, asynchronous to any Event-triggered EA / CI code-execution and works safe and sound even during times, when the Market is closed or the connection to the MetaTrader Server is down ).
This "central"-clock ( timing facility ) provides a unique, reference-time and stores it so as to be available to any "consumer" in other MT4.graphs.
Part II.:
How to display the time in all MT4.graphs
in a most lightweight form?
Given the central service takes care of respective
ENUM_TIMEFRAMES
listed ( being "visited" or not by other MT4.graphs ) and posting the pre-fabbed results of such "time-service" calculus,any potential "consumer"
may just asynchronously check and react to the "time-service" posted values,
in places, where feasible and safe in it's respective flow of code-execution, kind users are under full control to declare, where such lightweight GUI-call may appear and where all updates may benefit from ( a potentially deferred ) enforced GUI-repaint: