【MQL5】ChartIndicatorDelete関数について

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

ChartIndicatorDelete関数の働き・役割

ChartIndicatorDelete関数は、指定されたチャートウィンドウから特定の短縮名を持つインジケータを削除するために使用されます。これは、トレーダーが不要になったインジケータを効率的にチャートから取り除く際に役立ちます。特定の条件下でインジケータを自動的に削除したい場合にも、この関数が利用されます。

※ここで言う「短縮名」とは、インジケータを一意に識別するための名前で、IndicatorSetString関数を使用して設定されます。この短縮名を使用することで、特定のインジケータを正確に指定して操作することが可能になります。

ChartIndicatorDelete関数の引数について

書式

bool ChartIndicatorDelete(
  long          chart_id,              // チャート識別子
  int           sub_window,            // サブウィンドウ番号
  const string  indicator_shortname    // 指標短縮名
);

引数の詳細

chart_id

チャートの識別子を指定します。0を指定すると、現在のチャートが対象となります。特定のチャートのインジケータを削除したい場合、そのチャートの識別子を取得して指定します。

sub_window

チャートのサブウィンドウ番号を指定します。0を指定すると、メインチャートウィンドウが対象となります。サブウィンドウは、追加のチャートウィンドウを示し、例えばMACDRSIなどが表示される場所です。

indicator_shortname

指標の短縮名を指定します。この短縮名は、IndicatorSetString関数INDICATOR_SHORTNAMEプロパティに設定されたものです。指標の短縮名を取得するためには、ChartIndicatorName関数を使用します。

この引数は、インジケータの一意(1つしか存在しない)の識別を行うために重要です。例えば、MyCustomIndicatorという短縮名を持つインジケータを削除する場合に指定します。

ChartIndicatorDelete関数の戻り値について

ChartIndicatorDelete関数は、指定されたインジケータの削除が成功した場合にtrueを返します。削除に失敗した場合はfalseを返します。

削除に失敗した場合のエラーの詳細を知るためには、GetLastError関数を使用します。これにより、エラーコードを取得し、問題の原因を特定することができます。

bool result = ChartIndicatorDelete(0, 0, "MyCustomIndicator");
if (!result) {
    int error_code = GetLastError();
    PrintFormat("Error deleting indicator: %d", error_code);
}

この例では、ChartIndicatorDelete関数がfalseを返した場合に、GetLastError関数を使用してエラーコードを取得し、そのエラーコードをエキスパートログに出力しています。これにより、エラーの原因を調査する手助けとなります。

ChartIndicatorDelete関数を使う際の注意点

同一の短縮名を持つインジケータがチャートサブウィンドウに2つ存在する場合、最初のものが削除されます。これにより、意図しないインジケータが削除される可能性があるため、短縮名は一意(1つしか存在しない)であることが望ましいです。

チャート上の他のインジケータが、削除されるインジケータの値に基づいている場合、そのようなインジケータも削除されます。これにより、依存関係があるインジケータを意図せず削除してしまう可能性があります。

例えば、Aというインジケータの値を使用してBというインジケータが計算されている場合を考えます。このとき、Aを削除すると、Aの値を使用しているBも自動的に削除されます。意図せずBも削除されてしまうため、注意が必要です。

iCustom関数IndicatorCreate関数を使用してインジケータを作成する際には、インジケータの短縮名とファイル名を混同しないように注意してください。インジケータの短縮名が明示的に設定されていない場合、インジケータのソースコードを含むファイルの名称がコンパイル時に指定されます。

インジケータをチャートから削除しても、その演算部が端末のメモリから削除されるわけではありません。インジケータハンドルを解除するには、IndicatorRelease関数を使用する必要があります。

インジケータの短縮名は正しく形成されなければなりません。短縮名はIndicatorSetString関数を使用してINDICATOR_SHORTNAMEプロパティに書き込まれます。ChartIndicatorDelete関数によってチャートから削除されるインジケータは短縮名によって識別されるため、短縮名にはインジケータの全ての入力パラメータの値を含むようにすることが推奨されます。

これらの注意点を守ることで、ChartIndicatorDelete関数の使用時に発生する可能性のある問題を防ぐことができます。

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

以下はChartIndicatorDelete関数を使った公式リファレンスのサンプルコードになります。

//+------------------------------------------------------------------+
//|                            Demo_ChartIndicatorDelete.mq5                            |
//|                        Copyright 2000-2024, MetaQuotes Ltd.                        |
//|                                             https://www.mql5.com                     |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd." // 著作権情報の設定
#property link      "https://www.mql5.com"                  // リンク情報の設定
#property version   "1.00"                                  // バージョン情報の設定
#property indicator_separate_window                         // インジケータを別ウィンドウに表示
#property indicator_buffers 1                               // インジケータバッファの数を設定
#property indicator_plots   1                               // プロットの数を設定
//--- ヒストグラムをプロットする
#property indicator_label1 "Histogram"                      // プロットのラベル設定
#property indicator_type1   DRAW_HISTOGRAM                  // プロットのタイプをヒストグラムに設定
#property indicator_color1 clrRed                           // プロットの色を赤に設定
#property indicator_style1 STYLE_SOLID                      // プロットのスタイルを実線に設定
#property indicator_width1  1                               // プロットの幅を1に設定

//--- 入力パラメータ
input int first_param = 1;                                  // 入力パラメータ1を設定
input int second_param = 2;                                 // 入力パラメータ2を設定
input int third_param = 3;                                  // 入力パラメータ3を設定
input bool wrong_init = true;                               // 入力パラメータ4(初期化エラーを設定するかどうか)

//--- 指標バッファ
double HistogramBuffer[];                                   // ヒストグラムバッファ配列を宣言
string shortname;                                           // 指標の短縮名を格納する変数

//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数                                     |
//+------------------------------------------------------------------+
int OnInit()
  {
   int res = INIT_SUCCEEDED;                                 // 初期化結果を格納する変数を成功に設定
   //--- HistogramBuffer 配列を指標バッファに関係づける
   SetIndexBuffer(0, HistogramBuffer, INDICATOR_DATA);       // 指標バッファにヒストグラムバッファを設定
   //--- 入力パラメータに基づいて、指標短縮名を構築する
   shortname = StringFormat("Demo_ChartIndicatorDelete(%d,%d,%d)",
                            first_param, second_param, third_param); // 短縮名を入力パラメータから生成
   IndicatorSetString(INDICATOR_SHORTNAME, shortname);       // 短縮名を指標プロパティに設定
   //--- 指標の強制終了が設定されている場合、ゼロ以外の値を返す
   if (wrong_init) res = INIT_FAILED;                        // 初期化エラーの場合、初期化失敗を設定
   return (res);                                             // 初期化結果を返す
  }

//+------------------------------------------------------------------+
//| カスタム指標の反復関数                                           |
//+------------------------------------------------------------------+
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 start = prev_calculated - 1;                          // 前回計算済みバーの位置を取得
   if (start < 0) start = 0;                                 // 開始位置が負の場合、0に設定
   //--- 指標バッファに値を記入する
   for (int i = start; i < rates_total; i++)
     {
      HistogramBuffer[i] = close[i];                         // 終値をヒストグラムバッファに格納
     }
   //--- 次の呼び出しのために prev_calculated の値を返す
   return (rates_total);                                     // 計算済みバーの数を返す
  }

//+------------------------------------------------------------------+
//| Deinit イベントハンドラ                                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)                               // 終了理由コード
  {
   PrintFormat("%s: Deinitialization reason code=%d", __FUNCTION__, reason); // 終了理由をログに出力
   //--- 初期化に失敗した場合、指標を削除
   if (reason == REASON_INITFAILED)                          // 初期化失敗の場合
     {
      PrintFormat("An indicator with a short name %s (file %s) deletes itself from the chart", shortname, __FILE__); // 削除メッセージをログに出力
      int window = ChartWindowFind();                        // 指標のあるウィンドウ番号を取得
      bool res = ChartIndicatorDelete(0, window, shortname); // 指標を削除
      //--- ChartIndicatorDelete関数の結果を分析
      if (!res)                                              // 削除失敗の場合
        {
         PrintFormat("Failed to delete indicator %s from window #%d. Error code %d",
                     shortname, window, GetLastError());     // エラーメッセージをログに出力
        }
     }
  }

このサンプルコードを使って、ChartIndicatorDelete関数の使い方・挙動についての解説をしていきたいと思います。

サンプルコード解説1:プロパティ命令によるインジケータ設定

#property indicator_separate_window                         // インジケータを別ウィンドウに表示
#property indicator_buffers 1                               // インジケータバッファの数を設定
#property indicator_plots   1                               // プロットの数を設定
//--- ヒストグラムをプロットする
#property indicator_label1 "Histogram"                      // プロットのラベル設定
#property indicator_type1   DRAW_HISTOGRAM                  // プロットのタイプをヒストグラムに設定
#property indicator_color1 clrRed                           // プロットの色を赤に設定
#property indicator_style1 STYLE_SOLID                      // プロットのスタイルを実線に設定
#property indicator_width1  1                               // プロットの幅を1に設定

解説

#property indicator_separate_window

インジケータをメインチャートウィンドウとは別のウィンドウに表示する設定です。例えば、MACDRSIなどのインジケータは通常、別ウィンドウに表示されます。このプロパティを設定することで、インジケータがメインチャートに重ならず、別ウィンドウで見やすく表示されます。

#property indicator_buffers 1

インジケータで使用するバッファの数を設定します。バッファ(データを一時的に保存する領域)は、インジケータの計算結果や表示データを格納するために使用されます。この例では、1つのバッファを使用します。

#property indicator_plots 1

インジケータのプロット(描画)数を設定します。プロットはインジケータがチャート上に表示する線や棒グラフなどのことです。この例では、1つのプロットを設定しています。

#property indicator_label1 “Histogram”

プロットのラベルを設定します。ラベルは、インジケータウィンドウ内でプロットがどのように表示されるかを示すテキストです。この例では、プロットのラベルを「Histogram」と設定しています。

#property indicator_type1 DRAW_HISTOGRAM

プロットのタイプをヒストグラムに設定します。ヒストグラムは、棒グラフの形式でデータを表示します。このプロパティを設定することで、インジケータのデータがヒストグラム形式で表示されます。

#property indicator_color1 clrRed

プロットの色を赤に設定します。このプロパティを設定することで、ヒストグラムの棒の色が赤になります。

#property indicator_style1 STYLE_SOLID

プロットのスタイルを実線に設定します。プロットのスタイルには実線、点線、破線などがありますが、この例では実線を使用しています。

#property indicator_width1 1

プロットの幅を1に設定します。このプロパティを設定することで、ヒストグラムの棒の幅が1ピクセル(デジタル画像を構成する最小の単位)になります。

サンプルコード解説2:グローバル領域での定義

//--- 入力パラメータ
input int     first_param=1;
input int     second_param=2;
input int     third_param=3;
input bool    wrong_init=true;
//--- 指標バッファ
double         HistogramBuffer[];
string         shortname;

解説

input int first_param = 1

ユーザーが設定できる入力パラメータを定義します。この場合、first_paramは整数型の入力パラメータで、初期値は1です。このパラメータは、インジケータの短縮名を構築する際に使用されます。ユーザーはスクリプトインジケータの実行前にこの値を変更することができます。

input int second_param = 2

second_paramも整数型の入力パラメータで、初期値は2です。これは、インジケータの短縮名を構築するために使用されます。複数の入力パラメータを設定することで、インジケータの動作を柔軟に制御できます。

input int third_param = 3

third_paramは3番目の入力パラメータで、整数型かつ初期値は3です。このパラメータも短縮名を構築するために使用されます。これにより、さらに多くの設定項目をユーザーに提供し、インジケータのカスタマイズ性を高めます。

input bool wrong_init = true

wrong_initはbool型(trueまたはfalse)の入力パラメータで、初期値はtrueです。これは特定の条件下でインジケータの初期化を意図的に失敗させるためのフラグとして使用されます。例えば、テスト目的で初期化エラーを発生させたい場合に利用されます。

double HistogramBuffer[]

インジケータのデータを格納するためのバッファ(データを一時的に保存する領域)を定義します。このバッファは、ヒストグラムのデータポイントを保存するために使用されます。後のOnCalculate関数で、このバッファに値が記入され、チャートに表示されます。

string shortname

インジケータの短縮名を格納するための文字列変数です。この変数は、後でインジケータを識別するために使用されます。短縮名は、インジケータをチャート上で一意に識別するために必要です。OnInit関数で、この短縮名が設定され、指標を削除する際にも使用されます。

サンプルコード解説3:OnInit関数

int OnInit()
  {
   int res = INIT_SUCCEEDED;                                 // 初期化結果を格納する変数を成功に設定
   //--- HistogramBuffer 配列を指標バッファに関係づける
   SetIndexBuffer(0, HistogramBuffer, INDICATOR_DATA);       // 指標バッファにヒストグラムバッファを設定
   //--- 入力パラメータに基づいて、指標短縮名を構築する
   shortname = StringFormat("Demo_ChartIndicatorDelete(%d,%d,%d)",
                            first_param, second_param, third_param); // 短縮名を入力パラメータから生成
   IndicatorSetString(INDICATOR_SHORTNAME, shortname);       // 短縮名を指標プロパティに設定
   //--- 指標の強制終了が設定されている場合、ゼロ以外の値を返す
   if (wrong_init) res = INIT_FAILED;                        // 初期化エラーの場合、初期化失敗を設定
   return (res);                                             // 初期化結果を返す
  }

解説

int res = INIT_SUCCEEDED

初期化結果を格納する変数resを定義し、初期値をINIT_SUCCEEDED(初期化成功)に設定します。この変数は後で初期化結果を返すために使用されます。OnInit関数は、インジケータが初期化される際に呼び出され、インジケータの初期設定を行います。

SetIndexBuffer(0, HistogramBuffer, INDICATOR_DATA)

SetIndexBuffer関数は、インジケータバッファインデックスに関連付けるために使用されます。ここでは、0番目のインデックスにHistogramBufferを関連付けています。これにより、インジケータのデータがヒストグラムバッファに保存されます。

shortname = StringFormat(“Demo_ChartIndicatorDelete(%d,%d,%d)”, first_param, second_param, third_param)

StringFormat関数を使用して、入力パラメータに基づいたインジケータの短縮名を構築します。この短縮名は、後でインジケータを識別するために使用されます。first_param、second_param、third_paramの値が短縮名に含まれます。

StringFormat関数は、指定された形式に従って文字列を作成します。%dは整数型の値を示し、対応する値がこの位置に挿入されます。例えば、first_paramが1、second_paramが2、third_paramが3の場合、結果の文字列は「Demo_ChartIndicatorDelete(1,2,3)」となります。

IndicatorSetString(INDICATOR_SHORTNAME, shortname)

IndicatorSetString関数を使用して、短縮名をインジケータプロパティに設定します。これにより、インジケータがチャート上で一意に識別されるようになります。

if (wrong_init) res = INIT_FAILED

もしwrong_initがtrueの場合、初期化結果をINIT_FAILED(初期化失敗)に設定します。これはテスト目的や特定の条件で初期化を失敗させたい場合に使用されます。

return (res)

初期化結果を返します。resの値はINIT_SUCCEEDED(成功)またはINIT_FAILED(失敗)です。この戻り値により、インジケータの初期化が成功したかどうかを判定できます。

サンプルコード解説4:OnCalculate関数

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 start = prev_calculated - 1;                          // 前回計算済みバーの位置を取得
   if (start < 0) start = 0;                                 // 開始位置が負の場合、0に設定
   //--- 指標バッファに値を記入する
   for (int i = start; i < rates_total; i++)
     {
      HistogramBuffer[i] = close[i];                         // 終値をヒストグラムバッファに格納
     }
   //--- 次の呼び出しのために prev_calculated の値を返す
   return (rates_total);                                     // 計算済みバーの数を返す
  }

解説

OnCalculate関数は、インジケータが新しいデータを受け取った際に呼び出され、データの計算とインジケータの更新を行います。

int start = prev_calculated – 1

ループを操作するための開始位置を計算します。前回計算済みバーの位置から1を引いた位置を開始位置として設定します。これにより、前回の計算位置から新しいデータに対する計算を行うことができます。

if(start < 0) start = 0

開始位置が負の場合、0に設定します。これは、最初の呼び出し時に前回計算済みバーが存在しないため、開始位置を0にリセットするためです。

for (int i = start; i < rates_total; i++)

データの計算を行うループを開始します。開始位置から全バーの数までループを実行します。

HistogramBuffer[i] = close[i]

ヒストグラムバッファに終値データを格納します。各バーに対して、対応する終値をヒストグラムバッファに保存します。これにより、インジケータのデータが更新され、チャートに表示されます。

return (rates_total)

計算済みバーの数を返します。これにより、次回の呼び出し時に前回計算済みバーの位置が更新され、効率的なデータ計算が行われます。

OnCalculate関数は、インジケータのメインロジックが実行される場所であり、チャートデータの変化に応じてインジケータを更新する役割を果たします。

サンプルコード解説5:OnDeinit関数

void OnDeinit(const int reason)                               // 終了理由コード
  {
   PrintFormat("%s: Deinitialization reason code=%d", __FUNCTION__, reason); // 終了理由をログに出力
   //--- 初期化に失敗した場合、指標を削除
   if (reason == REASON_INITFAILED)                          // 初期化失敗の場合
     {
      PrintFormat("An indicator with a short name %s (file %s) deletes itself from the chart", shortname, __FILE__); // 削除メッセージをログに出力
      int window = ChartWindowFind();                        // 指標のあるウィンドウ番号を取得
      bool res = ChartIndicatorDelete(0, window, shortname); // 指標を削除
      //--- ChartIndicatorDelete関数の結果を分析
      if (!res)                                              // 削除失敗の場合
        {
         PrintFormat("Failed to delete indicator %s from window #%d. Error code %d",
                     shortname, window, GetLastError());     // エラーメッセージをログに出力
        }
     }
  }

解説

OnDeinit関数は、インジケータが終了する際に呼び出され、終了処理を行います。この関数内では、終了理由を判定し、必要に応じてインジケータを削除します。

void OnDeinit(const int reason)

OnDeinit関数の宣言です。引数reasonは、インジケータが終了する理由を示す整数コードです。

PrintFormat(“%s: Deinitialization reason code=%d”, __FUNCTION__, reason)

終了理由をログに出力します。PrintFormat関数を使用して、関数名と終了理由コードをフォーマットしてエキスパートログに出力します。__FUNCTION__は、現在の関数名を示すマクロです。

if(reason == REASON_INITFAILED)

終了理由が初期化失敗(REASON_INITFAILED)であるかを判定します。初期化失敗の場合、以下の処理を行います。REASON_INITFAILEDは、初期化に失敗したことを示す定数です。

PrintFormat(“An indicator with a short name %s (file %s) deletes itself from the chart”, shortname, __FILE__)

初期化失敗によってインジケータがチャートから削除されることをログに出力します。短縮名とファイル名を含むメッセージをフォーマットして表示します。__FILE__は、現在のファイル名を示すマクロです。

int window = ChartWindowFind()

ChartWindowFind関数を使用して、インジケータが表示されているウィンドウ番号を取得します。このウィンドウ番号は、後でインジケータを削除する際に使用されます。ChartWindowFind関数は、指定された短縮名のインジケータが存在するチャートウィンドウ番号を返します。

bool res = ChartIndicatorDelete(0, window, shortname)

ChartIndicatorDelete関数を使用して、インジケータをチャートから削除します。0は現在のチャートを示し、windowはウィンドウ番号、shortnameはインジケータの短縮名です。

if(!res)

削除が失敗した場合、以下の処理を行います。

PrintFormat(“Failed to delete indicator %s from window #%d. Error code %d”, shortname, window, GetLastError())

削除が失敗した場合、エラーメッセージをログに出力します。短縮名、ウィンドウ番号、エラーコードを含むメッセージをフォーマットして表示します。GetLastError関数は、最後に発生したエラーコードを返します。

OnDeinit関数は、インジケータの終了処理を適切に行い、初期化に失敗した場合にインジケータをチャートから削除する役割を果たします。

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