【MQL4関数】OnTimer関数とは?一定時間ごとに実行されるイベント関数

【中級編】MQLプログラムの読み方・書き方
朝日奈りさ
朝日奈りさ

OnTimer関数は、一定時間ごとに実行されるイベント関数です。さらに時間を設定することが可能なので、好きな時間ごとにプログラムを実行させることができます。

OnTimer関数とは

「一定時間ごとにプログラムを動かしたい!」

という方は、OnTimer関数を使ってみましょう!

OnTimer関数は、イベント関数の一つで、一定時間ごとに実行されるイベント関数です。

そのため、OnTick関数と違い、ロウソク足が動いてなくても実行されます。

つまり、OnTimer関数内に、エントリーやエグジットの処理を記述することで、一定時間ごとに決済してくれるプログラムを書くことができます。

また、自動売買(エキスパートアドバイザ)を新規作成すると、イベント関数を追加するウィンドウが出てきます。

イベント関数を追加するウィンドウで、OnTimer関数を選択することで、自動的にプログラムに追加することができるので、利用すると良いでしょう。

また、OnTimer関数以外にも、主に以下の3つの関数が、自動的にプログラミングされているので、確認しておくと良いでしょう。

今回は、OnTimer関数に注目して解説していきます。

OnTimer関数を追加し、自動売買を新規作成したときのプログラム

自動売買を新規作成すると、以下のようなプログラムが自動作成されます。

//+------------------------------------------------------------------+
//|                                            SampleMQL_OnTimer.mq4 |
//|                                     Copyright 2022, Asahina Risa |
//|                                      https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, Asahina Risa"
#property link      "https://mql-programing.com/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   
  }
//+------------------------------------------------------------------+

このように、すでにOnInit関数・OnDeinit関数・OnTick関数・OnTimer関数が記述されています。

OnTick関数は、41行目にあります。

さらに、見慣れない関数(EventSetTimer関数とEventKillTimer関数)が、OnInit関数とOnDeinit関数に追加されていることがわかります。

  • 16行目:OnInit関数・・・EventSetTimer(60);
  • 27行目:OnDeinit関数・・・EventKillTimer();

EventSetTimer関数とEventKillTimer関数は、OnTimer関数の設定を行う関数です。

それぞれ以下のようなプログラムになっております。

  • EventSetTimer関数:OnTimerを実行させる時間を設定する関数(単位:秒)
  • EventKillTimer関数:EventSetTimer関数で設定した時間を、消去する関数

EventKillTimer関数で、設定を消去しておかないと、別のEAに影響がある可能性があります

このように、EventSetTimer関数とEventKillTimer関数を利用することによって、OnTimer関数を使うことができるようになります。

ちなみに上記の例だと、EventSetTimer(60);なので、60秒ごとに1回だけOnTimer関数を実行する設定になっています。

OnTimer関数の特徴

OnTimer関数はイベント関数なので、イベントが起こったときに実行されます。

そのイベントとは、「一定時間が経ったとき」です。

つまり、チャートの価格が動いても、動いてなくても実行される関数です。

そのため、チャートの価格の変動に影響されることがなく、一定時間ごとにプログラムを実行させることができます。

例えば、エントリーした時間を表示したり、現在のサーバー時間を表示したり、何かチャート上に表示させたい場合と相性が良いです。

もし、一定時間ごとではなく、チャートの価格が動いたときに実行させたいプログラムがある場合は、OnTick関数を使うと良いでしょう。

OnTimer関数は、自動売買(エキスパートアドバイザ)でもインジケータでも利用できます。

ただし、OnTimer関数はスクリプトでは実行できない関数です。

OnTimer関数の書き方

OnTimer関数の使い方は、基本的な関数と同じです。

関数をマスターしていない方はこちらの記事が参考になります。

基本的な書き方

OnTimer関数はとてもシンプルな関数です。

引数はありません。

戻り値はvoid型です。

OnTimer関数の基本的な書き方は以下の通りです。

void OnTimer()
  {
   
  }

戻り値はvoid型なので、特にreturnは必要ありません。

戻り値

なし

引数

なし

OnTimer関数のサンプルプログラム

サンプルプログラムは、こちらになります。

このプログラムは、EAを動かした時間・現在のローカル時間・現在のサーバー時間・遅延を考慮したサーバー時間の4つを表示します。


//EAを実行したサーバー時間
datetime start_time = TimeCurrent();

//EAを実行したサーバー時間
datetime start_tradeserver_time = 0;

//遅延を考慮したサーバー時間
datetime calculated_server_time = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
//1秒ごとにOnTimer関数を実行する
   EventSetTimer(1);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
//時間の設定を消去する
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---

//ローカルPC時刻
   datetime local_time = TimeLocal();

//現在のサーバ時刻
   datetime trade_server_time = TimeCurrent();

//何らかの理由でサーバの時刻が不明な場合は、先に終了する
   if(trade_server_time == 0)
      return;

//サーバ初期時間がまだ設定されていない場合
   if(start_tradeserver_time == 0)
     {
      start_tradeserver_time = trade_server_time;
      calculated_server_time = trade_server_time;

      //サーバの現在時刻を表示する
      Print(start_tradeserver_time);
     }
   else
     {
      //遅延を考慮し、1msec増やす
      calculated_server_time = calculated_server_time + 1;
     }
//コメントを作成
   string com = StringFormat("                  start_time: %s\r\n", TimeToString(start_time, TIME_MINUTES | TIME_SECONDS));
   com = com + StringFormat("                  local_time: %s\r\n", TimeToString(local_time, TIME_MINUTES | TIME_SECONDS));
   com = com + StringFormat("trade_server_time: %s\r\n", TimeToString(trade_server_time, TIME_MINUTES | TIME_SECONDS));
   com = com + StringFormat("calculated_server_time: %s\r\n", TimeToString(calculated_server_time, TIME_MINUTES | TIME_SECONDS));
//コメントを表示する
   Comment(com);
  }
//+------------------------------------------------------------------+

 

 

まとめ

OnTimer関数は、「一定時間が経ったとき」に実行されるイベント関数です。

そのため、チャートの変動に影響を受けることなく、一定時間ごとに実行できることが特徴です。

また、OnTimer関数は、何か情報を表示することに適した関数なので、チャート上に表示したい情報がある場合は、OnTimer関数を利用してみると良いでしょう。