MQL5の基本構造概要
MQL5では、プログラムを作成する際に基本的な構造として、主に3つの関数(イベントハンドラ)が使われます。これらの関数は、MQL5のエキスパートアドバイザー(EA)やインジケーター、スクリプトにおいて非常に重要な役割を果たします。ここでは、それぞれの関数がどのような役割を持ち、どのように使用するかについて詳しく解説します。
OnInit関数
OnInit関数は、MQL5プログラムにおいて最初に呼び出される関数です。プログラムがチャートに読み込まれた時、またはEAやインジケーターが最初に実行される際に実行されます。この関数は、プログラムの初期化処理を行うために使用されます。
主な用途
- 初期化処理を行う
- 設定や変数、リソースの初期化
- その他の初期化処理やインジケーター設定
OnInit
関数内では、プログラムのセットアップや初期化、インジケーターの設定、必要なリソースの読み込みなどを行います。例えば、ファイルのオープンやデータベースの接続を行う際にも利用します。
例
int OnInit() {
// 初期化処理
Print("プログラムが初期化されました");
return(INIT_SUCCEEDED); // 初期化成功を返す
}
このコードでは、OnInit
関数が初期化処理を行い、その後INIT_SUCCEEDED
を返すことでプログラムが正常に初期化されたことを示します。
OnTick関数
OnTick関数は、最も頻繁に使用される関数です。この関数は、新しいティックが受信されるたびに呼び出され、主に価格変動に基づいたロジックを実行する場所です。マーケットが更新されるたびにこの関数が実行されるため、取引シグナルの生成や価格監視、取引の実行に使われます。
主な用途
- 価格やティックデータの取得
- トレード戦略の実行(買い、売り、決済)
- その他のインジケーター計算やデータ処理
通常、取引シグナルを出す処理やトレードの実行はこのOnTick
関数内で行われます。例えば、移動平均線が交差したタイミングでエントリーを行うような戦略をOnTick
内に実装します。
例
void OnTick() {
// 現在のティックに基づいた価格を取得
double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
Print("現在の価格: ", currentPrice);
// 価格が特定の値を超えた場合に注文を出す(例)
if(currentPrice > 1.2000) {
// 売買注文のロジックを追加
Print("条件を満たしました。取引開始!");
}
}
このコードでは、OnTick
内でティックごとに現在の価格を取得し、その価格が特定の値(1.2000)を超えた場合に取引を開始するシグナルを出しています。
OnDeinit関数
OnDeinit関数は、プログラムが終了する際に呼び出されます。EAやインジケーター、スクリプトがチャートから削除される時やプログラムが終了する際に実行されるので、リソースの解放や最終処理を行うのに使用します。
主な用途
- 使用したリソースの解放
- 開いたファイルやポジションのクローズ
- 最後のログ出力や清掃処理
OnDeinit
は、プログラム終了時にクリーンアップ処理を行うため、重要な役割を持っています。例えば、ファイルを閉じる、データベース接続を切断する、あるいは開いているポジションを決済する処理が記述されます。
例
void OnDeinit(const int reason) {
// プログラム終了時の処理
Print("プログラムが終了しました。");
}
このコードでは、OnDeinit
関数が呼ばれるときに「プログラムが終了しました」とメッセージを出力します。
まとめ
- OnInit: プログラムの初期化処理を行う関数。プログラム開始時に一度だけ呼び出される。
- OnTick: 市場の更新があるたびに呼び出され、取引やシグナル生成に使われる。
- OnDeinit: プログラム終了時に呼び出され、リソースの解放や最終処理を行う。
これらの基本的な関数を理解し、上手に使うことで、MQL5プログラムの効率的な開発が可能になります。これらは、EAやインジケーターを作成する際に必須の基本構造となりますので、しっかりと押さえておきましょう。
サンプルコード
//+------------------------------------------------------------------+
//| HelloWorld.mq5 |
//| MetaTrader 5 |
//| Written by Your |
//+------------------------------------------------------------------+
// プロパティ設定
#property copyright "Your Name" // 著作権情報
#property link "https://www.example.com" // 開発者のウェブサイトリンク
#property version "1.00" // バージョン番号
// グローバル変数
int g_counter = 0; // カウンター用の変数
//+------------------------------------------------------------------+
//| 初期化イベントハンドラ OnInit |
//| チャートにインジケーターやEAを読み込む際に呼び出される |
//+------------------------------------------------------------------+
int OnInit()
{
// 初期化メッセージをログに出力
Print("Hello World - OnInitが呼ばれました");
// 変数の初期化処理などを行うことができる
g_counter = 0; // カウンターをリセット
// 成功を返す
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| 新しいティックが到着するたびに呼び出される OnTick |
//| 市場価格の変動を追跡するためのロジックを追加できる |
//+------------------------------------------------------------------+
void OnTick()
{
// 毎回ティックが来る度にカウンターを増加
g_counter++;
// カウンターの値をログに出力
Print("ティックのカウント: ", g_counter);
// 例えば、100ティックごとにアラートを出す
if(g_counter % 100 == 0)
{
Alert("100ティックが経過しました!");
}
}
//+------------------------------------------------------------------+
//| 終了イベントハンドラ OnDeinit |
//| インジケーターやEAが削除される際に呼び出される |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 終了メッセージをログに出力
Print("Hello World - OnDeinitが呼ばれました");
// 必要に応じて、後片付け処理(リソースの解放等)を行う
// 例えばファイルを閉じるなど
}
用語集
用語 | 説明 |
---|---|
イベントハンドラ | プログラムが特定のイベント(例:市場のティック更新、インジケーターの計算、取引の実行など)を検出した際に自動的に実行される関数。MQL5では、OnInit、OnTick、OnDeinitなどが代表的なイベントハンドラ。 |
イベント | プログラムの外部または内部で発生する出来事。例えば、新しい価格情報(ティック)の受信やユーザーの操作などがイベントとして発生し、それに対応したハンドラが実行される。 |
関数 | 特定の処理をまとめて定義したコードの塊。MQL5ではイベントハンドラとして特定の関数が自動的に呼び出される。 |
OnInit | プログラムの初期化処理を行う関数。プログラム開始時に一度だけ呼び出される。 |
OnTick | 新しいティック(価格更新)ごとに呼び出され、取引やシグナル生成に使われる。 |
OnDeinit | プログラム終了時に呼び出され、リソースの解放や最終処理を行う。 |
ティック | 市場の価格が更新されること。新しい価格情報が取得されるたびに発生。 |
インジケーター | チャート上で表示される計算結果を基にした分析ツール。移動平均線やRSIなどが含まれるZ |
コメント