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関数を利用してみると良いでしょう。