【MQL4テクニック】次足までの残り時間を表示する方法【コピペですぐに使えます!】

チャート上に、次足までのカウントダウンタイマーを設置するプログラムをご紹介します。
表示例
5分足
時間軸がM1、M5、M15、M30、H1のチャートでは、「分:秒」形式で表示されます。

4時間足
それ以外の時間軸のチャートでは、「時間:分:秒」形式で表示されます。

サンプルコード
以下サンプルコードです。コピペですぐに動きます。
void OnInit(){
ObjectCreate("TimerObj", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0,"TimerObj", OBJPROP_CORNER, CORNER_RIGHT_UPPER);
ObjectSetInteger(0,"TimerObj", OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER);
ObjectSetInteger(0,"TimerObj", OBJPROP_XDISTANCE, 0);
ObjectSetInteger(0,"TimerObj", OBJPROP_YDISTANCE, 0);
ObjectSetText("TimerObj", "", 24, "Meiryo UI", clrWhite);
EventSetTimer(1);
}
void deinit(){
ObjectDelete("TimerObj");
}
void OnTimer(){
int secRemaining = Time[0] + PeriodSeconds() - TimeCurrent();
int hour = secRemaining / 3600;
int min = (secRemaining / 60) % 60;
int sec = secRemaining - min * 60 - hour * 3600;
string minStr = AddZero(min);
string secStr = AddZero(sec);
string TimeText;
if(Period() <= 60){
TimeText = minStr + ":" + secStr;
}else{
TimeText = hour +":"+ minStr + ":" + secStr;
}
ObjectSetText("TimerObj", TimeText, 24);
}
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[])
{
return(rates_total);
}
//1秒を01秒にするための関数
string AddZero(int time){
if (time > 0 && time < 10){
return "0" + (string)time;
}else if (time <= 0){
return "00"; //ラグでマイナス秒になるのを防ぐ
}else{
return (string)time;
}
}
それでは順番にコードの意味を解説していきます。
void OnInit(){
ObjectCreate("TimerObj", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0,"TimerObj", OBJPROP_CORNER, CORNER_RIGHT_UPPER);
ObjectSetInteger(0,"TimerObj", OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER);
ObjectSetInteger(0,"TimerObj", OBJPROP_XDISTANCE, 0);
ObjectSetInteger(0,"TimerObj", OBJPROP_YDISTANCE, 0);
ObjectSetText("TimerObj", "", 24, "Meiryo UI", clrWhite);
EventSetTimer(1);
}
OnInit関数内に、タイマーをチャートの右上に表示するためのコードを記載します。
詳しくはこちらの記事を参照してください。
int secRemaining = Time[0] + PeriodSeconds() - TimeCurrent();
Time[0]:現在の足のオープン時間を取得します。
PeriodSeconds関数:時間軸の値を秒数で返します。
例:5分足→300(秒)
1時間足→3600(秒)
TimeCurrent関数:現在のサーバ時刻を返します。
Time[0] + PeriodSeconds()で次足のオープン時間となり、
ここからTimeCurrent()を引くことで次足までの残り時間になります。
合わせてこちらの記事も参考にしてください。
int hour = secRemaining / 3600;
int min = (secRemaining / 60) % 60;
int sec = secRemaining - min * 60 - hour * 3600;
次足までの残り時間を、hour(時間)min(分)sec(秒)にそれぞれ分けます。
string AddZero(int time){
if (time > 0 && time < 10){
return "0" + (string)time;
}else if (time <= 0){
return "00"; //ラグでマイナス秒になるのを防ぐ
}else{
return (string)time;
}
}
string minStr = AddZero(min);
string secStr = AddZero(sec);
0~9秒を00~09秒という形式に変換するための、AddZero関数を定義します。
また途中の else if (time <= 0) の部分では、MT4のラグによって残り時間がマイナスになるのを防ぎます。
string TimeText;
if(Period() <= 60){
TimeText = minStr + ":" + secStr;
}else{
TimeText = hour +":"+ minStr + ":" + secStr;
}
時間軸がM1、M5、M15、M30、H1のチャートでは、「分:秒」形式で表示し、
それ以外の時間軸のチャートでは、「時間:分:秒」形式で表示します。
ObjectSetText("TimerObj", TimeText, 24);
タイマーに表示する時間を更新します。
ダウンロードリンク
「すぐに使いたい!」という方はこちらからダウンロードしてください。
BaeChangeTimerをダウンロードサンプルコードに加え、以下の機能を追加しています。
- タイマー表示位置調節機能
- タイマー文字色&フォントサイズ変更機能
- 残り○○秒で文字色変更
パラメータはこちら

GitHubにもアップしています。