PlotIndexSetDouble関数の働き・役割
PlotIndexSetDouble関数は、インジケータの特定のプロットスタイルに関連するプロパティの値を設定するために使用されます。
特に、この関数は指定されたプロパティがdouble型の値である必要があります。
PlotIndexSetDouble関数の引数について
bool PlotIndexSetDouble(
int plot_index, // プロットスタイルインデックス
int prop_id, // プロパティ識別子
double prop_value // 設定する値
);
PlotIndexSetDouble関数の引数は以下の通りです。
第1引数: plot_index
プロットスタイルのインデックスを指定します。インジケータが複数のラインやグラフをプロットする場合、それぞれに一意(1つしか存在しない)のインデックスが割り当てられます。
第2引数: prop_id
設定するプロパティの識別子を指定します。この識別子はENUM_PLOT_PROPERTY_DOUBLEという列挙型の値です。
ENUM_PLOT_PROPERTY_DOUBLEについて
PLOT_EMPTY_VALUE
プロパティ型: double
内容説明: PLOT_EMPTY_VALUEは現時点で、唯一ENUM_PLOT_PROPERTY_DOUBLEに登録されている定数です。
プロットに使用される空の値で、この値が設定された部分には何も描画されません。これは、インジケータの特定のポイントを非表示にするために使用されます。例えば、特定の条件下でプロットを途切れさせたい場合などに使われます。
第3引数: prop_value
指定したプロパティに設定するdouble型の値です。第2引数で指定できる選択肢が現状PLOT_EMPTY_VALUEという識別子しかないので、第3引数では「空の値を設定する」役割を担っているという事になります。
PlotIndexSetDouble関数の戻り値について
PlotIndexSetDouble関数は、設定が成功した場合にtrueを返し、失敗した場合にfalseを返します。例えば、指定したプロットスタイルやプロパティが存在しない場合、falseが返されます。
PlotIndexSetDouble関数を使う際の注意点
指定するプロパティがENUM_PLOT_PROPERTY_DOUBLE型の値であることを確認してください。そうでない場合、関数はfalseを返し、設定は行われません。
また、プロットスタイルのインデックスやプロパティの識別子が正しいことを事前に確認することが重要です。
PlotIndexSetDouble関数を使った公式リファレンスのサンプルコード
PlotIndexSetDouble関数を使った公式リファレンスにはサンプルコードがないので、PlotIndexSetDouble関数が使われているIndicatorSetString関数のサンプルコードを使い解説をしていきたいと思います。サンプルコードは以下の通りです。
//--- 指標の設定
#property indicator_separate_window // 指標を別ウィンドウに表示
#property indicator_buffers 4 // 指標に使用するバッファの数
#property indicator_plots 2 // 指標に描画するプロットの数
#property indicator_type1 DRAW_LINE // プロット1の描画タイプを線に設定
#property indicator_type2 DRAW_LINE // プロット2の描画タイプを線に設定
#property indicator_color1 clrLightSeaGreen // プロット1の色を設定
#property indicator_color2 clrRed // プロット2の色を設定
//--- 入力パラメータ
extern int KPeriod = 5; // K期間の設定
extern int DPeriod = 3; // D期間の設定
extern int Slowing = 3; // スローイングの設定
//--- 指標バッファ
double MainBuffer[]; // メインバッファ
double SignalBuffer[]; // シグナルバッファ
double HighesBuffer[]; // 最高値バッファ
double LowesBuffer[]; // 最低値バッファ
//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数 |
//+------------------------------------------------------------------+
void OnInit()
{
//--- 指標バッファマッピング
SetIndexBuffer(0, MainBuffer, INDICATOR_DATA); // メインバッファをインデックス0に設定
SetIndexBuffer(1, SignalBuffer, INDICATOR_DATA); // シグナルバッファをインデックス1に設定
SetIndexBuffer(2, HighesBuffer, INDICATOR_CALCULATIONS); // 最高値バッファをインデックス2に設定
SetIndexBuffer(3, LowesBuffer, INDICATOR_CALCULATIONS); // 最低値バッファをインデックス3に設定
//--- 精度を設定
IndicatorSetInteger(INDICATOR_DIGITS, 2); // 小数点以下2桁まで表示
//--- レベルを設定
IndicatorSetInteger(INDICATOR_LEVELS, 2); // 2つのレベルを設定
IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, 20); // レベル0の値を20に設定
IndicatorSetDouble(INDICATOR_LEVELVALUE, 1, 80); // レベル1の値を80に設定
//--- サブウィンドウの最大値と最小値を設定する
IndicatorSetDouble(INDICATOR_MINIMUM, 0); // サブウィンドウの最小値を0に設定
IndicatorSetDouble(INDICATOR_MAXIMUM, 100); // サブウィンドウの最大値を100に設定
//--- インデックスが描画される最初のバーを設定する
PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, KPeriod + Slowing - 2); // プロット1の描画開始位置を設定
PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, KPeriod + Slowing + DPeriod); // プロット2の描画開始位置を設定
//--- 2 番目の線に STYLE_DOT スタイルを設定する
PlotIndexSetInteger(1, PLOT_LINE_STYLE, STYLE_DOT); // プロット2のスタイルを点線に設定
//--- データウィンドウの名称と指標サブウィンドウラベル
IndicatorSetString(INDICATOR_SHORTNAME, "Stoch(" + IntegerToString(KPeriod) + "," + IntegerToString(DPeriod) + "," + IntegerToString(Slowing) + ")"); // 指標の短縮名を設定
PlotIndexSetString(0, PLOT_LABEL, "Main"); // プロット1のラベルを設定
PlotIndexSetString(1, PLOT_LABEL, "Signal"); // プロット2のラベルを設定
//--- 線の描画を空の値に設定する
PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0); // プロット1の空の値を0に設定
PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0); // プロット2の空の値を0に設定
//--- 初期化完了
}
いくつかのセクションに分けて、コードについて解説していきたいと思います。
解説1: プロパティ命令部分
//--- 指標の設定
#property indicator_separate_window // 指標を別ウィンドウに表示
#property indicator_buffers 4 // 指標に使用するバッファの数
#property indicator_plots 2 // 指標に描画するプロットの数
#property indicator_type1 DRAW_LINE // プロット1の描画タイプを線に設定
#property indicator_type2 DRAW_LINE // プロット2の描画タイプを線に設定
#property indicator_color1 clrLightSeaGreen // プロット1の色を設定
#property indicator_color2 clrRed // プロット2の色を設定
【#property indicator_separate_window】
この命令は、インジケータを別ウィンドウに表示することを指定しています。通常の価格チャートとは別の独立したウィンドウにインジケータが表示されます。
【#property indicator_buffers 4】
この命令は、インジケータが使用するバッファの数を4つに設定しています。バッファとは、インジケータのデータを保存するための配列です。この場合、4つの異なるデータセットを保存するために4つのバッファが使用されます。
【#property indicator_plots 2】
この命令は、インジケータが描画するプロットの数を2バッファつに設定しています。プロットとは、インジケータがチャート上に描画するグラフィカルな要素のことです。ここでは、2つのプロットが描画されることを指定しています。
【#property indicator_type1 DRAW_LINE】
この命令は、プロット1の描画タイプを線に設定しています。DRAW_LINEは、プロットが単純な線として描画されることを指定します。
【#property indicator_type2 DRAW_LINE】
この命令は、プロット2の描画タイプも線に設定しています。DRAW_LINEは、プロットが単純な線として描画されることを指定します。
【#property indicator_color1 clrLightSeaGreen】
この命令は、プロット1の色をライトシーグリーン(明るい青緑色)に設定しています。これにより、プロット1がこの色で描画されます。
【#property indicator_color2 clrRed】
この命令は、プロット2の色を赤に設定しています。これにより、プロット2が赤色で描画されます。
解説2: グローバル領域での定義
※公式リファレンスではこの部分、「input」ではなく「extern」が使われています。「extern」は昔使われていたパラメータ設定用の識別子ですが、今この識別子を使おうとするとコンパイルエラーになるので、「input」に変更しました。
//--- 入力パラメータ
input int KPeriod = 5; // K期間の設定
input int DPeriod = 3; // D期間の設定
input int Slowing = 3; // スローイングの設定
//--- 指標バッファ
double MainBuffer[]; // メインバッファ
double SignalBuffer[]; // シグナルバッファ
double HighesBuffer[]; // 最高値バッファ
double LowesBuffer[]; // 最低値バッファ
【input int KPeriod = 5】
この宣言は、K期間の設定値を入力パラメータとして定義しています。ユーザーはこの値を変更して、インジケータの計算に使用する期間を指定できます。初期値は5です。
※ストキャスティクスのデータ取得を目的とした設定と思われますが、公式リファレンスのサンプルコードではインジケータの取得記述は省略されています。
【input int DPeriod = 3】
この宣言は、D期間の設定値を入力パラメータとして定義しています。ユーザーはこの値を変更して、インジケータの計算に使用するD期間を指定できます。初期値は3です。
※ストキャスティクスのデータ取得を目的とした設定と思われますが、公式リファレンスのサンプルコードではインジケータの取得記述は省略されています。
【input int Slowing = 3】
この宣言は、スローイングの設定値を入力パラメータとして定義しています。ユーザーはこの値を変更して、インジケータの計算に使用するスローイングの値を指定できます。初期値は3です。
※ストキャスティクスのデータ取得を目的とした設定と思われますが、公式リファレンスのサンプルコードではインジケータの取得記述は省略されています。
【double MainBuffer[]】
この宣言は、メインバッファを定義しています。メインバッファは、インジケータの主要な計算結果を格納するための配列です。
※ストキャスティクスのメインライン取得を目的とした設定と思われますが、公式リファレンスのサンプルコードではインジケータの取得記述は省略されています。
【double SignalBuffer[]】
この宣言は、シグナルバッファを定義しています。シグナルバッファは、インジケータのシグナルラインの計算結果を格納するための配列です。
※ストキャスティクスのシグナルライン取得を目的とした設定と思われますが、公式リファレンスのサンプルコードではインジケータの取得記述は省略されています。
【double HighesBuffer[]】
この宣言は、最高値バッファを定義しています。最高値バッファは、インジケータの計算に使用する最高値を格納するための配列です。
【double LowesBuffer[]】
この宣言は、最低値バッファを定義しています。最低値バッファは、インジケータの計算に使用する最低値を格納するための配列です。
解説3: OnInit関数の中1
void OnInit()
{
//--- 指標バッファマッピング
SetIndexBuffer(0, MainBuffer, INDICATOR_DATA); // メインバッファをインデックス0に設定
SetIndexBuffer(1, SignalBuffer, INDICATOR_DATA); // シグナルバッファをインデックス1に設定
SetIndexBuffer(2, HighesBuffer, INDICATOR_CALCULATIONS); // 最高値バッファをインデックス2に設定
SetIndexBuffer(3, LowesBuffer, INDICATOR_CALCULATIONS); // 最低値バッファをインデックス3に設定
//--- 精度を設定
IndicatorSetInteger(INDICATOR_DIGITS, 2); // 小数点以下2桁まで表示
}
【OnInit関数】
OnInit関数は、インジケータの初期化を行うための関数です。インジケータが最初に呼び出されるときに実行されます。
【SetIndexBuffer(0, MainBuffer, INDICATOR_DATA)】
SetIndexBuffer関数は、指定したインデックスにバッファを設定するための関数です。ここでは、メインバッファをインデックス0に設定しています。INDICATOR_DATAは、このバッファが表示データ用であることを示しています。これにより、メインバッファのデータがチャート上に描画されます。
【SetIndexBuffer(1, SignalBuffer, INDICATOR_DATA)】
SetIndexBuffer関数を使用して、シグナルバッファをインデックス1に設定しています。INDICATOR_DATAは、このバッファが表示データ用であることを示しています。これにより、シグナルバッファのデータがチャート上に描画されます。
【SetIndexBuffer(2, HighesBuffer, INDICATOR_CALCULATIONS)】
SetIndexBuffer関数を使用して、最高値バッファをインデックス2に設定しています。INDICATOR_CALCULATIONSは、このバッファが内部計算用であることを示しています。これにより、最高値バッファのデータは表示されず、計算にのみ使用されます。
【SetIndexBuffer(3, LowesBuffer, INDICATOR_CALCULATIONS)】
SetIndexBuffer関数を使用して、最低値バッファをインデックス3に設定しています。INDICATOR_CALCULATIONSは、このバッファが内部計算用であることを示しています。これにより、最低値バッファのデータは表示されず、計算にのみ使用されます。
【IndicatorSetInteger(INDICATOR_DIGITS, 2)】
IndicatorSetInteger関数は、指定したプロパティの整数値を設定するための関数です。ここでは、インジケータの表示精度を設定しています。INDICATOR_DIGITSは、小数点以下の桁数を示す識別子で、ここでは2を指定しています。
これにより、インジケータの値が小数点以下2桁まで表示されます。
※INDICATOR_DIGITSはインジケータの全体的な表示精度(小数点以下の桁数)を制御するためのものであり、特定のバッファに限定されるものではありません。このため、IndicatorSetInteger関数(INDICATOR_DIGITS, 2)を使用すると、インジケータのすべての表示値が小数点以下2桁まで表示されるようになります。
解説4: OnInit関数の中2
//--- レベルを設定
IndicatorSetInteger(INDICATOR_LEVELS, 2); // 2つのレベルを設定
IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, 20); // レベル0の値を20に設定
IndicatorSetDouble(INDICATOR_LEVELVALUE, 1, 80); // レベル1の値を80に設定
//--- サブウィンドウの最大値と最小値を設定する
IndicatorSetDouble(INDICATOR_MINIMUM, 0); // サブウィンドウの最小値を0に設定
IndicatorSetDouble(INDICATOR_MAXIMUM, 100); // サブウィンドウの最大値を100に設定
【IndicatorSetInteger(INDICATOR_LEVELS, 2)】
IndicatorSetInteger関数は、指定したプロパティに整数値を設定します。ここでは、INDICATOR_LEVELSプロパティに2を設定しています。INDICATOR_LEVELSは、インジケータに表示する水平レベルの数を指定する識別子です。これにより、インジケータに2つの水平レベルが設定されます。
【IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, 20)】
IndicatorSetDouble関数は、指定したプロパティに実数値を設定します。ここでは、INDICATOR_LEVELVALUEプロパティに0番目のレベルの値として20を設定しています。これにより、レベル0の値が20に設定されます。
【IndicatorSetDouble(INDICATOR_LEVELVALUE, 1, 80)】
IndicatorSetDouble関数を使用して、INDICATOR_LEVELVALUEプロパティに1番目のレベルの値として80を設定しています。これにより、レベル1の値が80に設定されます。
【IndicatorSetDouble(INDICATOR_MINIMUM, 0)】
IndicatorSetDouble関数は、指定したプロパティに実数値を設定します。ここでは、INDICATOR_MINIMUMプロパティに0を設定しています。INDICATOR_MINIMUMは、インジケータのサブウィンドウの最小値を指定する識別子です。これにより、サブウィンドウの最小値が0に設定されます。
【IndicatorSetDouble(INDICATOR_MAXIMUM, 100)】
IndicatorSetDouble関数を使用して、INDICATOR_MAXIMUMプロパティに100を設定しています。INDICATOR_MAXIMUMは、インジケータのサブウィンドウの最大値を指定する識別子です。これにより、サブウィンドウの最大値が100に設定されます。
解説5: OnInit関数の中3
//--- インデックスが描画される最初のバーを設定する
PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, KPeriod + Slowing - 2); // プロット1の描画開始位置を設定
PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, KPeriod + Slowing + DPeriod); // プロット2の描画開始位置を設定
//--- 2 番目の線に STYLE_DOT スタイルを設定する
PlotIndexSetInteger(1, PLOT_LINE_STYLE, STYLE_DOT); // プロット2のスタイルを点線に設定
【PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, KPeriod + Slowing – 2)】
PlotIndexSetInteger関数は、指定したプロパティに整数値を設定するための関数です。ここでは、インデックス0(プロット1)のPLOT_DRAW_BEGINプロパティにKPeriod + Slowing - 2
を設定しています。
PLOT_DRAW_BEGINは、プロットの描画が開始される最初のバーを指定する識別子です。この設定により、プロット1の描画開始位置が計算されます。
【PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, KPeriod + Slowing + DPeriod)】
PlotIndexSetInteger関数を使用して、インデックス1(プロット2)のPLOT_DRAW_BEGINプロパティにKPeriod + Slowing + DPeriod
を設定しています。これにより、プロット2の描画開始位置が計算されます。
【PlotIndexSetInteger(1, PLOT_LINE_STYLE, STYLE_DOT)】
PlotIndexSetInteger関数を使用して、インデックス1(プロット2)のPLOT_LINE_STYLEプロパティにSTYLE_DOTを設定しています。PLOT_LINE_STYLEは、プロットの描画スタイルを指定する識別子です。STYLE_DOTは点線スタイルを示し、この設定によりプロット2が点線で描画されるようになります。
解説6: OnInit関数の中4
//--- データウィンドウの名称と指標サブウィンドウラベル
IndicatorSetString(INDICATOR_SHORTNAME, "Stoch(" + IntegerToString(KPeriod) + "," + IntegerToString(DPeriod) + "," + IntegerToString(Slowing) + ")"); // 指標の短縮名を設定
PlotIndexSetString(0, PLOT_LABEL, "Main"); // プロット1のラベルを設定
PlotIndexSetString(1, PLOT_LABEL, "Signal"); // プロット2のラベルを設定
//--- 線の描画を空の値に設定する
PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0); // プロット1の空の値を0に設定
PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0); // プロット2の空の値を0に設定
//--- 初期化完了
}
【短縮名の設定】
IndicatorSetString関数は、指定したプロパティに文字列型の値を設定するための関数です。ここでは、INDICATOR_SHORTNAMEプロパティに「Stoch(KPeriod, DPeriod, Slowing)」という形式の短縮名を設定しています。これにより、データウィンドウと指標サブウィンドウに表示されるインジケータの名称が設定されます。
この短縮名は、インジケータの設定をわかりやすくするために、KPeriod、DPeriod、Slowingの各パラメータ値を含んでいます。これを実現するために、IntegerToString関数を使用して各整数値を文字列に変換しています。
IntegerToString関数は、整数値を文字列に変換するための関数で、ここではKPeriod、DPeriod、Slowingの各値を文字列に変換して短縮名に組み込んでいます。
【PlotIndexSetString(0, PLOT_LABEL, “Main”)】
PlotIndexSetString関数は、指定したプロットのラベルを設定するための関数です。ここでは、インデックス0(プロット1)のPLOT_LABELプロパティに「Main」というラベルを設定しています。これにより、プロット1のラベルが「Main」として表示されます。
【PlotIndexSetString(1, PLOT_LABEL, “Signal”)】
PlotIndexSetString関数を使用して、インデックス1(プロット2)のPLOT_LABELプロパティに「Signal」というラベルを設定しています。これにより、プロット2のラベルが「Signal」として表示されます。
【PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0)】
PlotIndexSetDouble関数は、指定したプロパティに実数値を設定するための関数です。ここでは、インデックス0(プロット1)のPLOT_EMPTY_VALUEプロパティに0.0を設定しています。これにより、プロット1の描画が空の値(0.0)に設定されます。
【PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0)】
PlotIndexSetDouble関数を使用して、インデックス1(プロット2)のPLOT_EMPTY_VALUEプロパティに0.0を設定しています。これにより、プロット2の描画が空の値(0.0)に設定されます。
補足:インジケータファイルにOnCalculate関数がないとコンパイルエラーになる
公式リファレンスのサンプルコードはPlotIndexSetString関数の使い方についての説明に絞ったものにつき、OnCalculate関数はない状態です。
インジケータファイルにOnCalculate関数がない状態でコンパイルをすると、
OnCalculate function not found in custom indicator (カスタムインジケ-タ内にOnCalculate関数がありません)
というコンパイルエラーが発生します。
従って、当記事のサンプルコードでは一応コンパイルエラーを回避する為に、OnCalculate関数の記述も付け足してあります。