MQL4 お金の健康

投資でプログラミングを活用したい!チャート分析で平均足をサブウィンドウに表示した話

こんにちは、ウチダです。

投資のチャート分析って、本当にたくさんありますよね。

でも、一体どれが本当に儲かる分析法なのか悩んでいませんか?

前回の記事で平均足がおすすめであることを紹介しました。

(参考:MT4のチャートに平均足を表示するプログラムの作り方

プログラムをチャートに適用すると、ローソク足と平均足が重なって表示されます。

MT4のチャートに平均足を表示したグラフ

2つのデータが重なると見づらく感じませんか?

また、平均足は陽線と陰線だけわかれば売買プログラムに使えるので、チャートに表示する必要もありません。

そこで今回は平均足の陽線と陰線をサブウィンドウに表示するプログラムの作り方を紹介します。

平均足をチャートに表示しよう!MT4のプログラミングで分析する方法を紹介

MT4の投資チャートをプログラムで分析する

平均足とは、通常のローソク足の4本値の平均を取って”別の4本足値”を計算し、別のローソク足として表示するものです。

(参考:平均足は投資でどのように使われるの?

通常のローソク足を平滑化するので、陰線と陽線が連続しやすくなると言った特徴があります。

そのため、相場のトレンドを探るのによく使用されます。

i番目のバーでの平均足の始値(haOpen)、終値(haClose)、高値(haHigh)、安値(haLow)は次のように計算されます。

  • haOpen=1本前のバーの「haOpen」と「haClose」の平均値
  • haClose=Open[i]、High[i]、Low[i]、Close[i]の平均値
  • haHigh=High[i]、haOpen、haCloseの最大値
  • haLow=Low[i]、haOpen、haCloseの最小値

今回はhaOpenとhaCloseからなる陽線と陰線によってトレンドの把握を目的とします。

プログラムで平均足をチャートに表示する場合、カスタムインジケーターを使用します。

カスタムインジケーターとは売買をせず、主にチャート分析に使用されるプログラムです。

自動売買のシグナルとして活用したいので、サブウィンドウに平均足の陽線と陰線を表示します。

(参考:MT4の自動売買プログラムの作り方はこちら

平均足プログラム1:インジケーターの設定をしよう

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_width1 3
#property indicator_width2 3
#property indicator_minimum 0
#property indicator_maximum 1

プログラム全体に関わる設定を行います。

#property 識別子 値

#propertyは、例えばインジケーターの色や数を設定します。

#property indicator_separate_window

計算した指標をサブウィンドウに表示するように指定します。

値はありません。

#property indicator_buffers 2

表示させたい指標の数を指定します。

この場合、2個です。

陽線、陰線で表示するため、2つに設定しています。

#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_width1 3
#property indicator_width2 3

チャートに表示する指標の色と太さは#propertyで指定できます。

指標1は青色、指標2は赤色に設定しています。

太さはいずれも3に設定しています。

#property indicator_minimum 0
#property indicator_maximum 1

指標の最大値と最小値を設定します。

これによりチャートの一番下が0、一番上が1と固定されます。

平均足プログラム2:指標バッファを設定しよう

//指標バッファ
double BufUp[];
double BufDown[];

BufUp[]、BufDown[]に指標の値を計算させるため、変数という”箱”を用意します。

BufUp[]の[]は具体的な配列のサイズを指定していません。

チャート上では過去に何個のデータがあるか分からず、時間が経てばデータが次々に増えていきます。

つまり、あらかじめ配列のサイズが決められないためです。

平均足プログラム3:インジケーターの初期設定を用意しよう

//初期化関数
int init()
{
    //指標バッファの割当
    SetIndexBuffer(0, BufUp);
    SetIndexBuffer(1, BufDown);

    //指標ラベルの設定
    SetIndexLabel(0, "Up");
    SetIndexLabel(1, "Down");

    //指標スタイルの設定
    SetIndexStyle(0, DRAW_HISTOGRAM);
    SetIndexStyle(1, DRAW_HISTOGRAM);

    return(0);

}

int init(){コード}は、インジケーターを稼働させたときの初期設定をします。

{コード}が初期設定の内容になります。

//指標バッファの割当
SetIndexBuffer(0, BufUp);
SetIndexBuffer(1, BufDown);

BufUpとBufDownは計算結果を入れる箱ですが、このままでは指標としてチャートに表示されません。

指標をチャートに表示させるためにはSetIndexBuffer()を使います。

指標は0番目から割り当てます。

//指標ラベルの設定
SetIndexLabel(0, "Up");
SetIndexLabel(1, "Down");

データウィンドウにインジケーターの説明を表示させるために使用します。

今回は指標0にBufUpを割り当て、Upと表示させます。

指標1はBufDownを割り当て、Downと表示させます。

//指標スタイルの設定
SetIndexStyle(0, DRAW_HISTOGRAM);
SetIndexStyle(1, DRAW_HISTOGRAM);

インジケーターの描画スタイル(線orヒストグラム、色など)を指定するために使用します。

DRAW_HISTOGRAMはヒストグラムを描画することを指定します。

ヒストグラムの色と太さはindicator_color、indicator_widthで設定済です。

最後にreturn(0);があります。

関数initはint型(整数)であるため、戻り値には整数が必要です。

そこで0を戻り値に入れています。

平均足プログラム4:平均足を計算しよう

//スタート関数
int start()
{
    int limit = Bars - IndicatorCounted();

    for(int i=limit - 1; i>=0; i--)
    {
        double valOpen = iCustom(NULL, 0, "heikinashi_blog", 0, i);
        double valClose = iCustom(NULL, 0, "heikinashi_blog", 1, i);

        BufUp[i] = 0;
        BufDown[i] = 0;

        if(valClose > valOpen) BufUp[i] = 1;
        else if(valClose < valOpen) BufDown[i] = 1;
    }

    return(0);

}

int start(){コード}で、ティックが動くたびに{コード}が動きます。

これがないと最初の単発でプログラムが止まってしまいます。

継続してプログラムを動かすには、start()が必要です。

Barsは、「チャートウィンドウ」に表示されているバーの本数を格納しているint型の変数です。

IndicatorCounted()は過去の変化しなかったバーの数を返します。

つまりBars-IndicatorCounted()は最新のティックの数を計算します。

インジケーターを稼働させると、最初はIndicatorCounted()=0なので、limit=Barsになります。

なので最初はBarsの数だけ指標を計算します。

2回目(ティックが更新された後)はlimit = Bars - IndicatorCounted()=1になります。

i=limit-1=1-1=0のため、for内のコードはティックが更新されるたびに1回ずつ動作します。

valOpen、valCloseは前回の記事で作成したhaOpen、haCloseを引用しています。

(参考:MT4で平均足を表示するプログラムを作る方法)

iCustom()関数は、ユーザーが独自に作成したインジケーター(=カスタムインジケーター)の値を取得するために使用します。

double iCustom(
    string symbol, //通貨ペア名。指定しないのでNULL
     int timeframe, //カスタムインジケーターの値を計算する時間軸。指定しないので0にする
    string name, //カスタムインジケーターの名前
    …, //カスタムインジケーターのパラメーターを指定
    int shift //カスタムインジケーターの値を取得したいバーの位置を指定
    );

前回の記事でカスタムインジケーターの名前は"heikinashi_blog"にしていたので、"heikinashi_blog"をコードに入れています。

インジケーター名は、「”」(=ダブルクォーテーション)で囲んで、MQL4>Indicatorsフォルダに格納されている、値を取得したいカスタムインジケーター名のとおりに記述します。

パラメータは、0がhaOpen、1がhaCloseに対応します。

あとはvalOpen、valCloseの関係で陽線と陰線を作成します。

  • 始値より終値が大きい時は陽線とし、BufUpに1を入れます。
  • 始値より終値が小さい時は陰線とし、BufDownに1を入れます。

最後にstart()はint(整数)型なので、return(0)で戻り値を0にします。

これで平均足をサブウィンドウに表示するインジケーターができました。

最後にチャートに適用しましょう。

平均足プログラムを適用するとトレンドが見やすい!

作成したプログラムを適用するとこのようになります。

MT4のサブウィンドウに平均足を表示するプログラムの結果

平均足の陽線が青色、陰線が赤色で表示されます。

連続したトレンドが見やすくなったと感じませんか?

あとはBufUpとBufDownの大小関係で注文方法を変えるプログラムを作れば、自動売買もできそうです。

今回のプログラムはこちらの書籍を参考にしました。

セットもあります。

ネットは1つのコードを調べるのに便利ですが、まとまった理論などは本のほうが勉強しやすいですね。

ここまで読んでくださりありがとうございました!

-MQL4, お金の健康
-,