【MQL5】EventChartCustom関数の使い方と自動売買実装コード

1. EventChartCustom関数の概要と実務での活用法

MQL5のEventChartCustom関数は、指定したチャートに対して「カスタムイベント」を送信するための関数です。一言で言えば、「異なるチャートで動作しているEAやインジケーター間で通信を行うためのメッセージ送信機」です。

実務での活用シーン

実務開発において、この関数は以下のような高度なロジックを実装する際に不可欠です。

  • マルチ通貨監視システム: 特定の通貨ペア(例:USDJPY)で発生したシグナルを、別の通貨ペア(例:EURUSD)を表示しているEAに通知して相関トレードを行う。
  • GUI(操作パネル)との連携: チャート上に配置したボタン(インジケーター等で作成)をクリックした際、その操作命令をメインのEAに安全に渡す。
  • 計算負荷の分散: 重い計算を行うインジケーターと、約定処理を行うEAを分離し、計算完了後にEAへイベントを飛ばして注文を出させる。

初心者の方は「一つのEAにすべて書き込めばいい」と考えがちですが、コードが肥大化するとメンテナンスが困難になります。EventChartCustomを使いこなすことで、機能をモジュール化し、設計の柔軟性を劇的に向上させることができます。


2. 構文と戻り値

EventChartCustomの構文は以下の通りです。

bool EventChartCustom(
   long    chart_id,            // チャート識別子
   ushort  custom_event_id,     // イベントID(0〜65535)
   long    lparam,              // 整数型パラメータ
   double  dparam,              // 浮動小数点型パラメータ
   string  sparam               // 文字列型パラメータ
);

パラメーター解説

  1. chart_id: 送信先のチャートIDを指定します。自分自身なら 0 または ChartID() です。
  2. custom_event_id: ユーザー定義のイベント番号です。受け取り側では、定数 CHARTEVENT_CUSTOM にこの値を足した数値として認識されます。
  3. lparam / dparam / sparam: 送信したい具体的なデータです。数値、価格、通貨ペア名などを自由にパッキングできます。

戻り値

  • 送信に成功した場合は true、失敗した場合は false を返します。

3. 具体的な使い方・実践サンプルコード

以下は、「監視用インジケーターがシグナルを検知し、別のチャートにいるEAへ『買い注文』の指示を出す」という実用的なイメージのコードです。

送信側:インジケーター(またはスクリプト)

// 任意のタイミングでEAにイベントを飛ばす例
void SendSignalToEA(long targetChartID, double entryPrice)
{
   // イベントID「100」として、エントリー価格と通貨ペア名を送信
   // 実際には CHARTEVENT_CUSTOM + 100 として受信される
   if(!EventChartCustom(targetChartID, 100, 0, entryPrice, _Symbol))
   {
      Print("イベント送信失敗。エラーコード: ", GetLastError());
   }
   else
   {
      Print("EAへシグナル送信完了: ", _Symbol);
   }
}

受信側:EA(Expert Advisor)

// イベントを受け取るためのハンドラ
void OnChartEvent(const int id,
                  const long& lparam,
                  const double& dparam,
                  const string& sparam)
{
   // カスタムイベントID 100 を受信したかチェック
   if(id == CHARTEVENT_CUSTOM + 100)
   {
      Print("--- カスタムイベント受信 ---");
      Print("指示された通貨ペア: ", sparam);
      Print("指示された価格: ", dparam);

      // ここで実際の注文処理(OrderSend)などを呼び出す
      // CheckAndExecuteOrder(sparam, dparam);
   }
}

4. 使用上の注意点とよくあるエラー

1. イベントキューのパンク

MQL5のイベントキュー(待ち行列)にはサイズ制限(1024個)があります。OnTickのたびに高頻度でEventChartCustomを呼び出すと、キューが溢れてイベントが無視される原因になります。必要な時だけ送る設計にしましょう。

2. イベントIDのオフセット

初心者が見落としがちなのが、受信側でのID判定です。送信側で 100 と指定しても、受信側(OnChartEvent)の id 引数には CHARTEVENT_CUSTOM + 100 という値が入ってきます。単に if(id == 100) と書いても反応しません。

3. チャートIDの取得

送信先の chart_id が正しくないと届きません。ChartFirst()ChartNext() を使ってループで探すか、グローバル変数(GlobalVariableSet)にあらかじめ自分のチャートIDを書き込んで共有しておく手法が一般的です。


5. 【重要】自動売買における約定スピードと環境の罠

どれほど高度なアルゴリズムをEventChartCustomで組み上げたとしても、プログラムを動かす「環境」が貧弱であれば、その努力はすべて水の泡となります。特に日本の一般的な家庭用インターネット回線やPC環境では、ブローカーのサーバーとの間に数十〜数百ミリ秒の「レイテンシ(通信遅延)」が発生しています。この遅延は、急変時のスリッページを増大させ、バックテストの結果とはかけ離れた致命的な損失を生む直接的な原因となります。

プロのクオンツやアルゴリズムトレーダーにとって、トレード専用のVPS(仮想専用サーバー)を利用することは「推奨」ではなく「絶対条件」です。ブローカーの取引サーバーと同じデータセンター内、あるいは極至近距離に設置されたVPS上でEAを稼働させることで、ネットワーク遅延を極限まで排除し、コンマ数秒を争う約定競争で優位に立つことができます。安定した電源、強固なネットワーク、そして低レイテンシ環境こそが、システムトレーダーが最初に投資すべき最も重要なインフラなのです。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

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