PlotIndexGetInteger関数の働き・役割
PlotIndexGetInteger関数は、指定されたプロットスタイル(描画形式)の特定のプロパティ値を取得するために使用されます。
この関数は、グラフィックプロットの描画設定を抽出し、他のプロットや設定に複製するために役立ちます。
主にインジケータの描画プロパティを取得し、適切な表示を行うための設定を確認するために利用されます。
PlotIndexGetInteger関数の引数について
PlotIndexGetInteger関数の引数構成は以下の通りです。この関数は複数の形式を持つオーバーロード関数です。
書式1
int PlotIndexGetInteger(
int plot_index, // プロットスタイルインデックス(描画形式の通し番号)
int prop_id // プロパティ識別子(プロパティを一意に識別する番号)
);
plot_indexは、グラフィックプロットのインデックス(通し番号)です。これは、どのプロットスタイルのプロパティを取得するかを指定します。
prop_idは、プロパティ識別子で、ENUM_PLOT_PROPERTY_INTEGERの値の一つです。これは、取得するプロパティの種類を示します。
※ENUM_PLOT_PROPERTY_INTEGERについての詳細は↓の記事をご参照ください。
書式2
int PlotIndexGetInteger(
int plot_index, // プロットスタイルインデックス(描画形式の通し番号)
int prop_id, // プロパティ識別子(プロパティを一意に識別する番号)
int prop_modifier // プロパティ修飾子(追加の特定条件を指定)
);
plot_indexとprop_idは、書式1と同様です。
prop_modifierは、指定されたプロパティの修飾子です。これは、特定のプロパティに対する追加条件を指定するために使用され、主に色インデックスプロパティで必要となります。
PlotIndexGetInteger関数の戻り値について
PlotIndexGetInteger関数は、指定されたプロットスタイルの特定のプロパティ値を整数型(int)で返します。プロパティの値が正常に取得できた場合、その値を返します。無効なプロパティ識別子が指定された場合、INVALID_HANDLEが返されます。
まとめると以下の通りです。
- 正常な場合:指定されたプロパティの値(整数型)
- エラーの場合:INVALID_HANDLE
PlotIndexGetInteger関数を使う際の注意点
- 有効なプロパティ識別子の使用:
prop_idには、ENUM_PLOT_PROPERTY_INTEGER列挙型の有効な値を使用する必要があります。無効な識別子を指定すると、関数は正しい値を返さず、INVALID_HANDLEを返します。 - プロットインデックスの確認:
plot_indexには、対象となるプロットスタイルのインデックスを指定します。インデックスが正しくない場合、意図しないプロパティ値が取得される可能性があります。 - 修飾子の適切な使用:
色インデックスプロパティなど、一部のプロパティにはprop_modifierが必要です。必要な場合に正しく指定しないと、関数は正しい値を返しません。 - エラーチェック:
関数がINVALID_HANDLEを返した場合、その理由を特定し、適切に対処する必要があります。これは、無効なプロパティ識別子やプロットインデックスの誤りによる可能性があります。
PlotIndexGetInteger関数を使ったサンプルコード
以下はPlotIndexGetInteger関数を使ったサンプルコードになります。
//+------------------------------------------------------------------+
//| カスタム指標の定義 |
//+------------------------------------------------------------------+
#property indicator_separate_window // インジケータを別ウィンドウで表示するプロパティ
#property indicator_buffers 5 // インジケータのバッファ数を設定
#property indicator_plots 1 // インジケータのプロット数を設定
#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("曜日の色数は %d です", 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++;
}
//--- 次回呼び出しのために計算済みバー数を返す
return rates_total;
}
少し複雑なので、小分けにして解説していきたいと思います。
解説1: プロパティ命令によるインジケータ設定
//+------------------------------------------------------------------+
//| カスタム指標の定義 |
//+------------------------------------------------------------------+
#property indicator_separate_window // インジケータを別ウィンドウで表示するプロパティ
#property indicator_buffers 5 // インジケータのバッファ数を設定
#property indicator_plots 1 // インジケータのプロット数を設定
#property indicator_label1 "ColorCandles" // プロットのラベルを設定
#property indicator_type1 DRAW_COLOR_CANDLES // プロットの描画タイプをカラーローソク足に設定
#property indicator_style1 STYLE_SOLID // プロットのスタイルをソリッドに設定
#property indicator_width1 1 // プロットの幅を設定
【#property indicator_separate_window】
この命令は、インジケータを別ウィンドウに表示することを指定しています。通常の価格チャートとは別の独立したウィンドウにインジケータが表示されます。
【#property indicator_buffers 5】
この命令は、インジケータで使用するバッファの数を5に設定しています。バッファは、インジケータの計算結果を保存するための配列です。
【#property indicator_plots 1】
この命令は、インジケータのプロット数を1に設定しています。プロットは、インジケータがチャート上に描画する線や図形のことを指します。
【#property indicator_label1 “ColorCandles”】
この命令は、最初のプロットのラベルを”ColorCandles”に設定しています。このラベルは、チャート上でインジケータの説明として表示されます。
【#property indicator_type1 DRAW_COLOR_CANDLES】
この命令は、最初のプロットの描画タイプをカラーローソク足に設定しています。これにより、ローソク足が特定の色で描画されるようになります。
【#property indicator_style1 STYLE_SOLID】
この命令は、最初のプロットのスタイルをソリッドに設定しています。ソリッドスタイルは、実線として描画されます。
【#property indicator_width1 1】
この命令は、最初のプロットの幅を1に設定しています。幅は線の太さを示します。
解説2:グローバル領域での定義
//--- 指標バッファの定義
double OpenBuffer[]; // 始値を格納するバッファ
double HighBuffer[]; // 高値を格納するバッファ
double LowBuffer[]; // 安値を格納するバッファ
double CloseBuffer[]; // 終値を格納するバッファ
double ColorCandlesColors[]; // カラー情報を格納するバッファ
//--- 曜日ごとの色を定義
color ColorOfDay[6] = {CLR_NONE, clrMediumSlateBlue, clrDarkGoldenrod, clrForestGreen, clrBlueViolet, clrRed};
指標バッファの定義
【double OpenBuffer[];】
始値を格納するバッファです。この配列はインジケータが計算に使用する始値データを保存します。
【double HighBuffer[];】
高値を格納するバッファです。この配列はインジケータが計算に使用する高値データを保存します。
【double LowBuffer[];】
安値を格納するバッファです。この配列はインジケータが計算に使用する安値データを保存します。
【double CloseBuffer[];】
終値を格納するバッファです。この配列はインジケータが計算に使用する終値データを保存します。
【double ColorCandlesColors[];】
カラー情報を格納するバッファです。この配列はローソク足の色情報を保存します。曜日に応じた色を設定するために使用されます。
曜日ごとの色の定義
【color ColorOfDay[6] = {CLR_NONE, clrMediumSlateBlue, clrDarkGoldenrod, clrForestGreen, clrBlueViolet, clrRed};】
曜日ごとに使用する色を定義しています。各インデックスに対応する色が設定されており、これにより曜日ごとに異なる色でローソク足を描画できます。CLR_NONEは色なしを示します。
解説3: OnInit関数の中1
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);
}
OnInit関数の中
【void OnInit()】
OnInit関数は、インジケータが初期化されるときに呼び出されます。ここでは、インジケータの初期設定を行います。
【SetIndexBuffer(0, OpenBuffer, INDICATOR_DATA);】
SetIndexBuffer関数はインジケータのバッファを設定する関数です。この行では、始値を格納するOpenBufferをインジケータの0番目のバッファにマッピングしています。INDICATOR_DATAはバッファのデータタイプを示します。
【SetIndexBuffer(1, HighBuffer, INDICATOR_DATA);】
この行では、高値を格納するHighBufferをインジケータの1番目のバッファにマッピングしています。
【SetIndexBuffer(2, LowBuffer, INDICATOR_DATA);】
この行では、安値を格納するLowBufferをインジケータの2番目のバッファにマッピングしています。
【SetIndexBuffer(3, CloseBuffer, INDICATOR_DATA);】
この行では、終値を格納するCloseBufferをインジケータの3番目のバッファにマッピングしています。
【SetIndexBuffer(4, ColorCandlesColors, INDICATOR_COLOR_INDEX);】
この行では、カラー情報を格納するColorCandlesColorsをインジケータの4番目のバッファにマッピングしています。INDICATOR_COLOR_INDEXは色インデックスのデータタイプを示します。
【PlotIndexSetInteger(0, PLOT_COLOR_INDEXES, 6);】
この行では、PlotIndexSetInteger関数を使って色バッファの色の数を6に設定しています。これにより、曜日ごとに6種類の色を使用することが指定されます。
補足:
プロパティ命令でプロットスタイルをDRAW_COLOR_CANDLESを指定した段階で、各バッファのインデックスがどの値を表すかが暗黙的に規定されています。
具体的には、以下のようにインデックスが対応付けられています:
- インデックス0: 始値 (Open)
- インデックス1: 高値 (High)
- インデックス2: 安値 (Low)
- インデックス3: 終値 (Close)
- インデックス4: カラーインデックス(Color)
これらは、DRAW_COLOR_CANDLESを指定することで自動的に設定されるため、ユーザが明示的に指定する必要はありません。
解説4: OnInit関数の中2
//--- 色バッファの色を設定
for(int i = 1; i < 6; i++)
{
PlotIndexSetInteger(0, PLOT_LINE_COLOR, i, ColorOfDay[i]);
}
//--- インジケータの小数点以下の桁数を設定
IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
//--- 色の数をコンソールに出力
printf("曜日の色数は %d です", PlotIndexGetInteger(0, PLOT_COLOR_INDEXES));
}
OnInit関数の中
【for(int i = 1; i < 6; i++)】
このループは、インジケータの色バッファに曜日ごとの色を設定するために使用されます。インデックス1から5までを繰り返します。
※なぜforループが1から始まり、6未満かというと、平日である1(月曜を表す定数)から5(金曜を表す定数)までの5日間をカバーしているためです(配列のインデックスは0から始まりますが、0は使用しません)。
【PlotIndexSetInteger(0, PLOT_LINE_COLOR, i, ColorOfDay[i]);】
PlotIndexSetInteger関数は、指定されたインデックスの色を設定します。0はプロットインデックス(描画形式の通し番号)、PLOT_LINE_COLORはプロパティ識別子、iは色のインデックス、ColorOfDay[i]は設定する色です。このループによって例えば、月曜日は青、水曜日は緑・・・というように曜日ごとの色が設定されます。
【IndicatorSetInteger(INDICATOR_DIGITS, _Digits);】
IndicatorSetInteger関数は、インジケータの小数点以下の桁数を設定します。INDICATOR_DIGITSはプロパティ識別子で、小数点以下の桁数を設定するために使用されます。_Digitsは現在のシンボル(特定の文字や記号)の小数点以下の桁数を示す定義済み変数です。
【printf(“曜日の色数は %d です”, PlotIndexGetInteger(0, PLOT_COLOR_INDEXES));】
この行は、インジケータのエキスパートログにメッセージを出力します。
printf関数のフォーマット指定子%d
は、整数値を表示するために使用されます。
PlotIndexGetInteger関数を使用して、色バッファに設定されている色の数を取得し、その値を%d
に対応する場所に挿入してメッセージとして出力します。これにより、設定された色の数を確認することができます
解説5: OnCalculate関数の中1
//+------------------------------------------------------------------+
//| カスタム指標の計算関数 |
//+------------------------------------------------------------------+
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) // 前回計算が0の場合(初回計算)
{
i = 0; // ループカウンタを0に初期化
}
else // 初回計算ではない場合
{
i = prev_calculated - 1; // ループカウンタを前回計算済みのレート数の1つ前に設定
}
}
OnCalculate関数の中
OnCalculate関数は、カスタムインジケ-タの計算を行うための主要な関数です。この関数は新しい価格データが到着するたびに呼び出されます。引数には、現在のレート数、前回の計算数、時間、始値、高値、安値、終値、ティックボリューム、ボリューム、スプレッドが含まれています。
【int i;】
ループカウンタとして使用される変数iを宣言しています。
【MqlDateTime t;】
MqlDateTime構造体の変数tを宣言しています。MqlDateTime構造体体は日時情報を保持します。
【if(prev_calculated == 0)】
この条件文は、初回計算時の処理を行うかどうかを判定しています。初回計算の場合、prev_calculatedは0です。
※prev_calculated
は、前回の計算で処理されたバーの数を示す引数です。この値が0であるということは、これまでに一度も計算が行われていないことを意味します。
【i = 0;】
初回計算の場合、ループカウンタiを0に初期化します。これにより、全てのバーのデータを処理します。
【else】
初回計算ではない場合の処理を指定します。
【i = prev_calculated – 1;】
前回の計算から追加されたバーのみを処理するために、ループカウンタiを前回計算したバー数の1つ前に設定します。これにより、既に処理されたバーを再計算せず、新しいデータのみを処理することができます。
解説6: OnCalculate関数の中2
//--- 全バーのデータを処理
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++;
}
//--- 次回呼び出しのために計算済みバー数を返す
return rates_total;
}
OnCalculate関数の中
この部分では、全てのバーのデータを処理し、必要な情報を各バッファに格納しています。
【while(i < rates_total)】
このwhileループは、現在のバー数(rates_total)に達するまでデータを処理します。ループカウンタiがrates_total未満である間、ループを繰り返します。
【OpenBuffer[i] = open[i];】
現在のバーの始値をOpenBufferに格納します。このバッファは後でインジケータの描画に使用されます。
【HighBuffer[i] = high[i];】
現在のバーの高値をHighBufferに格納します。
【LowBuffer[i] = low[i];】
現在のバーの安値をLowBufferに格納します。
【CloseBuffer[i] = close[i];】
現在のバーの終値をCloseBufferに格納します。
【TimeToStruct(time[i], t);】
time配列から現在のバーの時刻を取り出し、MqlDateTime構造体tに変換します。TimeToStruct関数は、日時情報を表すdatetime型の値を、年、月、日、時刻などの各部分に分解してMqlDateTime構造体に格納します。これにより、個々の日時要素にアクセスすることが可能になります。
【ColorCandlesColors[i] = t.day_of_week;】
t構造体のday_of_weekフィールド(個々のメンバ変数)を使用して、曜日に対応する色をColorCandlesColorsバッファに設定します。
※ColorCandlesColorsには、インデックス1-5までColorOfDay配列の値が対応付けられています。
t構造体のメンバday_of_weekには、時系列の曜日データが格納されています。この曜日データは1-5のデータ(平日)で表されます。すなわち、1-5の数字がColorCandlesColors[i]に代入されることによって、1-5に対応付けられた色がチャートに表示されます。
これにより、各バーの色がそのバーの日付に基づいて決定されます。
【i++;】
ループカウンタiをインクリメントし、次のバーのデータを処理する準備をします。
【return rates_total;】
関数の最後に、現在のバー数を返します。これにより、次回この関数が呼び出されたときに、前回の計算がどこまで進んだかを把握することができます。