MetaEditorでカスタムインジケーターを新規作成すると、
OnInit()・OnCalculate()・OnDeinit()という、
3つの空のテンプレートが自動生成されます。
この記事では、その作成手順と、テンプレートに何を書き足していけばよいかを順番に解説します。
MetaEditorでカスタムインジケーターを新規作成する手順
まず、MetaEditorを起動し、新規作成からカスタムインジケーターを選び、
名前などの基本情報を記入するところまでの手順を説明します。
ツール→メタエディタでMetaEditorを起動する
MetaEditor(メタエディタ)をMT4から起動させる方法は以下の通りです。

- ツール→メタエディタ
- フォルダのアイコン
でメタエディタを起動します。
新規作成でカスタムインジケーターを選択する
次に新規作成を押して、
今回はインジケーターを作成するのでカスタムインディケータを選択しましょう。

インジケーター名・著作者・パラメーターなど必要な情報を記入する
必要な情報を記入しましょう。
- インジケーターの名前
- 著作者
- リンク
- パラメーター
パラメーターは必要なときだけ活用します。
今回は名前はSample1などで良いです。

イベントハンドラの選択からテンプレートの自動生成まで
次に、使うイベントハンドラを選び、サブウィンドウの設定を終えると、
OnInit()・OnCalculate()・OnDeinit()の、
空テンプレートが自動生成されます。
OnTimer・OnChartEventなど使うイベントハンドラを選択する
イベントハンドラを選択します。
もともとOnCalculate()は入っているので、
- OnTimer()
- OnChartEvent()
は、必要な時にチェックしましょう。

サブウィンドウの設定をスキップして完了する
サブウィンドウの設定になります。
今回は必要ないのでスルーです。
そのままfinishを押して終了しましょう。

OnInit・OnCalculate・OnDeinitの空テンプレートが自動生成される
以下のようにテンプレートが自動生成されます。

これが1つの雛形になります。
ソースコードはそのまま以下に記載しておきます。
//+------------------------------------------------------------------+
//| sample1.mq4 |
//| Copyright 2020, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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 value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
テンプレートにプロパティ・パラメーター・バッファ・イベントハンドラを記述する
自動生成されたテンプレートの骨組みに、
プロパティ・パラメーター・バッファ・イベントハンドラ関数の中身を順番に書き足していきます。
まずは、ソースコードの全体像を確認します。

プロパティ・パラメーターを記述する
プロパティについて詳しくはこちらパラメーターについて詳しくはこちら
数値を保存する箱『バッファ』を記述する
バッファとは、数値を入れておく箱のようなものです。
MQLでインジケーターはバッファで管理されることが多いです。
チャート上に線や矢印などの設定をしたい場合は、
バッファの存在をMT4に通知する必要があります。
OnInit・OnCalculate・OnDeinitの中身にプログラムを記述する
イベントハンドラ関数内にプログラムを記述していきます。
基本的にカスタムインジケーターで記載する必要があるのは、
- OnInit()
- OnCalculate()
- OnDeinit()
の3つです。
OnDeinit()は綴りに注意してください。
「OnDeInit」のように大文字と小文字を間違えると、
MQL4はこの関数を標準のイベントハンドラとして認識しません。
コンパイル自体は通ってしまうため気づきにくいのですが、
インジケーターを外すときに呼ばれるはずの後始末、
(タイマーの解除、チャート上に作ったオブジェクトの削除など)が実行されず、
意図しない状態が残ってしまいます。
書いたソースコードをコンパイルしてチャートに表示する
ソースコードを書き終わったら、
コンパイルしてから実際のチャートに表示して動作確認するまでの流れを説明します。

ソースコードをコンパイルする
プログラムを記述した後に、コンパイルという作業が必要になります。
プログラムをコンパイルすることにより、
メタトレーダーのインジケーターやEAとして使用することができるようになります。

作成したインジケーターをチャートに表示して動作確認する
作成したカスタムインジケーターをチャートに表示して実際に使います。
もしバグなどがあればデバッグ作業を行いましょう。
バグもなければこれでカスタムインジケーターの作成が完了です。
MetaEditorでコーディング効率を上げる4つのテクニック
最後に、MetaEditorでのコーディングが少し速くなる、
インデント・リファレンス確認・入力補完の小技を4つ紹介します。
インデントを効率化するテクニック
インデントを部分的に修正したい時は複数行を選択して
- Tabを押すと右に動く
- Tab+Shiftを押すと左に動く
Tools – Styler を選択すると、
全てが自動で適切な配置にインデントされ一括整形できます(行の選択は不要)。
関数リファレンス・パラメータヒントを確認するテクニック
調べたい関数の上にカーソルを置いて「F1」を押すと関数リファレンスを見ることができます。
関数の引数入力中に「Ctrl」+「Shift」+「Space」
を押すとパラメータのヒントが出るので、これを参考にすると何を入力すれば良いか分かります。
入力補完を効率化するテクニック
Tools – Options を選択し、
Generalタブの List names after に「1」を入力すると、
入力補完の選択肢発生が初期設定の3文字目から1文字目になります。
【MQL】カスタムインジケーターを作成の流れについてわかりやすく説明してみた:まとめ
今回はカスタムインジケーターの作成の流れをご紹介しました。
一度理解すればあとはプログラミングする際に同じような手順を進めれば良いです。
とくにOnDeinit()の綴りだけは、
コンパイルエラーにならず気づきにくいので注意しましょう。
コメント