【MQL4】MT4チャートに「矢印」を表示するプログラミングコード

前回は、「アラート」「サウンド」「メール」による通知をご紹介しました。

常時チャートを監視できない場合に、音声やメッセージ、Eメールでチャンスを通知するためでした。

では、常時チャートを監視できれば、チャンスでの通知は不要かというと、

実はそうでもありません。

チャートを監視していても、「アラート」「サウンド」による通知は使いますし、

できれば、チャンスのポイントが一目で分かるように、チャートに「矢印」が表示されると、さらに良いですよね。

今回は、チャートに表示する「矢印」をプログラミングする方法をご紹介します。

スポンサーリンク

MT4のインジケーターバッファを使った方法

「矢印」を表示する方法は「バッファ」を使う方法と、「オブジェクト」を使う方法があります。

今回は「バッファ」を使った方法をご紹介します。

インジケーターバッファの定義

↑↓の上下矢印を使用するため、インジケーターバッファを2つ用意します。

コード例)

//インジケーターバッファ数
#property indicator_buffers 2

//バッファ用配列
double buf_UpArrow[], buf_DownArrow[];

矢印インジケーターの定義

初期処理「OnInit関数」で、インジケーターバッファを矢印として定義します。

コード例)

int OnInit()
{


    //使用するバッファ数
    IndicatorBuffers(2);

    //バッファに、配列割り当て
    SetIndexBuffer(0, buf_UpArrow);
    SetIndexBuffer(1, buf_DownArrow);

    //スタイル
    //DRAW_ARROW(記号)、STYLE_SOLID(実線)、サイズ、色
    SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 1, clrRed);
    SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 1, clrBlue);

    //サインの種類
    SetIndexArrow(0, 233); //↑矢印
    SetIndexArrow(1, 234); //↓矢印

    //ラベル
    SetIndexLabel(0,"BUYサイン");
    SetIndexLabel(1,"SELLサイン");


    return(INIT_SUCCEEDED);
}

「矢印」を定義する流れを覚えてましょう。

1.インジケーターバッファの数を定義
  #property indicator_buffers

2.インジケーターバッファに割り当てる配列を定義
  double型の配列

3.使用するバッファ数
  IndicatorBuffers

4.バッファに、配列割り当て
  SetIndexBuffer

5.インジケーターの表示スタイルをセット
  SetIndexStyle

6.表示するサイン「矢印」をセット
  SetIndexArrow

7.ラベルを設定
  SetIndexLabel

エントリー条件を満たしたら「矢印」を表示する

今回は、インジケーターとして作成し、

MAの「ゴールデンクロス」「デッドクロス」で、「矢印」を表示する。

を例に説明します。

コード例)

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 limit = rates_total - prev_calculated;

    // 初回の配列添え字対策
    if( prev_calculated == 0 ) limit--;

    //過去から更新
    for (int i = limit; i >= 0; i-- ) {

            // MA20
            double sma20   = ima(null, 0, 20, 0, mode_sma, price_close, i);
            double sma20_1 = ima(null, 0, 20, 0, mode_sma, price_close, i+1);
            // MA50
            double sma50   = ima(null, 0, 50, 0, mode_sma, price_close, i);
            double sma50_1 = ima(null, 0, 50, 0, mode_sma, price_close, i+1);

            //MAゴールデンクロス
            if( sma20_1 < sma50_1 && sma20 >= sma50){

                //ローソク足の20point下に「↑矢印」
                buf_UpArrow[i] = iLow(NULL,0,i) - (20*Point);

            }

            //MAデッドクロス
            if( sma20_1 > sma50_1 && sma20 <= sma50){

                //ローソク足の20point上に「↓矢印」
                buf_DownArrow[i] = iHigh(NULL,0,i) + (20*Point);

            }
        }

    }

    return(rates_total);
}

「初回起動時の配列の添え字対策」

チャートにローソク足100本表示される場合、

ローソク足100本目 = 配列[99]

となります。

初回起動時の「limit = 100」を「limit = 99」にするため、「limit–」します。

「矢印の表示位置」

ローソク足に重ならないように、ローソク足の20point上、下に矢印を表示してます。

iLow(NULL,0,i) – (20*Point);
iHigh(NULL,0,i) + (20*Point);

ちなみに、今回のコードでは「矢印」リペイントします。

リペイントさせたくない場合は、ローソク足の確定時のみ「矢印」を表示する必要があります。

確定時のみ表示する方法は、

・「ima」を「i+1」「i+2」で判定するか

・「limit」が「1」のときに処理するか

で対応できます。

チャート上に「矢印」を表示して、エントリーチャンスを逃さないようにしましょう。

「オブジェクト」による矢印表示は、また機会があれば、ご紹介させて頂きます。

タイトルとURLをコピーしました