カスタム指標

指標スタイルの例

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 – 指標がチャート上に表示されるべきではない履歴中の最初のバーの数

 

指標プロパティと対応した関数との関係

カスタム指標にはたくさんのプロパティがあります。そのうちのいくつかは必須で、常に記述の先頭に配置されます。下記が必須プロパティです。

  • 指標プロットに使用されるウィンドウの表示 – indicator_separate_window または indicator_chart_window
  • 指標バッファの数 – indicator_buffers
  • 指標のプロット数 – indicator_plots

プリプロセッサ ディレクティブとカスタム指標作成に意図された関数を通じて設定出来るプロパティもあります。これらのプロパティと対応する機能を以下の表に記載されています。

指標サブウィンドウのプロパティに関する指令

IndicatorSet…() 型の関数

調整されたサブウィンドウプロパティの説明

indicator_height

IndicatorSetInteger(INDICATOR_INDICATOR_HEIGHT, nHeight)

サブウィンドウの高さの固定値

indicator_minimum

IndicatorSetDouble(INDICATOR_MINIMUM, dMaxValue)

縦軸の最小値

indicator_maximum

IndicatorSetDouble(INDICATOR_MAXIMUM, dMinValue)

縦軸の最大値

indicator_levelN

IndicatorSetDouble(INDICATOR_LEVELVALUE, N-1, nLevelValue)

N レベルの縦軸の値

プリプロセッサディレクティブなし

IndicatorSetString(INDICATOR_LEVELTEXT, N-1, sLevelName)

表示されたレベルの名称

indicator_levelcolor

IndicatorSetInteger(INDICATOR_LEVELCOLOR, N-1, nLevelColor)

N レベルの色

indicator_levelwidth

IndicatorSetInteger(INDICATOR_LEVELWIDTH, N-1, nLevelWidth)

N レベルの線の幅

indicator_levelstyle

IndicatorSetInteger(INDICATOR_LEVELSTYLE, N-1, nLevelStyle)

N レベルの線のスタイル

プロットプロパティに関する指令

PlotIndexSet…() 型の関数

調整されたプロットプロパティの説明

indicator_labelN

PlotIndexSetString(N-1,PLOT_LABEL,sLabel)

N 番目のプロットの短縮名(データウィンドウ、及び、マウスカーソルのホーバー時にポップアップツールヒントで表示)

indicator_colorN

PlotIndexSetInteger(N-1, PLOT_LINE_COLOR, nColor)

N 番目のプロットの線の色

indicator_styleN

PlotIndexSetInteger(N-1, PLOT_LINE_STYLE, nType)

N 番目のプロットの線のスタイル

indicator_typeN

PlotIndexSetInteger(N-1, PLOT_DRAW_TYPE, nType)

N 番目のプロットの線の種類

indicator_widthN

PlotIndexSetInteger(N-1, PLOT_LINE_WIDTH, nWidth)

N 番目のプロットの線の幅

指標の共通プロパティ

IndicatorSet…() 型の関数

説明

プリプロセッサディレクティブなし

IndicatorSetString(INDICATOR_SHORTNAME, sShortName)

端末でCtrl+Iを押すことによって表示される指標リストでの指標の短縮名を設定します。

プリプロセッサディレクティブなし

IndicatorSetInteger(INDICATOR_DIGITS, nDigits)

小数の桁数として、指標値の表示に必要な精度を設定します。

プリプロセッサディレクティブなし

IndicatorSetInteger(INDICATOR_LEVELS, nLevels)

指標ウィンドウのレベルの数を設定します。

indicator_applied_price

このプロパティはプリプロセッサディレクティブのみで設定可能で関数はありません。

指標計算に使用されるデフォルトの価格型。OnCalculate() の1 番目の種類が使用された時のみ、必要に応じて指定されます。

プロパティ値は指標プロパティダイアログの「パラメータ」タブの「適用価格」で設定します。

プリプロセッサではレベルやプロットの番号付けが1から始まる一方、関数で同じプロパティを使用する場合番号付けが0から始まることには留意されるべきです。

対応する関数のないディレクティブはいくつかあります。

ディレクティブ

説明

indicator_chart_window

メインウィンドウでの指標の表示

indicator_separate_window

別のサブウィンドウでの指標の表示

indicator_buffers

必要な指標バッファの数

indicator_plots

指標でのプロットの数

SetIndexBuffer

この関数は、指定された指標バッファとdouble 型の1次元動的配列を関連付けます。

bool  SetIndexBuffer(
int                    index,        // バッファインデックス
double                buffer[],      // 配列
ENUM_INDEXBUFFER_TYPE  data_type      // 格納されるもの
);

パラメータ

index

[in] 指標バッファの数番号付けは0から始まります。数は #property indicator_buffers で宣言された数より少なければなりません。

buffer[]

[in]  カスタム指標プログラムで宣言された配列

data_type

[in] 指標配列に格納されたデータの型。デフォルトでは INDICATOR_DATA(カスタム指標値)。値は INDICATOR_COLOR_INDEX でも可能で、その場合、このバッファは前の指標バッファのカラーインデックスを格納します。#property indicator_colorN 行では 64 までの色の指定が可能です。 INDICATOR_CALCULATIONS 値はバッファが指標の中間計算に使用されて、描画の意図外であることを示します。

戻り値

成功の場合 true、それ以外の場合は false

注意事項

結合後、buffer[] 動的配列は、結合された配列が時系列式のインデックスを持っていても、通常の配列のように索引付けされます。指標配列の要素アクセスの順序を変えたい場合は、SetIndexBuffer() 関数で配列が結合された後でArraySetAsSeries() 関数を使用します。 指標バッファをして使用されている動的配列のサイズは SetIndexBuffer() 関数では変更出来ないのでご注意下さい。指標バッファサイズ変更の操作は、全て端末の実行サブシステムによって実行されます。

例:

//+——————————————————————+
//|                                              TestCopyBuffer1.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “2009, MetaQuotes Software Corp.”
#property link     “https://www.mql5.com”
#property version   “1.00”

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//—- MA をプロットする
#property indicator_label1 “MA”
#property indicator_type1   DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 入力パラメータ
input bool               AsSeries=true;
input int               period=15;
input ENUM_MA_METHOD     smootMode=MODE_EMA;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
input int                shift=0;
//— 指標バッファ
double                   MABuffer[];
int                      ma_handle;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 指標バッファマッピング
if(AsSeries) ArraySetAsSeries(MABuffer,true);
Print(“Indicator buffer is timeseries = “,ArrayGetAsSeries(MABuffer));
SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
Print(“Indicator buffer after SetIndexBuffer() is timeseries = “,
ArrayGetAsSeries(MABuffer));

//— 指標バッファの要素アクセスの順番を変更する
ArraySetAsSeries(MABuffer,AsSeries);

IndicatorSetString(INDICATOR_SHORTNAME,“MA(“+period+“)”+AsSeries);
//—
ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
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[])
{
//— 移動平均値を MABuffer バッファに複製する
int copied=CopyBuffer(ma_handle,0,0,rates_total,MABuffer);

Print(“MABuffer[0] = “,MABuffer[0]);// AsSeries の値による
// ものすごく古い値を受け取る
// または現在の未完成のバー

//— 次の呼び出しのために prev_calculated の値を返す
return(rates_total);
}
//+——————————————————————+

参照

カスタム指標プロパティ、時系列と指標へのアクセス

 

 

IndicatorSetDouble

この関数は、対応する指標プロパティの値を設定します。指標プロパティは double 型でなければなりません。この関数には 2 つのバージョンがあります。

プロパティ識別子との呼び出し

bool  IndicatorSetDouble(
int    prop_id,          // 識別子
double  prop_value        // 設定する値
);

プロパティ識別子と修飾子との呼び出し

bool  IndicatorSetDouble(
int    prop_id,          // 識別子
int    prop_modifier,    // 修飾子
double  prop_value        // 設定する値

パラメータ

prop_id

[in]  指標プロパティの識別子。値は ENUM_CUSTOMIND_PROPERTY_DOUBLE 列挙のいずれかです。

prop_modifier

[in]  指定されたプロパティの修飾子。修飾子はレベルプロパティのみで必要です。レベルの番号付けは0から始まります。なので、レベル2のプロパティを設定するには1を指定する必要があります(コンパイラディレクティブ使用時より 1 つ下)。

prop_value

[in]  プロパティ値

戻り値

実行成功の場合は true、それ以外の場合は false

注意事項

#property ディレクティブの使用時にはプロパティ( 修飾子)の番号付けは1から始まる一方、関数では番号付けが0から始まります。レベル番号が正しく設定されていない場合、指標の表示目的のものと異なる場合があります。

例えば、別々のサブウィンドウでの指標の最初のレベル値は、次の 2 つの方法で設定出来ます。

  • property indicator_level1  50 – レベル番号は1で指定
  • IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, 50) – レベル1を指定するのに 0 を使用

例: 指標ウィンドウの最大値と最小値及び水平線が配置されているレベル値を逆転する指標

IndicatorSetDouble() 関数の使用例

#property indicator_separate_window
//— 指標ウィンドウの最大値と最小値を設定
#property indicator_minimum  0
#property indicator_maximum  100
//— 3 つの水平レベルを別々の指標ウィンドウに表示
#property indicator_level1 25
#property indicator_level2 50
#property indicator_level3 75
//— 水平レベルの厚さを設定
#property indicator_levelwidth 1
//— 水平レベルのスタイルを設定
#property indicator_levelstyle STYLE_DOT
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 水平レベルの記述を設定
IndicatorSetString(INDICATOR_LEVELTEXT,0,“First Level (index 0)”);
IndicatorSetString(INDICATOR_LEVELTEXT,1,“Second Level (index 1)”);
IndicatorSetString(INDICATOR_LEVELTEXT,2,“Third Level (index 2)”);
//— 指標の短縮名を設定
IndicatorSetString(INDICATOR_SHORTNAME,“IndicatorSetDouble() Demo”);
//— それぞれのレベルの色を設定
IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrBlue);
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrGreen);
IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrRed);
//—
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[])
{
static int tick_counter=0;
static double level1=25,level2=50,level3=75;
static double max=100,min=0, shift=100;
//— ティックを計算
tick_counter++;
//— 10ティックごとにレベルを逆転する
if(tick_counter%10==0)
{
//— レベル値の符号を反転する
level1=-level1;
level2=-level2;
level3=-level3;
//— 最大値と最小値の符号を反転する
max-=shift;
min-=shift;
//— シフト値を反転
shift=-shift;
//— 新しいレベル値を設定
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,level1);
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,level2);
IndicatorSetDouble(INDICATOR_LEVELVALUE,2,level3);
//— 指標ウィンドウの新しい最大値と最小値を設定
Print(“Set up max = “,max,“,   min = “,min);
IndicatorSetDouble(INDICATOR_MAXIMUM,max);
IndicatorSetDouble(INDICATOR_MINIMUM,min);
}
//— 次の呼び出しのために prev_calculated の値を返す
return(rates_total);
}

参照

指標スタイルの例、指標プロパティと関数との関係、描画スタイル

IndicatorSetInteger

この関数は、対応する指標プロパティの値を設定します。指標プロパティは int または 型でなければなりません。この関数には 2 つのバージョンがあります。

プロパティ識別子との呼び出し

bool  IndicatorSetInteger(
int  prop_id,          // 識別子
int  prop_value        // 設定する値
);

プロパティ識別子と修飾子との呼び出し

bool  IndicatorSetInteger(
int  prop_id,          // 識別子
int  prop_modifier,    // 修飾子
int  prop_value        // 設定する値

パラメータ

prop_id

[in]  指標プロパティの識別子。値は ENUM_CUSTOMIND_PROPERTY_INTEGER 列挙のいずれかです。

prop_modifier

[in]  指定されたプロパティの修飾子。修飾子はレベルプロパティのみで必要です。

prop_value

[in]  プロパティ値

戻り値

実行成功の場合は true、それ以外の場合は false

注意事項

#property ディレクティブの使用時にはプロパティ( 修飾子)の番号付けは1から始まる一方、関数では番号付けが0から始まります。レベル番号が正しく設定されていない場合、指標の表示目的のものと異なる場合があります。

例えば、最初の水平ラインの厚さを設定するにはゼロインデックスを使用します。

  • IndicatorSetInteger(INDICATOR_LEVELWIDTH, 0, 5) – 最初のレベルの厚さを設定するにはインデックス 0 を使用する

例: 指標水平線の色、スタイルと太さを設定する指標

IndicatorSetInteger() 関数の使用例

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
//— 3 つの水平レベルを別々の指標ウィンドウに表示
#property indicator_level1 20
#property indicator_level2 50
#property indicator_level3 80
//— 水平レベルの厚さを設定
#property indicator_levelwidth 5
//— 水平レベルの色を設定
#property indicator_levelcolor clrAliceBlue
//— 水平レベルのスタイルを設定
#property indicator_levelstyle STYLE_DOT
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 水平レベルの記述を設定
IndicatorSetString(INDICATOR_LEVELTEXT,0,“First Level (index 0)”);
IndicatorSetString(INDICATOR_LEVELTEXT,1,“Second Level (index 1)”);
IndicatorSetString(INDICATOR_LEVELTEXT,2,“Third Level (index 2)”);
//— 指標の短縮名を設定
IndicatorSetString(INDICATOR_SHORTNAME,“IndicatorSetInteger() Demo”);
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[])
{
static int tick_counter=0;
//— ティックを計算
tick_counter++;
//— また、ティックカウンタに応じて、水平レベルの色を計算
ChangeLevelColor(0,tick_counter,3,6,10); // 最後の3つのパラメータは色を切り替える
ChangeLevelColor(1,tick_counter,3,6,8);
ChangeLevelColor(2,tick_counter,4,7,9);
//— 水平レベルのスタイルを変更
ChangeLevelStyle(0,tick_counter);
ChangeLevelStyle(1,tick_counter+5);
ChangeLevelStyle(2,tick_counter+15);
//— 幅として5によるティック数の整数除算の余りを取得
int width=tick_counter%5;
//— 全ての水平レベルと反復処理して厚さを設定する
for(int l=0;l<3;l++)
IndicatorSetInteger(INDICATOR_LEVELWIDTH,l,width+1);
//— 次の呼び出しのために prev_calculated の値を返す
return(rates_total);
}
//+——————————————————————+
//| 別の指標ウィンドウにおける水平線の色を設定する                                |
//+——————————————————————+
void ChangeLevelColor(int level,     // 水平線の数
int tick_number,// 除算の剰余を取得する数
int f_trigger, // 色切り替えの最初の除数
int s_trigger, // 色切り替えの2 番目の除数
int t_trigger) // 色切り替えの3 番目の除数
{
static color colors[3]={clrRed,clrBlue,clrGreen};
//— colors[] 配列の色のインデックス
int index=-1;
//— 水平線を描画するのに colors[] 配列の色の数を計算
if(tick_number%f_trigger==0)
index=0;   // tick_number が f_trigger で割り切れる場合
if(tick_number%s_trigger==0)
index=1;   // tick_number が s_trigger で割り切れる場合
if(tick_number%t_trigger==0)
index=2;   // tick_number が t_trigger で割り切れる場合
//— 色が定義されたら設定する      
if(index!=-1)
IndicatorSetInteger(INDICATOR_LEVELCOLOR,level,colors[index]);
//—
}
//+——————————————————————+
//| 別の指標ウィンドウにおける水平線のスタイルを設定する                            |
//+——————————————————————+
void ChangeLevelStyle(int level,     // 水平線の数
int tick_number// 除算の剰余を取得する数

{
//— スタイルを格納する配列
static ENUM_LINE_STYLE styles[5]=
{STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//— styles[] 配列のスタイルのインデックス
int index=-1;
//— styles[] 配列の数を計算して水平線のスタイルを設定
if(tick_number%50==0)
index=5;   // tick_number が 50 で割り切れる場合スタイルは STYLE_DASHDOTDOT
if(tick_number%40==0)
index=4;   // … スタイルは STYLE_DASHDOT
if(tick_number%30==0)
index=3;   // … STYLE_DOT
if(tick_number%20==0)
index=2;   // … STYLE_DASH
if(tick_number%10==0)
index=1;   // … STYLE_SOLID
//— 定義されたスタイルを設定する      
if(index!=-1)
IndicatorSetInteger(INDICATOR_LEVELSTYLE,level,styles[index]);
}

参照

カスタム指標プロパティ、プログラムのプロパティ(#property)、 描画スタイル

IndicatorSetString

この関数は、対応する指標プロパティの値を設定します。指標プロパティは string 型でなければなりません。この関数には 2 つのバージョンがあります。

プロパティ識別子との呼び出し

bool  IndicatorSetString(
int    prop_id,          // 識別子
string  prop_value        // 設定する値
);

プロパティ識別子と修飾子との呼び出し

bool  IndicatorSetString(
int    prop_id,          // 識別子
int    prop_modifier,    // 修飾子
string  prop_value        // 設定する値

パラメータ

prop_id

[in]  指標プロパティの識別子。値は ENUM_CUSTOMIND_PROPERTY_STRING 列挙のいずれかです。

prop_modifier

[in]  指定されたプロパティの修飾子。修飾子はレベルプロパティのみで必要です。

prop_value

[in]  プロパティ値

戻り値

実行成功の場合は true、それ以外の場合は false

注意事項

#property ディレクティブの使用時にはプロパティ( 修飾子)の番号付けは1から始まる一方、関数では番号付けが0から始まります。レベル番号が正しく設定されていない場合、指標の表示目的のものと異なる場合があります。

例えば、最初の水平ラインの記述を設定するにはゼロインデックスを使用します。

  • IndicatorSetString(INDICATOR_LEVELTEXT, 0, “First Level”) – 最初のレベルの記述を設定するにはインデックス 0 を使用する

例: 指標水平線にラベルを設定する指標

IndicatorSetString() 関数の使用例

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
//— 3 つの水平レベルを別々の指標ウィンドウに表示
#property indicator_level1 30
#property indicator_level2 50
#property indicator_level3 70
//— 水平レベルの色を設定
#property indicator_levelcolor clrRed
//— 水平レベルのスタイルを設定
#property indicator_levelstyle STYLE_SOLID
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 水平レベルの記述を設定
IndicatorSetString(INDICATOR_LEVELTEXT,0,“First Level (index 0)”);
IndicatorSetString(INDICATOR_LEVELTEXT,1,“Second Level (index 1)”);
IndicatorSetString(INDICATOR_LEVELTEXT,2,“Third Level (index 2)”);
//— 指標の短縮名を設定
IndicatorSetString(INDICATOR_SHORTNAME,“IndicatorSetString() Demo”);
//—
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[])
{
//—

//— 次の呼び出しのために prev_calculated の値を返す
return(rates_total);
}

参照

カスタム指標プロパティ、プログラムのプロパティ(#property)

PlotIndexSetDouble

この関数は、対応する指示線の対応するプロパティの値を設定します。指標プロパティは double 型でなければなりません。

bool  PlotIndexSetDouble(
int    plot_index,    // プロットスタイルインデックス
int    prop_id,        // プロパティ識別子
double  prop_value      // 設定する値
);

パラメータ

plot_index

[in] グラフィックプロットのインデックス

prop_id

[in] 値は ENUM_PLOT_PROPERTY_DOUBLE 列挙のいずれかの値

prop_value

[in]  プロパティ値

戻り値

成功の場合は true、それ以外の場合は false

PlotIndexSetInteger

この関数は、対応する指示線の対応するプロパティの値を設定します。指標プロパティは int、char、bool または color 型でなければなりません。この関数には 2 つのバージョンがあります。

プロパティの識別子を示す呼び出し

bool  PlotIndexSetInteger(
int  plot_index,        // プロットスタイルインデックス
int  prop_id,          // プロパティ識別子
int  prop_value        // 設定する値
);

プロパティの識別子と修飾子を示す呼び出し

bool  PlotIndexSetInteger(
int  plot_index,        // プロットスタイルインデックス
int  prop_id,          // プロパティ識別子
int  prop_modifier,    // プロパティ修飾子
int  prop_value        // 設定する値

パラメータ

plot_index

[in] グラフィックプロットのインデックス

prop_id

[in] 値は ENUM_PLOT_PROPERTY_INTEGER 列挙のいずれかです。

prop_modifier

[in]  指定されたプロパティの修飾子。修飾子は色インデックスプロパティのみで必要です。

prop_value

[in]  プロパティ値

戻り値

成功の場合は true、それ以外の場合は false

例: 3 色の線を描画する指標色は 5 ティックごとに変わります。

colorline

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//—- ColorLine をプロットする
#property indicator_label1 “ColorLine”
#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1 clrRed,clrGreen,clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1  3
//— 指標バッファ
double         ColorLineBuffer[];
double         ColorBuffer[];
int            MA_handle;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
void OnInit()
{
//— 指標バッファマッピング
SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ColorBuffer,INDICATOR_COLOR_INDEX);
//— MA ハンドルの取得
MA_handle=iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE);
//—
}
//+——————————————————————+
//| 色インデックスを取得                                                   |
//+——————————————————————+
int getIndexOfColor(int i)
{
int j=i%300;
if(j<100) return(0);// 1 番目のインデックス
if(j<200) return(1);// 2 番目のインデックス
return(2); // 3 番目のインデックス
}
//+——————————————————————+
//| カスタム指標の反復関数                                                |
//+——————————————————————+
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[])
{
//—
static int ticks=0,modified=0;
int limit;
//— 初めての計算、またはバーの数が変わった
if(prev_calculated==0)
{
//— MA の値を ColorLineBuffer 指標バッファに複製する
int copied=CopyBuffer(MA_handle,0,0,rates_total,ColorLineBuffer);
if(copied<=0) return(0);// 複製に失敗。廃棄する。
//— バー全部で線の色を設定
for(int i=0;i<rates_total;i++)
ColorBuffer[i]=getIndexOfColor(i);
}
else
{
//— MA の値を ColorLineBuffer 指標バッファに複製する
int copied=CopyBuffer(MA_handle,0,0,rates_total,ColorLineBuffer);
if(copied<=0) return(0);

ticks++;// ティックを数える
if(ticks>=5)//基本配色を変更する時
{
ticks=0; // カウンタをリセット
modified++; // 色変換のカウンタ
if(modified>=3)modified=0;// カウンタをリセット
ResetLastError();
switch(modified)
{
case 0:// 1 番目の基本配色
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrRed);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrGreen);
Print(“Color scheme “+modified);
break;
case 1:// 2 番目の基本配色
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrYellow);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrPink);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrLightSlateGray);
Print(“Color scheme “+modified);
break;
default:// 3 番目の基本配色
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrLightGoldenrod);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrOrchid);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrLimeGreen);
Print(“Color scheme “+modified);
}
}
else
{
//— 開始位置を設定
limit=prev_calculated-1;
//— バー全部で線の色を設定
for(int i=limit;i<rates_total;i++)
ColorBuffer[i]=getIndexOfColor(i);
}
}
//— 次の呼び出しのために prev_calculated の値を返す
return(rates_total);
}
//+——————————————————————+

PlotIndexSetString

この関数は、対応する指示線の対応するプロパティの値を設定します。指標プロパティは string 型でなければなりません。

bool  PlotIndexSetString(
int    plot_index,    // プロットスタイルインデックス
int    prop_id,        // プロパティ識別子
string  prop_value      // 設定する値
);

パラメータ

plot_index

[in] グラフィックプロットのインデックス

prop_id

[in] 値は ENUM_PLOT_PROPERTY_STRING 列挙のいずれかの値

prop_value

[in]  プロパティ値

戻り値

成功の場合は true、それ以外の場合は false

PlotIndexGetInteger

この関数は、対応する指示線の対応するプロパティの値を設定します。指標プロパティは int、color、bool または char 型でなければなりません。この関数には 2 つのバージョンがあります。

プロパティの識別子を示す呼び出し

int  PlotIndexGetInteger(
int  plot_index,        // プロットスタイルインデックス
int  prop_id,          // プロパティ識別子
);

プロパティの識別子と修飾子を示す呼び出し

int  PlotIndexGetInteger(
int  plot_index,        // プロットインデックス
int  prop_id,          // プロパティ識別子
int  prop_modifier      // プロパティ修飾子

パラメータ

plot_index

[in] グラフィックプロットのインデックス

prop_id

[in] 値は ENUM_PLOT_PROPERTY_INTEGER 列挙のいずれかです。

prop_modifier

[in]  指定されたプロパティの修飾子。修飾子は色インデックスプロパティのみで必要です。

注意事項

この関数は、適切な指標線の描画の設定を抽出するように設計されています。この関数は線の描画プロパティを別の線に複製する PlotIndexSetInteger 関数と連結して機能します。

例: 曜日に応じてローソク足を塗る指標。曜日ごとの色はプログラムで設定されます。

ローソク足は曜日に応じて塗られます。

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots   1
//—- ColorCandles をプロットする
#property indicator_label1 “ColorCandles”
#property indicator_type1   DRAW_COLOR_CANDLES
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 指標バッファ
double         OpenBuffer[];
double         HighBuffer[];
double         LowBuffer[];
double         CloseBuffer[];
double         ColorCandlesColors[];
color          ColorOfDay[6]={CLR_NONE,clrMediumSlateBlue,
clrDarkGoldenrod,clrForestGreen,clrBlueViolet,clrRed};
//+——————————————————————+
//| カスタム指標を初期化する関数                            |
//+——————————————————————+
void OnInit()
{
//— 指標バッファマッピング
SetIndexBuffer(0,OpenBuffer,INDICATOR_DATA);
SetIndexBuffer(1,HighBuffer,INDICATOR_DATA);
SetIndexBuffer(2,LowBuffer,INDICATOR_DATA);
SetIndexBuffer(3,CloseBuffer,INDICATOR_DATA);
SetIndexBuffer(4,ColorCandlesColors,INDICATOR_COLOR_INDEX);
//— 色バッファの色の数を設定
PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,6);
//— 色バッファの色を設定
for(int i=1;i<6;i++)
PlotIndexSetInteger(0,PLOT_LINE_COLOR,i,ColorOfDay[i]);
//— 精度を設定
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
printf(“We have %u colors of days”,PlotIndexGetInteger(0,PLOT_COLOR_INDEXES));
//—
}
//+——————————————————————+
//| カスタム指標の反復関数                                   |
//+——————————————————————+
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 i;
MqlDateTime t;
//—-
if(prev_calculated==0) i=0;
else i=prev_calculated-1;
//—-
while(i<rates_total)
{
OpenBuffer[i]=open[i];
HighBuffer[i]=high[i];
LowBuffer[i]=low[i];
CloseBuffer[i]=close[i];
//— それぞれのローソク足の色を設定
TimeToStruct(time[i],t);
ColorCandlesColors[i]=t.day_of_week;
//—
i++;
}
//— 次の呼び出しのために prev_calculated の値を返す
return(rates_total);
}
//+——————————————————————+

Originally posted 2019-07-30 09:34:09.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">