こんにちは!前回は安値に線を引くインディケータを作りましたが、今回は「移動平均線」を描画するカスタムインディケーターを作成する方法を解説します。移動平均線は、トレンドを視覚化するための基本的なテクニカル指標であり、多くのトレーダーに愛用されています。
この記事では、シンプルな移動平均線を描画するインディケーターを作成する手順を、初心者にもわかりやすく説明します。コードの変更点や動作確認方法も詳しく解説しているので、ぜひ最後まで読んでみてください!
1. 完成コード
以下が今回作成する移動平均線を描画するインディケーターの完成コードです。
mql5コピー#property indicator_chart_window // チャートウィンドウに描画
#property indicator_buffers 1 // バッファ数を1つ設定
#property indicator_color1 clrBlue // ラインの色を青に設定
double MA_Buffer[]; // 移動平均値を格納するバッファ
// パラメータ(移動平均線の期間)
input int MA_Period = 14; // 移動平均線の期間(デフォルト: 14)
// 初期化関数
int OnInit()
{
// バッファをインディケーターに登録
SetIndexBuffer(0, MA_Buffer);
// 描画タイプを線に設定
PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
// インディケーターの名前を設定
IndicatorSetString(INDICATOR_SHORTNAME, "Simple MA(" + IntegerToString(MA_Period) + ")");
return(INIT_SUCCEEDED);
}
// 計算関数
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 start = prev_calculated > 0 ? prev_calculated - 1 : 0;
// 移動平均線の計算
for (int i = start; i < rates_total; i++)
{
double sum = 0.0;
int count = 0;
// 移動平均を計算するためのループ
for (int j = i; j > i - MA_Period && j >= 0; j--)
{
sum += close[j]; // 終値を加算
count++;
}
// 平均値を計算してバッファに格納
MA_Buffer[i] = count > 0 ? sum / count : 0.0;
}
return(rates_total); // 計算されたバーの数を返す
}
2. 元のコードとの違い
今回のコードは、元の「安値(Low)」を描画するインディケーターを「移動平均線(Moving Average)」を描画するインディケーターに変更したものです。以下に変更点を詳しく解説します。
(1) バッファの変更
元のコード:
mql5コピーdouble Low_Buffer[]; // 安値を格納するバッファ
変更後:
mql5コピーdouble MA_Buffer[]; // 移動平均値を格納するバッファ
- 移動平均線の値を格納するために、
MA_Bufferという名前のバッファを定義しました。 - このバッファに移動平均線の計算結果を格納します。
(2) パラメータの追加
mql5コピーinput int MA_Period = 14; // 移動平均線の期間(デフォルト: 14)
- ユーザーが移動平均線の期間を変更できるように、
input変数を追加しました。 - デフォルト値は14に設定していますが、インディケーターのプロパティ画面から自由に変更可能です。
(3) 初期化関数の変更
元のコード:
mql5コピーIndicatorSetString(INDICATOR_SHORTNAME, "Low Line");
変更後:
mql5コピーIndicatorSetString(INDICATOR_SHORTNAME, "Simple MA(" + IntegerToString(MA_Period) + ")");
- インディケーターの名前を「Simple MA(期間)」に変更しました。
- 例えば、期間が14の場合は「Simple MA(14)」と表示されます。
(4) 計算関数の変更
元のコード:
mql5コピーfor (int i = start; i < rates_total; i++)
{
Low_Buffer[i] = low[i]; // 安値をバッファに格納
}
変更後:
mql5コピーfor (int i = start; i < rates_total; i++)
{
double sum = 0.0;
int count = 0;
// 移動平均を計算するためのループ
for (int j = i; j > i - MA_Period && j >= 0; j--)
{
sum += close[j]; // 終値を加算
count++;
}
// 平均値を計算してバッファに格納
MA_Buffer[i] = count > 0 ? sum / count : 0.0;
}
- 移動平均線を計算するためのループを追加しました。
- 現在のバー(
i)から過去のバー(i - MA_Period)までの終値を加算します。 - 加算した値をバーの数で割り、平均値を計算します。
- 計算結果を
MA_Bufferに格納します。
- 現在のバー(
3. インディケーターの動作確認
(1) コードをMetaEditorに貼り付ける
- MetaTrader 5を起動し、MetaEditorを開きます。
- 新しいインディケーターを作成し、上記のコードを貼り付けます。
(2) コンパイル
- MetaEditorの「コンパイル」ボタンをクリックして、エラーがないか確認します。
(3) チャートに適用
- MetaTrader 5のチャートを開きます。
- ナビゲーターウィンドウから作成したインディケーターをドラッグ&ドロップします。
- 必要に応じて期間(
MA_Period)を変更して、移動平均線が正しく表示されることを確認してください。
4. 結果の確認
チャート上に青い移動平均線が表示されます。この移動平均線は、指定した期間(デフォルトは14)の終値の平均を基に描画されています。
5. 次のステップ
今回作成したインディケーターは、非常にシンプルな単純移動平均(SMA)を描画するものです。次のステップとして、以下のような改良に挑戦してみてはいかがでしょうか?
(1) 移動平均線の種類を追加
- 単純移動平均(SMA)だけでなく、指数移動平均(EMA)や加重移動平均(WMA)も追加してみましょう。
(2) 複数の移動平均線を表示
- 短期移動平均線と長期移動平均線を表示し、ゴールデンクロスやデッドクロスを分析するインディケーターを作成してみましょう。
(3) ラインの色や太さを変更
- 見やすさを向上させるために、ラインの色や太さを変更するオプションを追加してみましょう。
まとめ
この記事では、MQL5を使った移動平均線を描画するカスタムインディケーターの作成方法を解説しました。移動平均線はテクニカル分析の基本であり、カスタムインディケーターを作る練習としても最適です。
最初はシンプルなものから始めて、少しずつ複雑なインディケーターに挑戦していきましょう!分からないことがあれば、ぜひコメントで質問してください。それでは、良いプログラミングライフを!😊


コメント