【MQL5】ChartWindowFind関数について

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

ChartWindowFind関数の働き・役割

ChartWindowFind関数は、指標が描画されるサブウィンドウの番号を取得するために使用されます。この関数には2つのバージョンがあり、それぞれ異なる用途で使用されます。

1つ目のバージョンでは、指定されたチャートの識別子と指標の短縮名を使ってサブウィンドウを検索し、該当するサブウィンドウの番号を返します。短縮名はサブウィンドウの左上に表示されている名前で、指標を識別するために使用されます。

2つ目のバージョンでは、カスタムインジケ-タから呼び出された場合に、その指標が描画されているサブウィンドウの番号を返します。このバージョンはパラメータを受け取らず、スクリプトエキスパートアドバイザーから呼び出されるとエラーとして-1を返します。

サブウィンドウとは何か?

サブウィンドウとは、メインのチャートウィンドウとは別に、指標や追加情報を表示するための個別のウィンドウです。メインウィンドウの下部に表示され、複数のサブウィンドウを同時に表示することができます。例えば、MACDRSIなどのインジケータ(指標)は通常、サブウィンドウに表示されます。

サブウィンドウ番号とは何か?

サブウィンドウ番号は、各サブウィンドウを一意(1つしか存在しない)に識別するための番号です。最初のサブウィンドウは0番で、その後に続くサブウィンドウには順に1、2、3と番号が付けられます。この番号を使用することで、特定のサブウィンドウに対して操作や情報の取得を行うことができます。

ChartWindowFind関数の引数について

ChartWindowFind関数には2つの書式があります。それぞれの書式について、引数の詳細を説明します。

1つ目の書式

int ChartWindowFind(
   long chart_id,                // チャート識別子
   string indicator_shortname    // 指標の短縮名
);

引数の説明

  1. chart_id
  • 種類: long型
  • 説明: チャートの識別子です。0を指定すると現在のチャートを意味します。具体的なチャートIDを指定することで、他のチャートのサブウィンドウを検索することも可能です。
  1. indicator_shortname
  • 種類: string型
  • 説明: 指標の短縮名です。短縮名はサブウィンドウの左上に表示される名前で、インジケータ(指標)を識別するために使用されます。短縮名が正確に指定されている必要があります。

※短縮名についてはINDICATOR_SHORTNAMEという識別子を使い、設定や取得を通常行います。

2つ目の書式

int ChartWindowFind();

引数の説明

この書式のChartWindowFind関数引数を受け取りません。この関数カスタムインジケ-タから呼び出されることを前提としており、インジケータが位置するサブウィンドウの番号を返します。スクリプトエキスパートアドバイザーから呼び出された場合は-1を返します。

ChartWindowFind関数の戻り値について

ChartWindowFind関数は、指定された指標が描画されているサブウィンドウの番号を返します。サブウィンドウの番号は0から始まり、順に1、2、3と付けられます。

成功した場合、該当するサブウィンドウの番号を返します。失敗した場合は-1を返します。なお、2つ目の書式(引数なし)がスクリプトエキスパートアドバイザーから呼び出された場合も-1を返します。

ChartWindowFind関数を使う際の注意点

1つ目の書式を使用する場合、指定する指標の短縮名はサブウィンドウの左上に表示されている名前と正確に一致している必要があります。短縮名が間違っていると、サブウィンドウ番号を正しく取得できません。

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

IndicatorSetString関数を使用して、INDICATOR_SHORTNAMEプロパティに短縮名を正しく設定することが重要です。
この短縮名は、後で指標を特定して削除する際に使用されます。ChartIndicatorDelete関数によってチャートから削除される指標は短縮名で識別されるため、短縮名には指標の全ての入力パラメータの値を含めることをお勧めします。

ChartWindowFind関数を使ったサンプルコード

以下はChartWindowFind関数を使ったサンプルコードになります。

#property script_show_inputs // スクリプトの入力パラメータを表示するプロパティ

//--- 入力パラメータ
input string shortname = "MACD(12,26,9)"; // 指標の短縮名を設定

//+------------------------------------------------------------------+
//| 指標のチャートウィンドウの番号を取得する関数                  |
//+------------------------------------------------------------------+
int GetIndicatorSubWindowNumber(long chartID = 0, string short_name = "")
{
   int window = -1; // サブウィンドウ番号を格納する変数を初期化

   // プログラムの種類を確認
   if ((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE) == PROGRAM_INDICATOR)
   {
      // カスタムインジケータから呼び出された場合
      window = ChartWindowFind(); // サブウィンドウ番号を取得
   }
   else
   {
      // エキスパートアドバイザーやスクリプトから呼び出された場合
      window = ChartWindowFind(0, short_name); // 指標の短縮名でサブウィンドウ番号を取得
      // 指標が見つからなかった場合のエラーメッセージを出力
      if (window == -1) Print(__FUNCTION__ + "(): Error = ", GetLastError());
   }
   return(window); // サブウィンドウ番号を返す
}

//+------------------------------------------------------------------+
//| スクリプトプログラムの開始関数                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   // 指定された短縮名の指標が存在するサブウィンドウの番号を取得
   int window = GetIndicatorSubWindowNumber(0, shortname);
   
   // 結果をエキスパートログに出力
   if (window != -1)
      Print("Indicator " + shortname + " is in the window #" + (string)window); // 指標が存在する場合
   else
      Print("Indicator " + shortname + " is not found. window = " + (string)window); // 指標が見つからない場合
}

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

#property script_show_inputs // スクリプトの入力パラメータを表示するプロパティ

//--- 入力パラメータ
input string shortname = "MACD(12,26,9)"; // 指標の短縮名を設定

【#property script_show_inputs】
この命令は、スクリプトの入力パラメータを表示することを指定しています。スクリプト実行前に、ユーザーが入力パラメータを設定できるウィンドウを表示します。

input string shortname = “MACD(12,26,9)”;】
検索対象となる指標の短縮名を格納する入力パラメータを定義しています。この例では、MACD(移動平均収束拡散手法)の設定を示す”MACD(12,26,9)”という文字列初期値として設定されています。

入力パラメータとして定義することで、スクリプト実行時にユーザーがこの値を変更できるようになります。

サンプルコードの解説2: オリジナル関数 GetIndicatorSubWindowNumber()の定義1

//+------------------------------------------------------------------+
//| 指標のチャートウィンドウの番号を取得する関数                  |
//+------------------------------------------------------------------+
int GetIndicatorSubWindowNumber(long chartID = 0, string short_name = "")
{
   int window = -1; // サブウィンドウ番号を格納する変数を初期化

   // プログラムの種類を確認
   if ((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE) == PROGRAM_INDICATOR)
   {
      // カスタムインジケータから呼び出された場合
      window = ChartWindowFind(); // サブウィンドウ番号を取得
   }

【GetIndicatorSubWindowNumber関数
GetIndicatorSubWindowNumber関数は、指標が描画されているサブウィンドウの番号を取得します。この関数は、チャートIDと指標の短縮名を引数として受け取ります。チャートIDの初期値は0で、これは現在のチャートを意味します。

int window = -1】
サブウィンドウ番号を格納する変数windowを初期化します。初期値は-1です。これは、サブウィンドウが見つからなかった場合のエラー値として使用されます。

if ((ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE) == PROGRAM_INDICATOR)】
MQLInfoInteger関数を使用してプログラムの種類を確認します。このチェックにより、現在実行中のプログラムがカスタムインジケ-タであるかどうかを判定します。ENUM_PROGRAM_TYPEはプログラムの種類を表す列挙型であり、MQLInfoInteger関数戻り値をこの列挙型キャスト(変換)しています。この変換は、MQLInfoInteger関数が整数型の値を返すため、その値を適切な列挙型に変換して比較するために行います。

【window = ChartWindowFind
現在のプログラムがカスタムインジケ-タである場合、ChartWindowFind関数を使用してサブウィンドウ番号を取得します。

サンプルコードの解説3: オリジナル関数 GetIndicatorSubWindowNumber()の定義2

 else
   {
      // エキスパートアドバイザーやスクリプトから呼び出された場合
      window = ChartWindowFind(0, short_name); // 指標の短縮名でサブウィンドウ番号を取得
      // 指標が見つからなかった場合のエラーメッセージを出力
      if (window == -1) Print(__FUNCTION__ + "(): Error = ", GetLastError());
   }
   return(window); // サブウィンドウ番号を返す
}

elseブロック】
エキスパートアドバイザースクリプトから呼び出された場合の処理を行います。

【window = ChartWindowFind(0, short_name)】
ChartWindowFind関数を使用して、指定された短縮名でサブウィンドウ番号を取得します。ここでは、チャートIDとして0(現在のチャート)を指定し、引数のshort_nameを使用して指標を検索します。

if(window == -1) Print(__FUNCTION__+ “(): Error = “, GetLastError())】
ChartWindowFind関数が-1を返した場合、指標が見つからなかったことを意味します。この場合、エラーメッセージを出力します。Print関数を使用してエラー内容をエキスパートログに出力し、__FUNCTION__マクロ(現在の関数名を示す定数値)を使って関数名も表示します。

GetLastError関数は、最後に発生したエラーコードを取得します。

return(window)】
最後に、取得したサブウィンドウ番号を返します。

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

void OnStart()
{
   // 指定された短縮名の指標が存在するサブウィンドウの番号を取得
   int window = GetIndicatorSubWindowNumber(0, shortname);

   // 結果をエキスパートログに出力
   if (window != -1)
      Print("Indicator " + shortname + " is in the window #" + (string)window); // 指標が存在する場合
   else
      Print("Indicator " + shortname + " is not found. window = " + (string)window); // 指標が見つからない場合
}

OnStart関数
OnStart関数は、スクリプトが実行された際に最初に呼び出される関数です。この関数内で、指定された短縮名の指標が存在するサブウィンドウの番号を取得し、その結果をエキスパートログに出力します。

int window = GetIndicatorSubWindowNumber(0, shortname)】
GetIndicatorSubWindowNumber関数を呼び出し、指定された短縮名の指標が存在するサブウィンドウの番号を取得します。チャートIDとして0(現在のチャート)を指定し、引数のshortnameを使用します。

if(window != -1)】
取得したサブウィンドウの番号が-1でない場合、つまり指標が存在する場合の処理を行います。

Print(“Indicator ” + shortname + ” is in the window #” + (string)window)】
指標が存在する場合、その結果をエキスパートログに出力します。指標の短縮名とサブウィンドウ番号を表示します。

else Print(“Indicator ” + shortname + ” is not found. window = ” + (string)window)】
取得したサブウィンドウの番号が-1の場合、つまり指標が見つからない場合、その結果をエキスパートログに出力します。指標の短縮名とエラー値を表示します。

補足:サブウィンドウ番号の法則性について

サブウィンドウ番号の法則性について説明します。これを理解することで、サブウィンドウの管理や操作が容易になります。

メインウィンドウとサブウィンドウの違い

MT5ではチャートが表示されるメインウィンドウと、インジケータなどが表示されるサブウィンドウが存在します。これらのウィンドウには固定された番号が割り当てられます。

  • メインウィンドウ: 常に0番
  • サブウィンドウ: 1番から順に番号が割り当てられる

メインウィンドウは常に0番として扱われ、チャートが表示される中心的なウィンドウです。一方、サブウィンドウはインジケータなどの追加情報を表示するために使用されます。

サブウィンドウ番号の付け方

サブウィンドウが作成されると、その順序に従って番号が割り当てられます。最初に追加されたサブウィンドウは1番、次に追加されたサブウィンドウは2番となります。これはサブウィンドウの作成順に従って増加します。

例えば、次のようなウィンドウ構成があるとします:

  • メインウィンドウ: 0番
  • サブウィンドウ1: 1番
  • サブウィンドウ2: 2番

サブウィンドウを閉じた場合

サブウィンドウを閉じた場合、その番号は再利用されません。既存のサブウィンドウの番号はそのまま維持されます。例えば、サブウィンドウ1を閉じた場合、残りのサブウィンドウの番号は以下のようになります:

  • メインウィンドウ: 0番
  • サブウィンドウ2: 2番

新たにサブウィンドウを追加すると、次の番号は3番となります。このように、一度割り当てられた番号はサブウィンドウが閉じられても他のサブウィンドウに再利用されることはありません。

コメント

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