「MQL5でオリジナルインジケーターを作りたいけど、プログラミングの知識がなくて諦めていませんか?」
「何から始めればいいのか分からない」「難しそうで手が出せない」というお悩みをよく聞きます。
実は、プログラミング未経験でも30分で簡単なインジケーターが作れるんです。
この記事では、MetaTraderでよく使う移動平均線インジケーターを例に、作り方を丁寧に解説します。
コピー&ペーストで使えるテンプレートも用意したので、手順通りに進めれば必ず作れます。
さあ、一緒にオリジナルインジケーター作りへの第一歩を踏み出しましょう。
目次
MQL5でインジケーターを作る前の準備
MQL5でインジケーターを作るには、専用のエディタソフトが必要です。
まずは環境構築から始めていきましょう。
環境構築の手順
MetaTraderをインストールすると、MetaEditorという開発ツールも一緒に入ります。
MetaTraderのインストールはとても簡単です。
まず、公式サイトにアクセスして「Download」ボタンをクリックします。
ダウンロードしたファイルを実行すると、自動的にインストールが始まります。
特別な設定は必要ないので、表示される画面で「次へ」を押していけばOKです。
インストールが完了したら、デスクトップに表示されるMetaTraderのアイコンをダブルクリックします。
次に、画面上部のツールバーから「ツール」→「MetaEditor」を選択します。
これで開発環境の準備は完了です。
日本語表示にしたい場合は、MetaEditorの「View」→「Languages」から「日本語」を選択してください。
インジケーター作成に必要な基礎知識
プログラミング用語って難しそうに聞こえますが、実は単純な考え方です。
たとえば「変数」は、数値や文字を一時的に保存する箱のようなものです。
「関数」は、決まった作業をするための手順書みたいなものですね。
MQL5で特に重要なのが「バッファ」という概念です。
バッファは、インジケーターの値をチャート上に表示するために使います。
移動平均線なら、計算した平均値をバッファに入れることで、チャート上に線が描かれるわけです。
MQL5で簡単なインジケーターを作ってみよう
いよいよインジケーター作成の実践に入ります。
分かりやすい例として、シンプルな移動平均線インジケーターを作っていきましょう。
移動平均線インジケーターを作る
まず、MetaEditorを開いて、画面左上の「新規作成」ボタンをクリックします。
表示されたウィンドウで「カスタムインジケーター」を選択します。
すると、基本的なコードが自動的に生成されます。
以下のコードをコピーして、エディタに貼り付けてください。
#property copyright "Your Name"
#property link "https://www.yourwebsite.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots 4
//移動平均線の設定
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlue // 短期移動平均線の色
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed // 長期移動平均線の色
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//矢印の設定
#property indicator_type3 DRAW_ARROW
#property indicator_color3 clrLime // 買いサインの色
#property indicator_width3 2
#property indicator_style3 STYLE_SOLID
#property indicator_type4 DRAW_ARROW
#property indicator_color4 clrRed // 売りサインの色
#property indicator_width4 2
#property indicator_style4 STYLE_SOLID
//外部パラメーター
input int FastMAPeriod = 5; // 短期移動平均の期間
input int SlowMAPeriod = 20; // 長期移動平均の期間
input int ArrowDistance = 5; // 矢印の距離(ポイント)
//バッファ
double FastMABuffer[]; // 短期移動平均
double SlowMABuffer[]; // 長期移動平均
double UpArrowBuffer[]; // 買いサイン
double DnArrowBuffer[]; // 売りサイン
//初期化関数
int OnInit()
{
//バッファの設定
SetIndexBuffer(0, FastMABuffer, INDICATOR_DATA);
SetIndexBuffer(1, SlowMABuffer, INDICATOR_DATA);
SetIndexBuffer(2, UpArrowBuffer, INDICATOR_DATA);
SetIndexBuffer(3, DnArrowBuffer, INDICATOR_DATA);
//バッファの初期化
ArraySetAsSeries(FastMABuffer, true);
ArraySetAsSeries(SlowMABuffer, true);
ArraySetAsSeries(UpArrowBuffer, true);
ArraySetAsSeries(DnArrowBuffer, true);
//矢印のコードを設定
PlotIndexSetInteger(2, PLOT_ARROW, 233);
PlotIndexSetInteger(3, PLOT_ARROW, 234);
//表示位置の設定
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,FastMAPeriod);
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,SlowMAPeriod);
return(INIT_SUCCEEDED);
}
//移動平均計算用の関数
double CalculateMA(const double &price[], int pos, int period)
{
double sum = 0.0;
int count = 0;
for(int i = 0; i < period && pos-i >= 0; i++)
{
sum += price[pos-i];
count++;
}
return (count > 0) ? (sum / count) : 0;
}
//計算関数
int OnCalculate(const int rates_total, // 全データ数
const int prev_calculated, // 前回計算された本数
const datetime &time[], // Time配列
const double &open[], // Open配列
const double &high[], // High配列
const double &low[], // Low配列
const double &close[], // Close配列
const long &tick_volume[], // Tick Volume配列
const long &volume[], // Real Volume配列
const int &spread[]) // Spread配列
{
//配列の向きを合わせる
ArraySetAsSeries(time, true);
ArraySetAsSeries(open, true);
ArraySetAsSeries(high, true);
ArraySetAsSeries(low, true);
ArraySetAsSeries(close, true);
//計算開始位置の設定
int limit;
if(prev_calculated == 0)
{
limit = rates_total - 1;
//バッファをクリア
ArrayInitialize(FastMABuffer, 0.0);
ArrayInitialize(SlowMABuffer, 0.0);
ArrayInitialize(UpArrowBuffer, EMPTY_VALUE);
ArrayInitialize(DnArrowBuffer, EMPTY_VALUE);
}
else
{
limit = rates_total - prev_calculated;
if(limit > 1) limit++;
}
//移動平均とクロスの計算
for(int i = limit-1; i >= 0 && !IsStopped(); i--)
{
//移動平均の計算
FastMABuffer[i] = CalculateMA(close, i, FastMAPeriod);
SlowMABuffer[i] = CalculateMA(close, i, SlowMAPeriod);
//シグナル初期化
UpArrowBuffer[i] = EMPTY_VALUE;
DnArrowBuffer[i] = EMPTY_VALUE;
//クロスの判定(2本以上のデータがある場合)
if(i < rates_total-2)
{
//ゴールデンクロス:現在のバーで上抜け
if(FastMABuffer[i] > SlowMABuffer[i] &&
FastMABuffer[i+1] <= SlowMABuffer[i+1])
{
UpArrowBuffer[i] = low[i] - ArrowDistance * Point();
}
//デッドクロス:現在のバーで下抜け
else if(FastMABuffer[i] < SlowMABuffer[i] &&
FastMABuffer[i+1] >= SlowMABuffer[i+1])
{
DnArrowBuffer[i] = high[i] + ArrowDistance * Point();
}
}
}
//最後のバーは計算から除外
FastMABuffer[0] = FastMABuffer[1];
SlowMABuffer[0] = SlowMABuffer[1];
return(rates_total);
}
このコードはシンプルな移動平均線のクロスでサインを出すものです。
一行一行の意味を解説すると:
- #propertyで始まる行は、インジケーターの基本設定です。
- input int MAperiod = 20;は、移動平均の期間を設定する部分です。
- OnInit()は、インジケーター起動時の初期設定を行います。
- OnCalculate()で、実際の移動平均の計算を行います。
インジケーターを表示させる方法
作成したコードを実際に動かすには、コンパイルという作業が必要です。
画面上部のコンパイルをクリックするだけです。
エラーがなければ、「0 errors, 0 warnings」 と表示されます。
次に、MetaTraderのチャート画面に戻って、「ナビゲーター」ウィンドウを開きます。
「カスタムインジケーター」の中に、作成したインジケーターが表示されているはずです。
これをチャートにドラッグ&ドロップすれば、移動平均線が表示されます。
期間を変更したい場合は、インジケーターのプロパティから設定を変更できます。
よくあるエラーと解決方法
インジケーター作成でつまずきやすいポイントを解説します。
初めてのプログラミングでは誰もがエラーに遭遇しますが、ほとんどのエラーは簡単に解決できます。
よくあるコンパイルエラーの対処法
「セミコロンがありません」というエラーが最も多いです。
これは文末に「;(セミコロン)」を付け忘れているだけなので、付け加えれば解決します。
たとえばこんな行があったとします。
double sum = 0
これを以下のように修正します。
double sum = 0 ;
次によく見るのが「括弧の対応が正しくありません」というエラー。
プログラムでは{}
や()
の開きと閉じの数が合っていないとエラーになります。
MetaEditorでは、括弧にカーソルを合わせると対応する括弧が光るので、これを使って確認しましょう。
「変数が定義されていません」というエラーも頻出です。
これは変数名のタイプミスが原因なことがほとんど。
スペルを確認して、大文字小文字も含めて正確に直せば解決します。
表示されない場合の対処法
コンパイルは成功したのに、チャートにインジケーターが表示されない。
そんなときは以下の点を確認してみましょう。
まず、バッファの設定を見直します。
#property indicator_buffers 1
#property indicator_plots 1
この2行の数字は必ず一致させる必要があります。
次に、SetIndexBuffer
の設定を確認。
SetIndexBuffer(0, MABuffer, INDICATOR_DATA);
最初の数字(0)は、0から始まる連番になっているか確認します。
それでも表示されない場合は、計算部分を見直しましょう。
for(int i=0; i<limit; i++)
{
double sum = 0;
for(int j=0; j<MAperiod; j++)
{
sum += price[i+j];
}
MABuffer[i] = sum/MAperiod;
}
計算式に間違いがないか、特に配列の添字(i+j
の部分)を確認します。
まとめ|30分でできるMQL5インジケーター作成
MQL5でのインジケーター作成は、思ったより簡単です。
この記事で解説した手順をまとめると、
- MetaEditorをインストールして開発環境を整える
- テンプレートコードをコピー&ペースト
- 必要に応じてパラメーターを調整
- コンパイルしてチャートに表示
これだけで、オリジナルのインジケーターが作れます。
エラーが出ても、ほとんどは単純なミスが原因。
焦らずに一つずつ確認していけば、必ず解決できます。
コメントを残す