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

MQL4テクニック

チャート上に、次足までのカウントダウンタイマーを設置するプログラムをご紹介します。

表示例

5分足

時間軸がM1、M5、M15、M30、H1のチャートでは、「分:秒」形式で表示されます。

4時間足

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

あなたのやりたいことがきっと見つかる!
MQL4テクニック 逆引き集 はこちら

サンプルコード

以下サンプルコードです。コピペですぐに動きます。

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にもアップしています。

POINT

こちらの記事で悩みが解決されない場合は、
MQL4 User Community に参加してお気軽にご質問ください。

MQL4初心者の方や開発に行き詰った方の悩みを、 様々なソフトウェアやツールを開発してきた経験豊富なエンジニアたちが解決いたします。