【サンプルコード公開】MQL5インジケータの作り方|MAクロスサインツール作成ガイド

「MQL5でオリジナルインジケーターを作りたいけど、プログラミングの知識がなくて諦めていませんか?」

「何から始めればいいのか分からない」「難しそうで手が出せない」というお悩みをよく聞きます。

実は、プログラミング未経験でも30分で簡単なインジケーターが作れるんです。

この記事では、MetaTraderでよく使う移動平均線インジケーターを例に、作り方を丁寧に解説します。

コピー&ペーストで使えるテンプレートも用意したので、手順通りに進めれば必ず作れます。

さあ、一緒にオリジナルインジケーター作りへの第一歩を踏み出しましょう。

MQL5でインジケーターを作る前の準備

MQL5でインジケーターを作るには、専用のエディタソフトが必要です。

まずは環境構築から始めていきましょう。

環境構築の手順

MetaTraderをインストールすると、MetaEditorという開発ツールも一緒に入ります。

MetaTraderのインストールはとても簡単です。

引用:MetaTrader5

まず、公式サイトにアクセスして「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でのインジケーター作成は、思ったより簡単です。

この記事で解説した手順をまとめると、

  1. MetaEditorをインストールして開発環境を整える
  2. テンプレートコードをコピー&ペースト
  3. 必要に応じてパラメーターを調整
  4. コンパイルしてチャートに表示

これだけで、オリジナルのインジケーターが作れます。

エラーが出ても、ほとんどは単純なミスが原因。

焦らずに一つずつ確認していけば、必ず解決できます。

弊さいとが独自に開発した「FXオリジナルインジケーター」を無料でプレゼント!

インターネット上に存在しないインジケーター、他では高額な金額で販売されているようなインジケーターも無料で配布する期間限定のプレゼント企画!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です