【MQL5】EventChartCustom関数について

MQL5リファレンス
スポンサーリンク
  1. EventChartCustom関数の働き・役割
  2. EventChartCustom関数の引数について
    1. 第1引数: chart_id
    2. 第2引数: custom_event_id
    3. 第3引数: lparam
    4. 第4引数: dparam
    5. 第5引数: sparam
  3. EventChartCustom関数の戻り値について
  4. EventChartCustom関数を使う際の注意点
  5. EventChartCustom関数を使ったサンプルコード
  6. サンプルコードに使われた関数や文法要素の簡単な解説
    1. 変数定義部分
      1. ボタンオブジェクトの識別子
      2. ラベルオブジェクトの識別子
      3. ブロードキャストイベントの識別子
    2. OnInit関数部分1
      1. エキスパート初期化に使用される関数
      2. ボタンオブジェクトの作成
      3. ボタンのプロパティ設定
    3. OnInit関数部分2
      1. 情報を表示するラベルの作成と設定
      2. ラベルオブジェクトの作成
      3. ラベルのプロパティ設定
    4. OnDeinit関数部分
      1. エキスパート初期化解除に使用される関数
      2. ボタンとラベルを削除する
    5. OnChartEvent関数部分1
      1. チャートイベントを処理する関数
      2. マウスボタンを押してイベントをチェックする
      3. ボタンがクリックされた場合の処理
      4. デバッグメッセージのログ出力
      5. カスタムイベントのIDとメッセージの設定
      6. カスタムイベントを送信
      7. 全てのチャートにメッセージを送信
      8. デバッグメッセージのログ出力
      9. チャートオブジェクトの強制再描画
    6. OnChartEvent関数部分2
      1. ユーザイベントの処理
      2. ユーザイベントかどうかをチェックする
      3. ブロードキャストメッセージの処理
      4. その他のユーザイベントの処理
      5. メッセージをラベルで表示する
      6. チャートオブジェクトの強制再描画
    7. BroadcastEvent関数の定義部分
      1. 全ての開いているチャートにブロードキャストイベントを送信する関数
      2. イベントIDの設定
      3. 最初のチャートを取得
      4. カウンタの初期化
      5. whileループの開始
      6. カスタムイベントの送信
      7. 次のチャートを取得
      8. ループの終了条件
      9. カウンタの増加

EventChartCustom関数の働き・役割

EventChartCustom関数は、カスタムチャートイベントを生成するために使用されます。この関数を利用することで、独自のイベントをチャートに送信し、特定の操作や条件が満たされた際にイベントハンドラーで処理を行うことができます。カスタムイベントを使用することで、より柔軟で高度なチャート制御が可能になります。

EventChartCustom関数の引数について

EventChartCustom関数引数は以下の通りです。

bool EventChartCustom(
   long chart_id,            // イベントを受け取るチャートの識別子
   ushort custom_event_id,   // イベント識別子
   long lparam=0,            // long型のパラメータ
   double dparam=0.0,        // double型のパラメータ
   string sparam=""          // イベントのstringパラメータ
);

第1引数: chart_id

チャートの識別子です。ChartID関数で取得した現在のチャートIDや、特定のチャートIDを指定します。0を指定すると現在のチャートが対象となります。

第2引数: custom_event_id

イベントの識別子です。ユーザーが定義するカスタムイベントのIDを指定します。公式リファレンスによると、この識別子は自動的にCHARTEVENT_CUSTOMの値に足され、整数型に変換されます。
これにより、各カスタムイベントは一意(1つしか存在しない)なIDを持つことが保証され、他のイベントと区別されます。
CHARTEVENT_CUSTOMを含めた、チャート上で発生するさまざまなイベントを表す定数を集めたENUM_CHART_EVENT列挙型についての詳細は↓の記事をご参照ください。

第3引数: lparam

オプションのパラメータ1です。初期値(デフォルト)は0で、long型の値を渡すことができます。

第4引数: dparam

オプションのパラメータ2です。初期値(デフォルト)は0.0で、double型の値を渡すことができます。

第5引数: sparam

オプションのパラメータ3です。初期値(デフォルト)は空の文字列(””)で、string型の値を渡すことができます。

引数のlparam、dparam、sparamが意味するところについては、下記のOnChartEvent関数に関する記事をご参照ください。

EventChartCustom関数の戻り値について

EventChartCustom関数は、イベントが正常に生成されてチャートに送信された場合にtrueを返します。送信に失敗した場合はfalseを返します。戻り値を確認することで、イベントの送信が成功したかどうかを判別できます。
※エラー原因はGetLastError関数で確認する事ができます。

EventChartCustom関数を使う際の注意点

EventChartCustom関数を使用する際は、イベントIDの一意(1つしか存在しない)性を確保し、他のイベントと衝突しないように注意する必要があります。
また、イベントハンドラーで適切にイベントを処理するために、イベントIDやパラメータの意味を明確に定義することが重要です。

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

以下は、EventChartCustom関数を使用してカスタムイベントを生成し、イベントハンドラーで処理する例です。

string buttonID="Button"; // ボタンオブジェクトの識別子
string labelID="Info";    // ラベルオブジェクトの識別子
int broadcastEventID=5000; // ブロードキャストイベントの識別子

//+------------------------------------------------------------------+
//| エキスパート初期化に使用される関数                               |
//+------------------------------------------------------------------+
int OnInit()
{
  //--- カスタムイベントを送信するボタンを作成する
  ObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100); // ボタンオブジェクトの作成
  ObjectSetInteger(0,buttonID,OBJPROP_COLOR,clrWhite); // ボタンの文字色を設定
  ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,clrGray); // ボタンの背景色を設定
  ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,100); // ボタンのX座標を設定
  ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,100); // ボタンのY座標を設定
  ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,200); // ボタンの幅を設定
  ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50); // ボタンの高さを設定
  ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial"); // ボタンのフォントを設定
  ObjectSetString(0,buttonID,OBJPROP_TEXT,"Button"); // ボタンのテキストを設定
  ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10); // ボタンのフォントサイズを設定
  ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0); // ボタンが選択可能かどうかを設定

  //--- 情報を表示するラベルを作成する
  ObjectCreate(0,labelID,OBJ_LABEL,0,100,100); // ラベルオブジェクトの作成
  ObjectSetInteger(0,labelID,OBJPROP_COLOR,clrRed); // ラベルの文字色を設定
  ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,100); // ラベルのX座標を設定
  ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,50); // ラベルのY座標を設定
  ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS"); // ラベルのフォントを設定
  ObjectSetString(0,labelID,OBJPROP_TEXT,"No information"); // ラベルのテキストを設定
  ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20); // ラベルのフォントサイズを設定
  ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0); // ラベルが選択可能かどうかを設定

  return(INIT_SUCCEEDED); // 初期化成功を返す
}
//+------------------------------------------------------------------+
//| エキスパート初期化解除に使用される関数                           |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  //--- ボタンとラベルを削除する
  ObjectDelete(0,buttonID); // ボタンオブジェクトの削除
  ObjectDelete(0,labelID); // ラベルオブジェクトの削除
}
//+------------------------------------------------------------------+
//| エキスパートティック関数                                         |
//+------------------------------------------------------------------+
void OnTick()
{
  //---
}
//+------------------------------------------------------------------+
//| チャートイベントを処理する関数                                   |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
  //--- マウスボタンを押してイベントをチェックする
  if(id==CHARTEVENT_OBJECT_CLICK)
  {
    string clickedChartObject=sparam; // クリックされたオブジェクトの名前を取得
    //--- buttonID の名称のオブジェクトをクリックした場合
    if(clickedChartObject==buttonID)
    {
      //--- ボタンの状態—押されたか放された
      bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE); // ボタンの状態を取得
      //--- デバッグメッセージをログする
      Print("Button pressed = ",selected); // ボタンが押されたかどうかをログに出力

      int customEventID; // 送信するカスタムイベントのID
      string message;   // イベントで送られるメッセージ
      //--- ボタンが押された場合
      if(selected)
      {
        message="Button pressed"; // メッセージを設定
        customEventID=CHARTEVENT_CUSTOM+1; // カスタムイベントIDを設定
      }
      else // ボタンが押されていない場合
      {
        message="Button is not pressed"; // メッセージを設定
        customEventID=CHARTEVENT_CUSTOM+999; // カスタムイベントIDを設定
      }
      //--- カスタムイベントを「自分の」チャートに送る
      EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message); // カスタムイベントを送信
      //--- メッセージを全てのチャートに送る
      BroadcastEvent(ChartID(),0,"Broadcast Message"); // 全てのチャートにイベントを送信
      //--- デバッグメッセージ
      Print("Sent an event with ID = ",customEventID); // 送信したイベントIDをログに出力
    }
    ChartRedraw(); // チャートオブジェクトの強制再描画
  }

  //--- イ

ベントがユーザイベントかどうかチェックする
  if(id>CHARTEVENT_CUSTOM)
  {
    if(id==broadcastEventID)
    {
      Print("Got broadcast message from a chart with id = "+lparam); // ブロードキャストメッセージを受信したことをログに出力
    }
    else
    {
      //--- イベントのテキストメッセージを読む
      string info=sparam; // イベントのメッセージを取得
      Print("Handle the user event with the ID = ",id); // ユーザイベントを処理することをログに出力
      //--- メッセージをラベルで表示する
      ObjectSetString(0,labelID,OBJPROP_TEXT,sparam); // ラベルのテキストを更新
      ChartRedraw(); // チャートオブジェクトの強制再描画
    }
  }
}
//+------------------------------------------------------------------+
//| 全ての開いているチャートにブロードキャストイベントを送信する関数 |
//+------------------------------------------------------------------+
void BroadcastEvent(long lparam,double dparam,string sparam)
{
  int eventID=broadcastEventID-CHARTEVENT_CUSTOM; // イベントIDを設定
  long currChart=ChartFirst(); // 最初のチャートを取得
  int i=0; // カウンタを初期化
  while(i<CHARTS_MAX) // 開いているチャートは確実に CHARTS_MAX 以内
  {
    EventChartCustom(currChart,eventID,lparam,dparam,sparam); // カスタムイベントを送信
    currChart=ChartNext(currChart); // 次のチャートを取得
    if(currChart==-1) break; // チャートリストの最後に達した場合ループを終了
    i++; // カウンタを増加
  }
}

サンプルコードに使われた関数や文法要素の簡単な解説

若干複雑なので小分けにして1つ1つ見ていきます。

変数定義部分

エキスパートアドバイザーEA)の初期化に先立って、いくつかの重要な変数を定義します。これらの変数は、後でオブジェクトやイベントを識別するために使用されます。

string buttonID = "Button"; // ボタンオブジェクトの識別子
string labelID = "Info";    // ラベルオブジェクトの識別子
int broadcastEventID = 5000; // ブロードキャストイベントの識別子

ボタンオブジェクトの識別子

buttonID変数は、ボタンオブジェクトを識別するために使用されます。ここでは、”Button”という文字列をボタンの名前として使用しています。ボタンを操作したりプロパティを設定したりする際に、この識別子を使ってボタンオブジェクトを特定します。

ラベルオブジェクトの識別子

labelID変数は、ラベルオブジェクトを識別するために使用されます。ここでは、”Info”という文字列をラベルの名前として使用しています。ラベルを操作したりプロパティを設定したりする際に、この識別子を使ってラベルオブジェクトを特定します。

ブロードキャストイベントの識別子

broadcastEventID変数は、ブロードキャストイベントを識別するために使用されます。この識別子を使って、他のチャートに送信するカスタムイベントを特定します。ここでは、5000という整数値をイベントIDとして使用しています。

これらの変数定義は、後でオブジェクトの作成やイベントの送信に必要な識別情報を提供するために重要です。

OnInit関数部分1

エキスパート初期化に使用される関数

OnInit関数は、エキスパートアドバイザーEA)が初期化される際に自動的に呼び出されます。ここでは、カスタムイベントを送信するためのボタンオブジェクトを作成し、そのプロパティを設定します。

int OnInit()
{
  //--- カスタムイベントを送信するボタンを作成する
  ObjectCreate(0, buttonID, OBJ_BUTTON, 0, 0, 0); // ボタンオブジェクトの作成
  ObjectSetInteger(0, buttonID, OBJPROP_COLOR, clrWhite); // ボタンの文字色を設定
  ObjectSetInteger(0, buttonID, OBJPROP_BGCOLOR, clrGray); // ボタンの背景色を設定
  ObjectSetInteger(0, buttonID, OBJPROP_XDISTANCE, 100); // ボタンのX座標を設定
  ObjectSetInteger(0, buttonID, OBJPROP_YDISTANCE, 100); // ボタンのY座標を設定
  ObjectSetInteger(0, buttonID, OBJPROP_XSIZE, 200); // ボタンの幅を設定
  ObjectSetInteger(0, buttonID, OBJPROP_YSIZE, 50); // ボタンの高さを設定
  ObjectSetString(0, buttonID, OBJPROP_FONT, "Arial"); // ボタンのフォントを設定
  ObjectSetString(0, buttonID, OBJPROP_TEXT, "Button"); // ボタンのテキストを設定
  ObjectSetInteger(0, buttonID, OBJPROP_FONTSIZE, 10); // ボタンのフォントサイズを設定
  ObjectSetInteger(0, buttonID, OBJPROP_SELECTABLE, 0); // ボタンが選択可能かどうかを設定

ボタンオブジェクトの作成

ObjectCreate関数は新しいオブジェクトを作成します。最初の引数はチャートの識別子で、ここでは現在アクティブなチャートを指定するために0を使用しています。

次の引数はオブジェクトの名前で、buttonIDという変数に格納された名前を使用しています。この名前はボタンオブジェクトを識別するために使います。

次に、オブジェクトの種類を指定します。ここではOBJ_BUTTONを指定してボタンオブジェクトを作成します。

次の引数はサブウィンドウの番号を指定し、0はメインチャートウィンドウを意味します。

最後の二つの引数はオブジェクトの時間座標と価格座標を指定しますが、ボタンオブジェクトではこれらの値は無視されます。

ボタンのプロパティ設定

ObjectSetInteger関数ObjectSetString関数を使って、ボタンのプロパティを設定します。

まず文字色を設定します。clrWhiteは白色を示します。

次に背景色を設定します。clrGrayは灰色を示します。

ボタンの位置を設定します。X座標とY座標を設定し、チャートの左上隅からそれぞれ100ピクセルずつ離れた位置にボタンを配置します。

次にボタンのサイズを設定します。幅は200ピクセル、高さは50ピクセルです。

次にフォントを設定します。ここではArialを使用します。

ボタンに表示するテキストを設定します。ここではButtonというテキストが表示されます。

フォントサイズを設定します。ここではフォントサイズを10に設定します。

最後にボタンが選択可能かどうかを設定します。ここでは選択不可能(0)に設定します。

この部分のコードは、カスタムイベントを送信するためのボタンを作成し、その外観や動作を設定する役割を担っています。

OnInit関数部分2

情報を表示するラベルの作成と設定

//--- 情報を表示するラベルを作成する
ObjectCreate(0, labelID, OBJ_LABEL, 0, 100, 100); // ラベルオブジェクトの作成
ObjectSetInteger(0, labelID, OBJPROP_COLOR, clrRed); // ラベルの文字色を設定
ObjectSetInteger(0, labelID, OBJPROP_XDISTANCE, 100); // ラベルのX座標を設定
ObjectSetInteger(0, labelID, OBJPROP_YDISTANCE, 50); // ラベルのY座標を設定
ObjectSetString(0, labelID, OBJPROP_FONT, "Trebuchet MS"); // ラベルのフォントを設定
ObjectSetString(0, labelID, OBJPROP_TEXT, "No information"); // ラベルのテキストを設定
ObjectSetInteger(0, labelID, OBJPROP_FONTSIZE, 20); // ラベルのフォントサイズを設定
ObjectSetInteger(0, labelID, OBJPROP_SELECTABLE, 0); // ラベルが選択可能かどうかを設定

return(INIT_SUCCEEDED); // 初期化成功を返す
}

ラベルオブジェクトの作成

ObjectCreate関数を使って、情報を表示するためのラベルオブジェクトを作成します。

最初の引数はチャートの識別子で、0を指定することで現在アクティブなチャートにラベルが作成されます。次の引数はオブジェクトの名前で、labelID変数に格納された名前を使用します。

この名前を使ってラベルオブジェクトを識別します。オブジェクトの種類として、OBJ_LABELを指定してラベルオブジェクトを作成します。

サブウィンドウの番号には0を指定し、メインチャートウィンドウにラベルを配置します。最後の二つの引数は、時間座標と価格座標を指定しますが、ラベルオブジェクトでは無視されます。

ラベルのプロパティ設定

ObjectSetInteger関数ObjectSetString関数を使用して、ラベルのプロパティを設定します。

最初に文字色を設定します。clrRedは赤色を示します。

次に、ラベルの位置を設定します。X座標とY座標を設定し、チャートの左上隅からそれぞれ100ピクセルと50ピクセル離れた位置にラベルを配置します。

次に、ラベルのフォントを設定します。ここではTrebuchet MSというフォントを使用します。

ラベルに表示するテキストを設定します。ここでは”No information”というテキストが表示されます。

フォントサイズを設定します。ここではフォントサイズを20に設定します。

最後に、ラベルが選択可能かどうかを設定します。ここでは選択不可能(0)に設定します。

この部分のコードは、情報を表示するためのラベルを作成し、その外観や動作を設定する役割を担っています。これにより、チャート上にユーザーに対して情報を表示するラベルを配置することができます。

OnDeinit関数部分

エキスパート初期化解除に使用される関数

OnDeinit関数は、エキスパートアドバイザーEA)が終了される際に自動的に呼び出されます。この関数は、終了時に必要なクリーンアップ処理を行うために使用されます。ここでは、初期化時に作成したボタンとラベルオブジェクトを削除します。

//+------------------------------------------------------------------+
//| エキスパート初期化解除に使用される関数                           |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  //--- ボタンとラベルを削除する
  ObjectDelete(0, buttonID); // ボタンオブジェクトの削除
  ObjectDelete(0, labelID); // ラベルオブジェクトの削除
}

ボタンとラベルを削除する

エキスパートアドバイザーEA)が終了するときに呼び出されるOnDeinit関数では、チャート上に作成されたオブジェクトを削除する処理が行われます。

ObjectDelete関数を使用して、特定のオブジェクトをチャートから削除します。

最初の引数はチャートの識別子で、0を指定することで現在アクティブなチャートを対象にします。次の引数は削除するオブジェクトの名前で、buttonID変数に格納された名前を使用します。これにより、初期化時に作成したボタンオブジェクトが削除されます。

次に、ObjectDelete関数を使用してラベルオブジェクトを削除します。手順はボタンオブジェクトの削除と同様で、ラベルオブジェクトの名前であるlabelID変数を使用します。これにより、初期化時に作成したラベルオブジェクトが削除されます。

OnChartEvent関数部分1

チャートイベントを処理する関数

OnChartEvent関数は、チャート上で発生する様々なイベントを処理するために使用されます。この関数は、ユーザーがマウスボタンをクリックしたり、キーボードを操作したりしたときなど、様々なイベントが発生したときに自動的に呼び出されます。ここでは、ボタンがクリックされたイベントを処理し、その状態に応じてカスタムイベントを送信します。

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
  //--- マウスボタンを押してイベントをチェックする
  if(id == CHARTEVENT_OBJECT_CLICK)
  {
    string clickedChartObject = sparam; // クリックされたオブジェクトの名前を取得
    //--- buttonID の名称のオブジェクトをクリックした場合
    if(clickedChartObject == buttonID)
    {
      //--- ボタンの状態—押されたか放された
      bool selected = ObjectGetInteger(0, buttonID, OBJPROP_STATE); // ボタンの状態を取得
      //--- デバッグメッセージをログする
      Print("Button pressed = ", selected); // ボタンが押されたかどうかをログに出力

      int customEventID; // 送信するカスタムイベントのID
      string message;   // イベントで送られるメッセージ
      //--- ボタンが押された場合
      if(selected)
      {
        message = "Button pressed"; // メッセージを設定
        customEventID = CHARTEVENT_CUSTOM + 1; // カスタムイベントIDを設定
      }
      else // ボタンが押されていない場合
      {
        message = "Button is not pressed"; // メッセージを設定
        customEventID = CHARTEVENT_CUSTOM + 999; // カスタムイベントIDを設定
      }
      //--- カスタムイベントを「自分の」チャートに送る
      EventChartCustom(0, customEventID - CHARTEVENT_CUSTOM, 0, 0, message); // カスタムイベントを送信
      //--- メッセージを全てのチャートに送る
      BroadcastEvent(ChartID(), 0, "Broadcast Message"); // 全てのチャートにイベントを送信
      //--- デバッグメッセージ
      Print("Sent an event with ID = ", customEventID); // 送信したイベントIDをログに出力
    }
    ChartRedraw(); // チャートオブジェクトの強制再描画
  }
}

マウスボタンを押してイベントをチェックする

idCHARTEVENT_OBJECT_CLICKである場合、このイベントが発生したことを示しています。CHARTEVENT_OBJECT_CLICKは、チャート上のオブジェクトがクリックされたときに発生するイベントです。

まず、クリックされたオブジェクトの名前をsparamから取得します。この名前がbuttonIDと一致するかどうかを確認します。

ボタンがクリックされた場合の処理

クリックされたオブジェクトがbuttonIDと一致する場合、つまり、ボタンがクリックされた場合の処理を行います。ボタンの状態をObjectGetInteger関数を使って取得し、OBJPROP_STATEプロパティを調べます。OBJPROP_STATEプロパティは、ボタンが押されたかどうかを示します。

デバッグメッセージのログ出力

ボタンが押されたかどうかの状態をログに出力します。これにより、デバッグ時にボタンの状態を確認できます。

カスタムイベントのIDとメッセージの設定

ボタンが押された場合と押されていない場合で、異なるメッセージとカスタムイベントIDを設定します。ボタンが押された場合には「Button pressed」というメッセージを設定し、カスタムイベントIDをCHARTEVENT_CUSTOM + 1に設定します。ボタンが押されていない場合には「Button is not pressed」というメッセージを設定し、カスタムイベントIDをCHARTEVENT_CUSTOM + 999に設定します。

カスタムイベントIDに+1+999を足しているのは、それぞれ異なるイベントを区別するためです。CHARTEVENT_CUSTOMはカスタムイベントの基準値として使用され、その値に特定の数値を足すことで、イベントの種類を識別します。例えば、+1はボタンが押された状態を示し、+999はボタンが押されていない状態を示します。この方法により、異なるカスタムイベントを一意(1つしか存在しない)に識別することができます。

カスタムイベントを送信

EventChartCustom関数を使って、設定したメッセージとカスタムイベントIDを持つカスタムイベントを送信します。送信先は0を指定することで現在のチャートになります。

全てのチャートにメッセージを送信

BroadcastEvent関数を呼び出して、全てのチャートに「Broadcast Message」というメッセージを送信します。

※BroadcastEvent関数はオリジナルの関数で、この後定義しています。

デバッグメッセージのログ出力

送信したカスタムイベントIDをログに出力します。これにより、デバッグ時に送信されたイベントIDを確認できます。

チャートオブジェクトの強制再描画

最後に、ChartRedraw関数を呼び出してチャートオブジェクトを強制的に再描画します。これにより、チャート上のオブジェクトの状態が正しく反映されます。

OnChartEvent関数部分2

ユーザイベントの処理

//--- イベントがユーザイベントかどうかチェックする
if(id > CHARTEVENT_CUSTOM)
{
  if(id == broadcastEventID)
  {
    Print("Got broadcast message from a chart with id = " + lparam); // ブロードキャストメッセージを受信したことをログに出力
  }
  else
  {
    //--- イベントのテキストメッセージを読む
    string info = sparam; // イベントのメッセージを取得
    Print("Handle the user event with the ID = ", id); // ユーザイベントを処理することをログに出力
    //--- メッセージをラベルで表示する
    ObjectSetString(0, labelID, OBJPROP_TEXT, sparam); // ラベルのテキストを更新
    ChartRedraw(); // チャートオブジェクトの強制再描画
  }
}

ユーザイベントかどうかをチェックする

idCHARTEVENT_CUSTOMより大きい場合、このイベントがユーザイベントであることを示します。ユーザイベントは、ユーザが定義したカスタムイベントであり、標準のシステムイベントとは異なります。

ブロードキャストメッセージの処理

idがbroadcastEventIDと等しい場合、これはブロードキャストメッセージが受信されたことを示します。Print関数を使用して、ブロードキャストメッセージを受信したことをログに出力します。このとき、lparamには送信元チャートのIDが含まれています。

その他のユーザイベントの処理

idbroadcastEventIDではない場合、これはその他のユーザイベントを処理する部分です。まず、イベントのテキストメッセージをsparamから取得します。このメッセージは、イベントに関連する追加情報を含む文字列です。

Print関数を使用して、ユーザイベントを処理することをログに出力します。これにより、デバッグ時にイベントが正しく処理されているかを確認できます。

メッセージをラベルで表示する

次に、ObjectSetString関数を使用して、ラベルオブジェクトのテキストを更新します。ラベルの名前はlabelIDで指定され、テキストはsparamの内容に設定されます。これにより、受信したイベントメッセージがラベルに表示されます。

チャートオブジェクトの強制再描画

最後に、ChartRedraw関数を呼び出してチャートオブジェクトを強制的に再描画します。これにより、ラベルのテキストが正しく表示され、チャート上のオブジェクトの状態が更新されます。

この部分のコードは、ユーザが定義したカスタムイベントを処理し、その内容をラベルに表示する役割を担っています。また、ブロードキャストメッセージの受信をログに出力することで、他のチャートからのメッセージも処理します。

BroadcastEvent関数の定義部分

全ての開いているチャートにブロードキャストイベントを送信する関数

BroadcastEvent関数は、全ての開いているチャートに対してカスタムイベントを送信するために使用されます。この関数は、特定のイベントIDとメッセージをすべてのチャートに送信し、複数のチャート間で情報を共有する際に役立ちます。

//+------------------------------------------------------------------+
//| 全ての開いているチャートにブロードキャストイベントを送信する関数 |
//+------------------------------------------------------------------+
void BroadcastEvent(long lparam, double dparam, string sparam)
{
  int eventID = broadcastEventID - CHARTEVENT_CUSTOM; // イベントIDを設定
  long currChart = ChartFirst(); // 最初のチャートを取得
  int i = 0; // カウンタを初期化
  while (i < CHARTS_MAX) // 開いているチャートは確実に CHARTS_MAX 以内
  {
    EventChartCustom(currChart, eventID, lparam, dparam, sparam); // カスタムイベントを送信
    currChart = ChartNext(currChart); // 次のチャートを取得
    if (currChart == -1) break; // チャートリストの最後に達した場合ループを終了
    i++; // カウンタを増加
  }
}

イベントIDの設定

まず、broadcastEventIDからCHARTEVENT_CUSTOMを引いた値をeventIDとして設定します。このイベントIDは、他のイベントと区別するための一意な識別子として使用されます。

最初のチャートを取得

ChartFirst関数を使用して、最初のチャートの識別子を取得します。ChartFirst関数は、開いている最初のチャートのIDを返します。この識別子を使って、最初のチャートに対してカスタムイベントを送信します。

カウンタの初期化

iというカウンタを初期化します。このカウンタは、開いているチャートの数を追跡するために使用されます。

whileループの開始

while文を使用してループを開始します。このループは、開いているすべてのチャートに対してカスタムイベントを送信するために使用されます。ループの条件はi < CHARTS_MAXです。CHARTS_MAXは、同時に開くことができる最大のチャート数を示します。

カスタムイベントの送信

EventChartCustom関数を使用して、現在のチャートにカスタムイベントを送信します。currChartは現在のチャートの識別子で、eventIDは先ほど設定したイベントIDです。lparamdparamsparamは、イベントに関連する追加情報を渡します。

次のチャートを取得

ChartNext関数を使用して、次のチャートの識別子を取得します。ChartNext関数は、現在のチャートの次に開いているチャートのIDを返します。

ループの終了条件

if (currChart == -1) break;という条件で、チャートリストの最後に達した場合にループを終了します。ChartNext関数-1を返した場合、それはリストの最後に達したことを意味します。

カウンタの増加

最後に、i++でカウンタを増加させます(インクリメント)。この操作は、ループが正しく終了するために必要です。

このBroadcastEvent関数は、開いているすべてのチャートにカスタムイベントを送信するための重要な役割を果たします。

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