今回は、MQL5を使ってゴールデンクロスとデッドクロスを検出し、それをチャート上に表示するカスタムインディケーターを作成します。このインディケーターは、短期移動平均線と長期移動平均線の交差を基に、買いシグナル(ゴールデンクロス)と売りシグナル(デッドクロス)を矢印で表示します。
ゴールデンクロスとデッドクロスとは?
ゴールデンクロスとデッドクロスは、テクニカル分析でよく使われる売買シグナルの一つです。
- ゴールデンクロス:短期移動平均線が長期移動平均線を下から上に突き抜けたときに発生します。これは、上昇トレンドの始まりの可能性を示し、買いシグナルとして解釈されます。
- デッドクロス:短期移動平均線が長期移動平均線を上から下に突き抜けたときに発生します。これは、下降トレンドの始まりの可能性を示し、売りシグナルとして解釈されます。
これらのシグナルを視覚的にわかりやすくするために、チャート上に矢印を表示するインディケーターを作成します。
全ソースコード
以下が、今回作成するインディケーターの完全なソースコードです。MetaEditorにコピーして実行してみてください。
mql5コピー//+------------------------------------------------------------------+
//| インディケーターの設定 |
//+------------------------------------------------------------------+
#property indicator_chart_window // チャートウィンドウに描画
#property indicator_buffers 4 // 使用するバッファ数(短期MA、長期MA、買いシグナル、売りシグナル)
#property indicator_plots 4 // 描画するプロット数(線2本+矢印2つ)
// 短期移動平均線の設定
#property indicator_label1 "ShortMA" // ラベル名
#property indicator_type1 DRAW_LINE // 線として描画
#property indicator_color1 clrBlue // 色は青
// 長期移動平均線の設定
#property indicator_label2 "LongMA" // ラベル名
#property indicator_type2 DRAW_LINE // 線として描画
#property indicator_color2 clrRed // 色は赤
// 買いシグナル(ゴールデンクロス)の設定
#property indicator_label3 "BuySignal" // 買いシグナルのラベル名
#property indicator_type3 DRAW_ARROW // 矢印として描画
#property indicator_color3 clrGreen // 色は緑
// 売りシグナル(デッドクロス)の設定
#property indicator_label4 "SellSignal" // 売りシグナルのラベル名
#property indicator_type4 DRAW_ARROW // 矢印として描画
#property indicator_color4 clrOrange // 色は橙
//--- 入力パラメータ
input int short_ma_period = 10; // 短期移動平均線の期間
input int long_ma_period = 30; // 長期移動平均線の期間
input ENUM_MA_METHOD ma_method = MODE_SMA; // 移動平均の種類
input ENUM_APPLIED_PRICE applied_price = PRICE_CLOSE; // 使用する価格
//--- インディケーターバッファ
double ShortMABuffer[]; // 短期移動平均線
double LongMABuffer[]; // 長期移動平均線
double BuySignalBuffer[]; // 買いシグナル(ゴールデンクロス)
double SellSignalBuffer[]; // 売りシグナル(デッドクロス)
int short_ma_handle; // 短期移動平均線のハンドル
int long_ma_handle; // 長期移動平均線のハンドル
//+------------------------------------------------------------------+
//| 初期化関数 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- バッファを登録
SetIndexBuffer(0, ShortMABuffer, INDICATOR_DATA); // 短期移動平均線用バッファ
SetIndexBuffer(1, LongMABuffer, INDICATOR_DATA); // 長期移動平均線用バッファ
SetIndexBuffer(2, BuySignalBuffer, INDICATOR_DATA); // 買いシグナル用バッファ
SetIndexBuffer(3, SellSignalBuffer, INDICATOR_DATA); // 売りシグナル用バッファ
// 買いシグナルの矢印設定(上向き矢印: コード233)
PlotIndexSetInteger(2, PLOT_ARROW, 233);
PlotIndexSetInteger(2, PLOT_ARROW_SHIFT, 6); // 矢印の位置を少しずらす
// 売りシグナルの矢印設定(下向き矢印: コード234)
PlotIndexSetInteger(3, PLOT_ARROW, 234);
PlotIndexSetInteger(3, PLOT_ARROW_SHIFT, -6); // 矢印の位置を少しずらす
//--- 移動平均線のハンドルを作成
short_ma_handle = iMA(_Symbol, PERIOD_CURRENT, short_ma_period, 0, ma_method, applied_price); // 短期移動平均線
long_ma_handle = iMA(_Symbol, PERIOD_CURRENT, long_ma_period, 0, ma_method, applied_price); // 長期移動平均線
// ハンドル作成に失敗した場合
if (short_ma_handle == INVALID_HANDLE || long_ma_handle == INVALID_HANDLE)
{
Print("Failed to create MA handles, error: ", GetLastError()); // エラーメッセージを表示
return(INIT_FAILED); // 初期化失敗
}
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[]) // スプレッド配列
{
//--- 移動平均線のデータを取得
if (CopyBuffer(short_ma_handle, 0, 0, rates_total, ShortMABuffer) < 0 || // 短期移動平均線データをコピー
CopyBuffer(long_ma_handle, 0, 0, rates_total, LongMABuffer) < 0) // 長期移動平均線データをコピー
{
Print("Failed to copy data from MA handles, error: ", GetLastError()); // エラー表示
return(0); // 計算を中止
}
//--- ゴールデンクロス・デッドクロスの検出
for (int i = MathMax(prev_calculated - 1, 1); i < rates_total; i++) // 前回計算済みバー以降を計算
{
// 前のバーの短期・長期移動平均値
double prev_short_ma = ShortMABuffer[i - 1]; // 短期移動平均(前のバー)
double prev_long_ma = LongMABuffer[i - 1]; // 長期移動平均(前のバー)
// 現在のバーの短期・長期移動平均値
double curr_short_ma = ShortMABuffer[i]; // 短期移動平均(現在のバー)
double curr_long_ma = LongMABuffer[i]; // 長期移動平均(現在のバー)
// ゴールデンクロス(買いシグナル)
if (prev_short_ma <= prev_long_ma && curr_short_ma > curr_long_ma)
{
BuySignalBuffer[i] = close[i];
SellSignalBuffer[i] = EMPTY_VALUE; // 売りシグナルは非表示
}
// デッドクロス(売りシグナル)
else if (prev_short_ma >= prev_long_ma && curr_short_ma < curr_long_ma)
{
SellSignalBuffer[i] = close[i];
BuySignalBuffer[i] = EMPTY_VALUE; // 買いシグナルは非表示
}
else
{
// どちらでもない場合、シグナルを非表示にする
BuySignalBuffer[i] = EMPTY_VALUE;
SellSignalBuffer[i] = EMPTY_VALUE;
}
}
return(rates_total); // 計算したバー数を返す
}
//+------------------------------------------------------------------+
//| 終了関数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) // 終了時に呼ばれる関数
{
//--- ハンドルを解放
if (short_ma_handle != INVALID_HANDLE)
IndicatorRelease(short_ma_handle); // 短期移動平均線のハンドルを解放
if (long_ma_handle != INVALID_HANDLE)
IndicatorRelease(long_ma_handle); // 長期移動平均線のハンドルを解放
}
コードの解説
1. プロパティの設定
- インディケーターをチャートウィンドウに描画し、短期移動平均線、長期移動平均線、買いシグナル、売りシグナルの4つのバッファを定義しています。
- 矢印の色や種類もここで設定しています。
2. 初期化関数(OnInit)
- 短期・長期移動平均線の計算を行うためのハンドルを作成し、データを格納するバッファを登録します。
- 矢印の位置や種類を調整しています。
3. 計算関数(OnCalculate)
- 各バーごとに短期移動平均線と長期移動平均線を比較し、ゴールデンクロスとデッドクロスを検出します。
- ゴールデンクロスの場合は緑の矢印を、デッドクロスの場合は橙の矢印を表示します。
4. 終了関数(OnDeinit)
- インディケーター終了時に、使用していたハンドルを解放します。
実行結果
このインディケーターをチャートに適用すると、以下のように表示されます:
- 青色の短期移動平均線と赤色の長期移動平均線が表示されます。
- ゴールデンクロスが発生した場合、緑色の矢印が表示されます。
- デッドクロスが発生した場合、橙色の矢印が表示されます。
まとめ
今回作成したインディケーターは、移動平均線を用いた基本的な売買シグナルを視覚的にわかりやすく表示するものです。このコードを基に、移動平均線の種類や期間を変更したり、他のテクニカル指標と組み合わせたりして、自分だけのインディケーターを作成してみてください!
Happy Coding! 😊

コメント