【MQL5】IndicatorSetString関数について

MQL5リファレンス
スポンサーリンク

IndicatorSetString関数の働き・役割

IndicatorSetString関数は、カスタムインジケ-タの特定のプロパティに文字列型の値を設定するために使用されます。

この関数は、カスタムインジケ-タを作成する際に、その表示や動作を細かく制御するために重要です。

指標プロパティは文字列型でなければならず、主に説明文やラベルを設定するのに利用されます。

IndicatorSetString関数には2つのバージョンがあり、それぞれ異なるパラメータを取ります。

最初のバージョンはプロパティ識別子と値を取りますが、もう一つのバージョンはプロパティ識別子修飾子、および値を取ります。

これにより、特定のレベルや項目に対して異なる設定が可能となります。

IndicatorSetString関数の引数について

IndicatorSetString関数引数構成は以下の通りです。この関数は複数の書式を持つオーバーロード関数です。

書式1

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

書式2

bool IndicatorSetString(
    int prop_id,       // 識別子
    int prop_modifier, // 修飾子
    string prop_value  // 設定する値
);
  • prop_idは指標プロパティの識別子で、ENUM_CUSTOMIND_PROPERTY_STRING列挙型のいずれかの値を指定します。
  • prop_modifierは指定されたプロパティの修飾子で、これはレベルプロパティの場合に必要です。
  • prop_valueは設定するプロパティの値を表す文字列です。

例として、最初の水平ラインの記述を設定する場合には、次のようにします。

IndicatorSetString(INDICATOR_LEVELTEXT, 0, "First Level (index 0)");

この場合、prop_idはINDICATOR_LEVELTEXT、prop_modifierは0、prop_valueは”First Level (index 0)”です。

ENUM_CUSTOMIND_PROPERTY_STRINGについて

ENUM_CUSTOMIND_PROPERTY_STRINGは、IndicatorSetString関数で使用されるプロパティ識別子の列挙型です。この列挙型には、以下の識別子が含まれます。

INDICATOR_SHORTNAME

INDICATOR_SHORTNAMEは、指標の短縮名を設定するための識別子です。プロパティ型はstring型です。

INDICATOR_LEVELTEXT

INDICATOR_LEVELTEXTは、指標のレベルの説明を設定するための識別子です。プロパティ型はstring型で、modifierとしてレベル番号を指定します。

※指標のレベルとは、例えばRSI(相対力指数)などのオシレーター系インジケータにおいて、特定の価格水準や計算結果を示すために表示される水平線を指します。
RSIでは、一般的に30や70といったレベルが設定され、これらの値を超えると買われすぎや売られすぎのシグナルとして解釈されます。

これらのレベルに対して説明を追加することで、視覚的に理解しやすくなります。例えば、RSIの70レベルに「Overbought(買われすぎ)」という説明を追加することで、チャートを見た際に直感的に状況を把握できるようになります。

IndicatorSetString関数の戻り値について

IndicatorSetString関数戻り値は、設定の成功または失敗を示します。この関数は、設定が成功した場合にtrueを返し、失敗した場合にはfalseを返します。

具体的には、以下のようなケースでtrueが返されます。

  • 指定したプロパティ識別子が有効である。
  • 指定した値が正しく設定された。

逆に、以下のような場合にはfalseが返されます。

  • 無効なプロパティ識別子を指定した。
  • 設定しようとした値がプロパティの型に適合しない。
  • その他、設定処理中にエラーが発生した。

この戻り値を活用することで、設定が正常に行われたかどうかを確認し、エラーハンドリングを行うことができます。例えば、以下のように使用します。

if (!IndicatorSetString(INDICATOR_SHORTNAME, "My Indicator")) {
    Print("Error: Unable to set the short name for the indicator.");
}

この例では、IndicatorSetString関数の呼び出しが失敗した場合にエラーメッセージがエキスパートログに出力されます。

IndicatorSetString関数を使う際の注意点

IndicatorSetString関数を使用する際には、いくつかの重要な点に留意する必要があります。

まず、#propertyディレクティブを使用する場合と、IndicatorSetString関数で使用する場合の番号付けに違いがあります。
#propertyディレクティブではプロパティの番号付けが1から始まるのに対し、IndicatorSetString関数では0から始まります。この違いに注意しないと、設定したいプロパティが正しく設定されない可能性があります。

次に、設定しようとする値が正しい型であることを確認してください。IndicatorSetString関数文字列型の値しか受け付けません。間違った型の値を指定すると、関数はfalseを返し、設定が失敗します。

また、プロパティ識別子として有効な値を使用する必要があります。無効な識別子を指定すると、同様に設定が失敗します。

最後に、エラー処理をしっかりと行うことが重要です。IndicatorSetString関数戻り値をチェックし、設定が成功したかどうかを確認しましょう。設定が失敗した場合には、適切なエラーメッセージを表示するか、他の対処を行うようにします。これにより、予期せぬ動作を防ぐことができます。

公式リファレンスのIndicatorSetString関数を使ったサンプルコード

公式リファレンスの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関数の記述も付け足してあります。

コメント

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