MQL5 リファレンスカスタム指標指標スタイルの例 

指標スタイルの例

MetaTrader 5 クライアント端末は適切な関数を使用して MQL5 プログラムで使用出来る 38 のテクニカル指標を含みます。しかし、MQL5 言語の主な利点は、エキスパートアドバイザーで使用するか、単に技術的な分析のために価格チャートに適用出来るカスタム指標を作成することです。

指標のセット全体はプロットとして知られるいくつかの基本的な描画スタイルから派生出来ます。プロットとは、指標が計算、保存、またリクエストに応じて提供するデータの表示の方法です。基礎的なプロットには 7 種類あります。

  1. セクション(セグメント)
  2. ヒストグラム
  3. 矢印(シンボル)
  4. 塗りつぶされた領域(チャンネル)
  5. バー
  6. 日本製のローソク足

プロットは指標値を格納する1〜 5 のdouble 型の 配列を必要とします。便宜のために、これらの配列は、指標バッファに関連しています。指標内のバッファの数は、コンパイラディレクティブを使用して事前に宣言される必要があります。例として

#property indicator_buffers 3 // バッファの数
#property indicator_plots   2 // プロットの数

指標内のバッファ数は、常に指標におけるプロットの数以上です。

それぞれの基本プロットタイプはカラーバリエーションや建設仕様を持つことが出来るので、MQL5 での実際のプロットの種類の数は18です。

Plotting

説明

値バッファ

色バッファ

DRAW_NONE

チャートには非表示ですが、対応するバッファの値は、データウィンドウに表示することが出来ます。

1

-

DRAW_LINE

線は対応するバッファの値をプロットしています(バッファ内の空の値は望ましくありません)。

1

-

DRAW_SECTION

対応するバッファの値の間の線分として描画されます(通常は空の値をたくさん持っています)。

1

-

DRAW_HISTOGRAM

対応するバッファの値にゼロラインからヒストグラムとして描画されます(空の値を有していてもよいです)。

1

-

DRAW_HISTOGRAM2

2 つの指標バッファに基づいてヒストグラムとして描画されています(空の値を有していてもよいです)。

2

-

DRAW_ARROW

シンボルとして描画されています(空の値を有していてもよいです)。

1

-

DRAW_ZIGZAG

DRAW_SECTION スタイルと似ていますが、 1 つのバーに垂直なセグメントをプロット出来ます。

2

-

DRAW_FILLING

日本製の線の間を塗りつぶします。対応する 2 つのバッファの値は、データウィンドウに表示されます。

2

-

DRAW_BARS

バーとして描画されます。対応する4つのバッファの値は、データウィンドウに表示されます。

4

-

DRAW_CANDLES

日本製のローソク足として描画されます。対応する4つのバッファの値は、データウィンドウに表示されます。

4

-

DRAW_COLOR_LINE

それぞれのバーに違う色を利用したり、任意の時点で色を変更出来ます。

1

1

DRAW_COLOR_SECTION

DRAW_SECTION スタイルと似ていますが、セクションの色はそれぞれ設定でき、動的に設定することも出来ます。

1

1

DRAW_COLOR_HISTOGRAM

DRAW_HISTOGRAM スタイルと似ていますが、ストリップの色はそれぞれ設定でき、動的に設定することも出来ます。

1

1

DRAW_COLOR_HISTOGRAM2

DRAW_HISTOGRAM2 スタイルと似ていますが、ストリップの色はそれぞれ設定でき、動的に設定することも出来ます。

2

1

DRAW_COLOR_ARROW

DRAW_ARROW スタイルと似ていますが、各シンボルの色をそれぞれ設定出来ます色は動的に設定することが出来ます。

1

1

DRAW_COLOR_ZIGZAG

セクションの個別な色の選択と動的な色の設定が可能なDRAW_ZIGZAG スタイル。

2

1

DRAW_COLOR_BARS

バーの個別な色の選択と動的な色の設定が可能な DRAW_BARS スタイル。

4

1

DRAW_COLOR_CANDLES

ローソク足の個別な色の選択と動的な色の設定が可能な DRAW_CANDLES スタイル。

4

1

 

指標バッファと配列の違い

指標のグローバルレベルでは double 型の配列を宣言し、SetIndexBuffer() 関数を使用して指標バッファとして使用するべきです。指標プロットを描画するには、指標バッファの値のみが使用可能で一般の配列は使用出来ません。加えて、バッファ値はデータウィンドウに表示されます。

指標バッファは動的サイズの指定を必要としません。指標バッファとして使用される配列のサイズは、自動的に端末の実行サブシステムによって設定されます。

配列が指標バッファと関係づけられた後、索引付けの方向がデフォルトでは通常の配列の様に設定されますが ArraySetAsSeries() 関数を使用して配列要素のアクセス方法を変更することが出来ます。デフォルトでは、指標バッファはプロットに使用されるデータ(INDICATOR_DATA)を格納します。

指標値の計算に中間計算の保持が必要、また各足に追加の値を格納する必要がある場合は、指標バッファは結合時に計算用バッファとして宣言することが出来ます(INDICATOR_CALCULATIONS)。中間値には普通の配列も使用することが出来ますが、この場合には、プログラマは、配列のサイズを管理しなければなりません。

プロットによっては、各足の色を個別に設定することが可能です。色に関する情報を格納するには、カラーバッファが使用されます(INDICATOR_COLOR_INDEX)。色は整数型の color ですが、指標バッファは double 型でなければなりません。色及び補助(INDICATOR_CALCULATIONS)バッファの値は CopyBuffer() で得ることが出来ません。

指標バッファの数はコンパイラディレクティブ #property indicator_buffers バッファ数 で指定されなければなりません。

#property indicator_buffers 3 //  指標には 3 つのバッファがある

1 つの指標のバッファの最大許容数は 512 です。

 

指標バッファとプロットの関連性

各プロットは、1つ以上の指標バッファに基づいています。単純なローソク足を表示するためには、始値、高値、安値、終値の 4 つの値が必要とされています。従って、指標をローソク足として表示するには、4 つの指標バッファとそのための 4 つの double 型の配列を宣言することが必要です。例えば、

//--- 指標は4つの指標のバッファを持つ
#property indicator_buffers 4
//--- 指標に 1 つのプロットがある
#property indicator_plots   1
//--- グラフィックプロット 1 はローソク足
#property indicator_type1   DRAW_CANDLES
//--- ローソク足が clrDodgerBlue に描画される
#property indicator_color1 clrDodgerBlue
//--- 指標バッファに使用される 4 つの配列
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

 

グラフィックプロットは自動的にプロット数に応じて指標バッファを使用します。プロット番号は1から始まり、バッファ番号はゼロから始まります。最初のプロットが 4 つの指標バッファを必要とする場合、最初の 4 つの指標バッファはそれを描画するために使用されます。これらの 4 つのバッファは、SetIndexBuffer() 関数を使用して、正しいインデックス作成と適切な配列と関連付けられる必要があります。

//--- 配列と指標バッファを関連付ける
  SetIndexBuffer(0,OBuffer,INDICATOR_DATA); // インデックス0にあたる1 番目のバッファ
  SetIndexBuffer(1,HBuffer,INDICATOR_DATA); // インデックス1にあたる2 番目のバッファ
  SetIndexBuffer(2,LBuffer,INDICATOR_DATA); // インデックス2にあたる3 番目のバッファ
  SetIndexBuffer(3,CBuffer,INDICATOR_DATA); // インデックス3にあたる4 番目のバッファ

「ローソク足」のプロットは、最初の番号の下で発表されたため、指標は、単に最初の 4 つのバッファを使用します。

例を変えて、簡単な線のプロットを加えましょう(DRAW_LINE)。仮に、線が 1 と番号付けされて、ローソク足が 2 だとします。バッファ数とプロット数が増加しました。

//--- 指標は 5 つの指標のバッファを持つ
#property indicator_buffers 5
//--- 指標に 2 つのプロットがある
#property indicator_plots   2
//--- プロット1は線
#property indicator_type1   DRAW_LINE
//--- 線の色は clrDodgerRed
#property indicator_color1 clrDodgerRed
//--- プロット 2 は日本製のローソク足
#property indicator_type2   DRAW_CANDLES
//--- ローソク足の色は clrDodgerBlue
#property indicator_color2 clrDodgerBlue
//--- 指標バッファである 5 つの配列
double LineBuffer[];
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

プロットの順序が変更され、線が初めで日本製のローソク足が続きます。そのため、バッファの順序は適切です。線のためバッファをゼロインデックスで宣言し、ローソク足のための 4 つのバッファを宣言します。

  SetIndexBuffer(0,LineBuffer,INDICATOR_DATA); // インデックス0にあたる1 番目のバッファ
//--- ローソク足のために配列と指標バッファを関連付ける
  SetIndexBuffer(1,OBuffer,INDICATOR_DATA);     // インデックス1にあたる2 番目のバッファ
  SetIndexBuffer(2,HBuffer,INDICATOR_DATA);     // インデックス2にあたる3 番目のバッファ
  SetIndexBuffer(3,LBuffer,INDICATOR_DATA);     // インデックス3にあたる4 番目のバッファ
  SetIndexBuffer(4,CBuffer,INDICATOR_DATA);     // インデックス4にあたる5 番目のバッファ

 

バッファ数とプロット数はコンパイラディレクティブを使用してのみ設定することができ、これらのプロパティを関数で動的に変更することは不可能です。

 

スタイルのカラーバージョン

表から分かるように、スタイルは、2 つのグループに分割されます。最初のグループでは、名称に COLOR が付きません。これらは基本スタイルと呼ばれます。

  • DRAW_LINE
  • DRAW_SECTION
  • DRAW_HISTOGRAM
  • DRAW_HISTOGRAM2
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_FILLING
  • DRAW_BARS
  • DRAW_CANDLES

2 つ目のグループでは、名称に COLOR が付きます。これらを、カラーバージョンと呼びます。

  • DRAW_COLOR_LINE
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_HISTOGRAM
  • DRAW_COLOR_HISTOGRAM2
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG
  • DRAW_COLOR_BARS
  • DRAW_COLOR_CANDLES

スタイルのカラーバージョンは、プロットの各部分の色の指定を可能にし、基本スタイルとは異なります。プロットの最小部分はバーなので、カラーバージョンは、各足の色の設定を可能にすると言うことが出来ます。

例外はカラーバージョンを持たない DRAW_NONE 及び DRAW_FILLING スタイルです。

各足のプロットの色を設定するために、カラーバージョンに、カラーインデックスを格納するためのバッファが追加されました。これらのインデックスは、前もって定義された色のセットが含まれている特殊な配列内の色番号を示します。色の配列のサイズは64です。これはスタイルの各カラーバージョンが64の異なる色のプロットを描画出来ることを意味します。

セットや色の特殊な配列内の色のセットと数は、コンパイラディレクティブ #property indicator_color でコンマで区切って、必要な全てのものを指定することが出来ます。指標のエントリの例として

//--- ローソク足を塗るために(特殊な配列に格納されている)8 色を定義する
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange

これは、1をプロットするために、8 色が設定され、これらが特殊な配列に配置されることを述べています。ここからはプログラムの中で、プロットの色の代わりにインデックスを指定します。バー番号 K に赤を指定されたい場合、配列での赤のインデックス値が指標のカラーバッファに設定される必要があります。赤は最初のディレクティブで指定されており、インデックス番号 0 に対応しています。

//--- ローソク足の色を clrRed に設定
 col_buffer[buffer_index]=0;

色のセットは不変ではなく、PlotIndexSetInteger() を使用して動的に変更することが出来ます。例:

    //--- 各インデックスの色をPLOT_LINE_COLOR として設定する
    PlotIndexSetInteger(0,                   //  グラフィックスタイルの番号
                        PLOT_LINE_COLOR,     //  プロパティの識別子
                         plot_color_ind,       //  色を書き込む色インデックス
                         color_array[i]);     //  新しい色

 

指標プロパティとプロット

指標のプロットでは、プロパティはコンパイラディレクティブまたは適切な関数を使用して設定出来ます。詳しくは指標プロパティと関数との関係をご参照ください。特別な関数を使用しての指標プロパティの動的な変更は、より柔軟なカスタム指標作成を可能にします。

 

チャート上での指標描画の開始

多くの例では、アルゴリズムの条件に応じて、最小限の履歴バーを提供する必要があるため、現在足のみを使用してすぐに指標値の計算を開始することは不可能です。例えば、平滑化の多くの種類は、以前の N バーの価格配列の使用を暗示し、これらの値に基づいて、現在足の指標値を算出します。

このような場合には、最初の N バーの指標値を計算する方法がないか、これらの値は計算のみに使用されるものでチャート上での表示は意図外です。履歴中の最初の N 個のバーでの指標のプロットを回避するためには、プロットのN を PLOT_DRAW_BEGIN プロパティに設定します。

//--- ローソク足のために配列と指標バッファを関連付ける
PlotIndexSetInteger(number_of_plot,PLOT_DRAW_BEGIN,N);

ここで

  • number_of_plot – ゼロから indicator_plots-1 までの値(プロット番号はゼロから始まる)
  • N - 指標がチャート上に表示されるべきではない履歴中の最初のバーの数