
さて、今回から少し本格的にプログラム講座を始めて行きます。
プログラムというのは、どんな順番で何をするのかをまとめた手順書のようなものです。これをMT4が理解できるよう言語(MQL)で記述します。
MEL言語は、C言語と呼ばれる昔の代表的なプログラム言語がベースになっていますので、解説サイトも多いですし、それほど難しい言語ではありません。プログラマーなら誰もが通る基礎的な言語です。
今回は、動くサンプルコードをコンパイルし、どうしてそのようになるのかを解説します。
MQL4コードファイルの作り方
まず、最初にMQLコードを作ってみましょう。
MQLは、自動でベースのコードを作成してくれるウィザードが用意されていますので、誰でも簡単に作成することができる便利なツールです。
どの項目を選択すると、どんなコードが作成されるのかを分かりやすく抜粋して説明します。
新規作成
MT4のメニュー上部から「新規作成」をクリック。

作成する種類
何のプログラムを作るのかを指定します。
EAの場合はエキスパートインジケータで、インジケーターの場合はカスタムインジケータです。
選択によって自動生成されるコードの内容が変わりますので、ご注意ください。

ライブラリやスクリプトはロジックを再利用するする考え方ですので、最初は難しいので使わなくて大丈夫です。
ファイル名とプロパティ

ウィザードで上記のようにすると、次のコードが自動生成されます。
#property indicator_buffers 1
//--- input parameters
input int Input1;
これは、MT4から入力するパラメータになります。

イベントハンドラ
通常のプログラムは、決められた処理を終えると終わりなのですが、MT4はイベント駆動型となっているため、イベントをトリガーに処理を実行する仕組みになっています。

イベントには次の種類がありますので、用途に応じて使い分けてください。
- OnCalculateはチャートのティックが一回動くごとに実行される関数です。(必須)
- Ontimerは指定した時間間隔で実行される関数です。(任意)
- OnChartEventは、クリックなどを検知した際に実行される関数です。(任意)
OnCalculateは必須で、ティックごとに処理が走るメイン関数です。OnTimerは1時間に一回だけ動かしたい処理を実装する場合などに使います。
描画プロパティ
ラインなどを使用する際に設定するプロパティです。
ラインやヒストグラムなどを描画させるためのプロパティだと思ってください。

上記内容で次のコードが自動生成されます。
#property indicator_plots 1
//--- plot Label1
#property indicator_label1 "Label1"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
移動平均線のサンプルコードを読んでみよう
さて、MQLファイルの作り方がわかったところで、次のステップに入ります。
簡単な移動平均線を流用したサンプルインジケーターを用意しましたので、これを読み解いていきましょう。
実行結果
実行結果は次のようになります。

ソースコード
コピペしてコンパイルできます。実際に動かして確認してください。
//+------------------------------------------------------------------+
//| sample1.mq4 |
//| Copyright 2023, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plot Label1
#property indicator_label1 "Label1"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
input int in_period=20; // 期間
input ENUM_APPLIED_PRICE in_applied_price=PRICE_CLOSE; // 適用価格
double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,Buffer);
SetIndexStyle(0, DRAW_LINE , STYLE_SOLID , 2 ,RoyalBlue);
//---
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[])
{
int limit = Bars - prev_calculated;
for(int i=0; i<limit-1; i++)
{
double ma = iMA(NULL,0,in_period,0,MODE_EMA,in_applied_price,i);
Buffer[i] = ma;
}
return(rates_total);
}
入力パラメータ
この変数はiMA関数にセットして使います。
input int in_period=20; // 期間
input ENUM_APPLIED_PRICE in_applied_price=PRICE_CLOSE; // 適用価格
本来、移動平均線の入力パラメーターはもう少しあるのですが、今回は簡易版として二つだけ入力によって変更できるようにしています。その他の項目はハードコーディング(コードに直接記入)しています。
期間はシンプルに、移動平均線の期間になります。
適用価格はENUM_APPLIED_PRICEを利用してコンボボックスから選択できるようにしています。ちょっとした小技ですが、あるとないとでは便利さが違います。
初期化処理
移動平均線の変数とラインを紐付ける処理です。ここで何をしているのかというと、Bufferという変数に入ったデータをラインで出力する方法を定義する初期処理です。
SetIndexBuffer(0,Buffer);
SetIndexStyle(0, DRAW_LINE , STYLE_SOLID , 2 ,RoyalBlue);
主処理
主処理はティック単位に処理すると、先ほど説明したとおり、ティックが動く度にOnCalculate関数が起動します。
そのため、毎回何千何万件のデータを処理して再描画するのは無駄ですので、変動のあった分だけを処理している実装になります。forの部分でそれを実現しています。
int limit = Bars - prev_calculated;
for(int i=0; i<limit-1; i++)
{
double ma = iMA(NULL,0,in_period,0,MODE_EMA,in_applied_price,i);
Buffer[i] = ma;
}
あとは、標準で用意されている移動平均線を取得する関数を利用して移動平均線のデータを受けとり、Bufferにセットしているだけです。
初期化処理でBufferにセットされた値はラインに描画されると説明したとおり、ここでセットする値がラインとなります。
調整して確認
入力パラメータの数値を変更すると、描画が切り替わることが確認できます。
このほかに、iMA関数にハードコーディングしているパラメータをinput属性として用意してみても良いですし、変数を追加して移動平均線をもう一本表示させてみてもいいです。
ラインをヒストグラムに変更してみたり、サブウィンドウに出力させてみたり、色々弄って確認してください。
現状のコードがあって、何をどうすればどう変わるのか?
最初は手探りで確認することになりますが、一度覚えてしまえばどうすればいいのかすぐに分かるようになります。