English Deutsch
preview
プライスアクション分析ツールキットの開発(第47回):MetaTrader 5で外国為替セッションとブレイクアウトを追跡する

プライスアクション分析ツールキットの開発(第47回):MetaTrader 5で外国為替セッションとブレイクアウトを追跡する

MetaTrader 5トレーディングシステム |
16 0
Christian Benjamin
Christian Benjamin

はじめに

外国為替市場は24時間稼働しており、世界中の主要な金融センターを順番に巡りながら取引がおこなわれています。各地域にはそれぞれ異なる特徴があります。アジアセッションは比較的静かに1日をスタートし、東京市場は最初の明確な方向性を示すことが多く、ロンドン市場では取引量とボラティリティが大きく増加します。そしてニューヨーク市場では、その勢いが後半まで続き、頻繁な反転やトレンド継続が見られます。現在どのセッションがアクティブなのかを認識することで、トレーダーは市場のスピード、ボラティリティ、流動性の変化に適応することができます。

初心者トレーダーにとって、これらのセッションを把握するのは混乱しやすいものです。ブローカーのサーバー時間はローカル時間と異なることが多く、手動でセッション時間を計算するとミスにつながりやすくなります。All Sessions EAは、この問題を解決するために、ブローカーのサーバー時間と自動的に同期し、アジア、東京、ロンドン、ニューヨークの各セッションを正確な時間でチャート上に表示します。これにより、初心者でも、セッションがどのように1日の中で引き継がれ、セッションの切り替わりとともに価格の挙動がどのように変化するかを視覚的に理解できます。

単なる可視化にとどまらず、このEAには、セッションの表示と非表示を切り替えるチャート上のトグルボタン、情報パネル、そしてリアルタイムのイベントを通知するスクロール式のティッカーヘッドラインといったインタラクティブな機能も含まれています。さらに、現在の価格が前のセッションの高値または安値を更新した際に通知するブレイクアウトアラート機能も統合されており、ボラティリティの変化を予測し、より正確なタイミングで取引をおこなうことが可能になります。完全な同期性、視認性の向上、直感的なレイアウトに加え、改良版では4つすべてのグローバルセッションが強調表示され、H/L/O/Cラベルも均等に配置されることで、明確で一貫した参照が可能になっています。  

本記事では、これらの機能をMQL5で段階的に実装する方法を解説します。インターフェースの設計から、リアルタイム監視やアラートをおこなうロジックの構築まで、順を追って説明していきますので、ぜひ最後までご覧ください。


内容


ツールの設計

エキスパートアドバイザー(EA)を構築する前に、まず取引セッションが何を意味し、なぜ市場分析において重要なのかを理解することが不可欠です。24時間稼働するFX市場は、アジア、東京、ロンドン、ニューヨークという4つの主要市場を循環しており、それぞれが異なる流動性とボラティリティの特性を持っています。歴史的に見ると、アジア市場は比較的穏やかに推移し、東京市場で最初の方向性が生まれ、ロンドン市場では力強い値動きが発生し、ニューヨーク市場では勢いの継続や反転によって1日を締めくくることが多く見られます。しかし、ブローカーのサーバーは異なるタイムゾーンで運用されているため、これらのセッションを手動でチャート上に特定しようとすると、特に初心者トレーダーにとっては、ローカル時間と市場時間を混同しやすく、誤りにつながる可能性があります。All Sessions EAは、この複雑さを解消するために、ブローカーのサーバー時間を基準として使用し、タイムゾーンの違いに関係なく、4つすべてのセッションが正確に整列して表示されるよう設計されています。これにより、トレーダーはグローバルなセッションの動きをリアルタイムで把握できる、実用的なマップを手にすることができます。

EAの目的

このEAは、セッション分析を視覚的、インタラクティブ、実践的におこなえるよう設計されています。

  1. 市場サイクルの可視化:アジア、東京、ロンドン、ニューヨークの各セッションを、正確な開始と終了時間に基づいて色付きの矩形で自動描画します。
  2. 操作性の簡素化:インジケーター設定を開くことなく、チャート上のボタンで各セッションの表示と非表示を切り替えられます。
  3. 重要データのリアルタイム監視:各セッションのH/L/O/C(高値/安値/始値/終値)を、整ったテキストラベルでチャート上に表示します。
  4. 自動同期:ユーザーのPC時間ではなく、常にブローカーのサーバー時間を基準に動作します。
  5. 売買シグナルの強調表示:現在価格が直前のセッションの高値または安値を突破した際に、即座にアラートを生成します。
  6. 情報の整理表示:右上の情報パネルと、リアルタイムイベントを表示するスクロール式ティッカーによって、視覚的なフィードバックを提供します。

インターフェースと機能設計

ダッシュボードと同様に、チャート上のすべての要素には明確な役割があります。

要素 種類  用途
[Asia]ボタン OBJ_BUTTON
アジアセッション矩形の表示と非表示を切り替え
[Tokyo]ボタン OBJ_BUTTON
東京セッション矩形の表示と非表示を切り替え
[London]ボタン OBJ_BUTTON
ロンドンセッション矩形の表示と非表示を切り替え
[New York]ボタン OBJ_BUTTON
ニューヨークセッション矩形の表示と非表示を切り替え
[Information]パネル OBJ_RECTANGLE_LABEL + OBJ_LABEL
現在アクティブなセッションと状態を表示
ティッカーヘッドライン OBJ_LABEL
取引更新情報やアラートをチャート下部にスクロール表示
セッション矩形 OBJ_RECTANGLE
各セッションの取引時間を色分け表示
セッションラベル OBJ_TEXT
各セッションのH/L/O/C値を各セッションにつき1回表示(当日のみ)

すべてのコントロールはObjectCreate()を使用してプログラム的に生成され、ユーザー操作や時間の経過に応じて動的に更新されます。高ボラティリティ時でも、インターフェースは軽量かつレスポンシブに保たれます。

ビジュアルデザイン

視認性と余白の確保が重要です。このバージョンでは、セッションラベル間の垂直オフセットを均等に調整し、ロンドンと東京、東京とアジアの間隔が同じになるよう設計されています。これにより、チャートのスケールに関係なく、テキストの重なりを防ぎ、読みやすさを維持します。また、一貫した配色によって各セッションを明確に区別しています。  

  • スカイブルー:アジア
  • ライトグリーン:東京
  • ライトピンク:ロンドン
  • ゴールド:ニューヨーク

スクロール式ティッカーはチャート下部に表示され、TickerColor入力によって、トレーダーの好みのカラーパレットに合わせることができます。右上には、黒背景のコンパクトな情報パネルが配置され、白色のArialフォントで現在のセッション状態を鮮明に表示します。

機能要件

ロジックはモジュール化され、イベント駆動型で構成されています。

ロジック 説明
ボタン操作
ユーザーのクリックによりOnChartEvent()が呼び出され、即座にセッション描画とパネル表示を更新
セッション計算
ブローカーのサーバー時間から開始および終了時刻を算出し、過去バーからH/L/O/Cを取得して矩形を描画
タイマーイベント
毎秒、ビジュアル更新、ティッカーのスクロール、セッション開始と終了およびブレイクアウト条件を確認
 ブレイクアウト検出 現在価格が直前のセッションの高値または安値を超えた場合、画面表示、音声アラート、ティッカー通知を実行
リソース効率
軽量なOBJ_RECTANGLEとOBJ_TEXTのみを使用し、インジケーターバッファを使わないことでCPU負荷を最小化

コアロジックの概念

このシステムは、ブローカーのサーバー時間を基準としたシンプルな循環ロジックに基づいています。
段階 説明
初期化
ボタン、パネル、ティッカーを作成し、前日と当日のセッションを描画
監視
1秒タイマーでTimeCurrent()を基準にセッションの開始、終了とアラートを管理
視覚化の更新
毎分、ブローカーのサーバー時間との同期を保つためにセッションを再描画
操作応答
ボタン操作により即座に表示状態とステータステキストを更新

この設計により、コードはモジュール化され、可読性と拡張性が高く保たれます。そのため、将来的にシドニーセッションの追加、プッシュ通知、統計的平均値などの機能拡張も容易におこなえます。 


インターフェースの構築

機能的なインターフェースは、あらゆるインタラクティブEAの中核となる要素です。All Sessions EAでは、設定ウィンドウの奥に埋もれた入力パラメータに頼るのではなく、すべての重要な操作要素をチャート上に直接配置しています。これにより、トレーダーはセッションの表示と非表示を切り替えたり、必要な情報を即座に確認したり、ライブ分析を中断することなくリアルタイムの更新情報を追跡したりすることができます。MetaTrader 5では、OBJ_BUTTON、OBJ_LABEL、OBJ_RECTANGLE_LABELといったチャートオブジェクトを使用してグラフィカルコンポーネントを作成します。各要素は、位置、サイズ、色、その他のプロパティによって定義されており、どのようなチャートスタイルにおいても一貫性のあるインターフェースを維持できるよう設計されています。

レイアウトコンセプト

チャートのレイアウトは、実用的な視覚的階層に基づいて設計されています。
エリア 要素 説明
左上 アジア/東京/ロンドン/ニューヨークの切替ボタン  主な操作コントロール(各ボタンは対応するセッションボックスの独立したON/OFFスイッチとして機能)
右上 [Information]パネル 各セッションの現在のON/OFF状態を示す黒い矩形パネル
メインチャートエリア 色付き矩形 + テキストラベル
重なりを防ぐために均等な間隔で配置されたセッションの時間帯とH/L/O/Cデータ
左下 スクロール式ティッカーヘッドライン
アラートや更新情報をリアルタイムで表示するライブフィード

この配置により、価格ローソク足を中央に保ちつつ、インターフェース要素は未使用の余白に収められるため、小さな画面でも高い視認性が確保されます。

セッションボタンの作成

各ボタンは、以下のヘルパー関数によって作成されます。

void CreateButton(string name,string text,int x,int y,color c)
{
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
   ObjectSetInteger(0,name,OBJPROP_XSIZE,110);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,20);
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,clrDimGray);
   ObjectSetInteger(0,name,OBJPROP_COLOR,c);
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,9);
   ObjectSetString (0,name,OBJPROP_TEXT,text);
}

このルーチンにより、4つのボタンが2列に配置されます。

CreateButton("BTN_ASIA","Asia ON/OFF",10,20,clrSkyBlue);
CreateButton("BTN_TOKYO","Tokyo ON/OFF",125,20,clrLightGreen);
CreateButton("BTN_LONDON","London ON/OFF",240,20,clrLightPink);
CreateButton("BTN_NEWYORK","New York ON/OFF",10,45,clrGold);

各ボタンはOnChartEvent()によってキャプチャされたイベントをトリガーします。 クリックすると、対応するブール値(showAsiashowTokyoなど)が反転し、表示されているセッションが再描画され、パネルが更新され、ティッカーヘッドラインにステータスメッセージが表示されます。 これにより、トレーダーはライブ更新を停止することなく即座に制御できるようになります。

情報パネルの構築

右側の情報ボックスはミニダッシュボードとして機能します。これは、背景の矩形(OBJ_RECTANGLE_LABEL)と、各セッションの可視性状態を表示するテキストラベル(OBJ_LABEL)で構成されています。

ASIA    : ON
TOKYO   : OFF
LONDON  : ON
NEWYORK : OFF
プログラム的には次のように構築されます。
ObjectCreate(0,"PANEL_BG",OBJ_RECTANGLE_LABEL,0,0,0);
ObjectSetInteger(0,"PANEL_BG",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
ObjectSetInteger(0,"PANEL_BG",OBJPROP_XDISTANCE,360);
ObjectSetInteger(0,"PANEL_BG",OBJPROP_YDISTANCE,20);
ObjectSetInteger(0,"PANEL_BG",OBJPROP_XSIZE,360);
ObjectSetInteger(0,"PANEL_BG",OBJPROP_YSIZE,110);
ObjectSetInteger(0,"PANEL_BG",OBJPROP_BGCOLOR,clrBlack);

更新ルーチンUpdatePanel()は、ボタンの状態が変化するか再描画が発生するたびにその内容を更新します。 この情報を画面に表示しておくと、初心者は現在どのセッションを閲覧しているかを理解しやすくなります。

ティッカーヘッドラインの作成

チャートの左下にティッカーが表示され、「ロンドンセッションが開始」や「ニューヨークが直前のロンドン高値を上抜け」などのアラートを表示します。これはOBJ_LABELオブジェクトで実装されており、OnTimer内で毎秒テキストを変更することでスクロール表示をおこなっています。

ObjectCreate(0,"TICKER_OBJ",OBJ_LABEL,0,0,0);
ObjectSetInteger(0,"TICKER_OBJ",OBJPROP_CORNER,CORNER_LEFT_LOWER);
ObjectSetInteger(0,"TICKER_OBJ",OBJPROP_XDISTANCE,10);
ObjectSetInteger(0,"TICKER_OBJ",OBJPROP_YDISTANCE,18);
ObjectSetInteger(0,"TICKER_OBJ",OBJPROP_COLOR,TickerColor);

1秒ごとのタイマーによってラベル内の文字が移動し、プロフェッショナルなニュースフィードを模した滑らかなスクロール効果を実現しています。

可読性と間隔の管理

複数のセッションを同時に表示すると、矩形の上部付近でラベルが重なってしまうことがあります。混雑を解消するために、このEAでは次の式を用いて、各ラベルに動的な垂直オフセットを導入しています。

double offsetY = (slot + 1) * _Point * 120;

この等間隔の乗数により、アジア ↔ 東京、東京 ↔ ロンドン間の隙間が常に一定に保たれ、すべてのセッションで同一の視覚的間隔が確保されます。また、銘柄の価格精度(_Point)に応じて自動的にスケーリングされるため、どの銘柄でもラベル間の相対的な間隔が維持されます。

カラーパレットとフォントの選択

各セッションには明確に異なる色調が割り当てられており、トレーダーは凡例やツールチップを確認しなくても、即座に市場の動きを識別できます。アジアセッションはスカイブルーで表示され、値動きが比較的穏やかで安定しやすい一日の初期段階を表現しています。東京セッションにはライトグリーンが使用され、日本市場のオープンとともにボラティリティが高まり始める「再始動」の感覚を表しています。ロンドンセッションには、前の色と強くコントラストするライトピンクを採用し、欧州市場参入による最も取引が活発な時間帯を明確に示します。最後に、ニューヨークセッションはゴールドで描画され、終盤の勢いと、世界市場が日次クローズへ向かう流れを象徴しています。

補助的なテキスト要素も一貫したビジュアルルールに従っています。すべてのセッションラベルはそれぞれのセッションカラーで表示され、パネルやティッカー内の情報テキストには、暗い背景でも読みやすい白色のサンセリフ体フォントが使用されています。フォントの太さとサイズは意図的に控えめに設定されており、急激な相場変動時やチャート背景テーマを変更した場合でも、視認性を保ちつつ邪魔になりません。この明確なカラーコーディングと慎重に選ばれたタイポグラフィの組み合わせにより、EAはどのチャート上でも高い可読性と美的バランスを維持します。  

テキストにはサンセリフ体(Arialまたはシステム既定)が使用され、パネル用テキストは白、セッションラベルは各セッションカラーで表示されます。フォントは、明るい背景と暗い背景のどちらに対しても十分に判読できる太さに設定されています。

インターフェースの統合

初期化時(OnInit())に、EAは次の処理を呼び出します。

CreateButton(... four times …);
CreatePanel();
CreateTicker();
DrawAll();
UpdatePanel();
UpdateTicker(Headline);

この一連の処理により、EAが読み込まれた瞬間に完全なインターフェースが構築されます。その後の更新はすべてタイマーとイベントハンドラによって動的に処理されるため、トレーダーが手動で更新する必要は一切ありません。


ロジックの実装

インターフェースが整ったら、次に必要なのはEAが「考え」「反応し」「実際の市場と同期し続ける」ためのロジックです。目的は、アジアから東京、ロンドン、そしてニューヨークへと続くグローバルな取引日の流れを、トレーダーがリアルタイムで観察できるようにすることです。同時に、EAは各セッションを自動的に描画し、市場の動きをレポートし、ブレイクアウトの機会があればアラートを発します。このセクションでは、そのロジックの各要素を詳細に解説し、対応するMQL5の実装例を示していきます。

MetaTrader 5における時間

すべての取引セッションは「時間」を軸に動きますが、MetaTraderにおける時間にはいくつかの基準があります。たとえば、ローカルコンピュータ時間、UTC、あるいはブローカーのサーバー時間です。このEAでは、絶対的な正確性を確保するために、常にブローカーのサーバー時間を使用します。これはTimeCurrent()によって取得されます。ウィンドウの描画からアラートのトリガーに至るまで、すべての計算はこの値を基準におこなわれるため、どのブローカーやタイムゾーンで使用しても、セッションは常に正しくチャート上に整列します。

// Truncate to broker's midnight (00:00)
datetime Day0(datetime t)
{
   MqlDateTime mt;
   TimeToStruct(t, mt);
   mt.hour = mt.min = mt.sec = 0;
   return StructToTime(mt);
}
基準となる日付が確定したら、セッションの開始時刻と終了時刻は、人が読みやすい時刻文字列(例:「07:00」「16:00」)を分単位に変換することで構築されます。
int ParseHM(string s)
{
   int split = StringFind(s, ":");
   if(split < 0) return 0;
   return 60 * (int)StringToInteger(StringSubstr(s, 0, split))
        +     (int)StringToInteger(StringSubstr(s, split + 1));
}

datetime MakeTime(datetime base, string tstr)
{
   return base + ParseHM(tstr) * 60;    // add minutes to 00:00
}
概念的には、Day0()をその取引日の「アンカー」と考え、MakeTime()を深夜0:00からの分数を測る定規のようなものと捉えてください。ローカルコンピュータの表示時刻がGMT+2、EST、CETなどいずれであっても関係ありません。すべてはブローカーの時間軸に基づいて処理されます。

各セッションの高値と安値を見つける

時間が定義されたら、次にEAはその範囲内のH/L/O/Cを計算する必要があります。これにより、各セッションの矩形をチャート上のどこに、どの高さで描画すべきかを正確に把握できるようになります。

void MakeSession(datetime base, string s1, string s2,
                 string pref, string name, color col, int order,
                 double &outHi, double &outLo, double &outOp, double &outCl,
                 bool labelIt)
{
   int m1 = ParseHM(s1), m2 = ParseHM(s2);
   datetime t1 = base + m1 * 60, t2 = base + m2 * 60;
   if(t2 <= t1) t2 += 86400;   // wrap around midnight if needed

   double hi = -DBL_MAX, lo = DBL_MAX, opn = 0, cls = 0;
   bool haveOpen = false;

   for(int i = 0; i < iBars(_Symbol, _Period); i++)
   {
      datetime bt = iTime(_Symbol, _Period, i);
      if(bt < t1) break;
      if(bt >= t1 && bt <= t2)
      {
         double bh = iHigh(_Symbol,_Period,i);
         double bl = iLow (_Symbol,_Period,i);
         if(bh > hi) hi = bh;
         if(bl < lo) lo = bl;
         if(!haveOpen){ opn = iOpen(_Symbol,_Period,i); haveOpen = true; }
         cls = iClose(_Symbol,_Period,i);
      }
   }

   if(hi > 0 && lo != DBL_MAX)
   {
      DrawSession(pref, name, col, t1, t2, hi, lo, opn, cls, order, labelIt);
      outHi = hi; outLo = lo; outOp = opn; outCl = cls;
   }
}

その仕組みは次のようになっています。  

  • ループは、そのセッション内の過去のローソク足のみをスキャン
  • 開始時間より前に移動した瞬間にループを停止し、CPUの使用を節約
  • 得られた値は、描画の座標としてだけでなく、将来のブレイクアウトアラートの参照ポイントとしても使用

セッションを描く

視覚的な明瞭さはDrawSession()関数によって実現されます。この関数は、セッションの開始時刻から終了時刻までの半透明の矩形を作成し、縦方向は計算された高値と安値に合わせます。各矩形には、オプションでそのセッションのH/L/O/Cを示す小さなテキストラベルを付けることもできます。

void DrawSession(string pref, string name, color col,
                 datetime t1, datetime t2, double hi, double lo,
                 double opn, double cls, int slot, bool labelIt)
{
   string box = pref + TimeToString(t1, TIME_DATE | TIME_MINUTES);
   SafeDelete(box);
   ObjectCreate(0, box, OBJ_RECTANGLE, 0, t1, hi, t2, lo);
   ObjectSetInteger(0, box, OBJPROP_COLOR, col);
   ObjectSetInteger(0, box, OBJPROP_BACK, true);
   ObjectSetInteger(0, box, OBJPROP_WIDTH, 1);

   if(labelIt)
   {
      string lbl  = box + "_LBL";
      string text = StringFormat("%s  H %.5f  L %.5f  O %.5f  C %.5f",
                                 name, hi, lo, opn, cls);
      DrawLabelNoOverlap(lbl, hi, slot, text, col);
   }
}

ヘルパーDrawLabelNoOverlap()は、セッションラベルが常に一定の間隔で配置されるようにテキストの位置を調整します。

void DrawLabelNoOverlap(string id,double baseY,int slot,string text,color col)
{
   datetime anchor = iTime(_Symbol,_Period,0);
   datetime offsetT = anchor - 4*PeriodSeconds(_Period);
   double offsetY = (slot+1) * _Point * 120;   // uniform vertical spacing

   ObjectCreate(0, id, OBJ_TEXT, 0, offsetT, baseY + offsetY);
   ObjectSetInteger(0, id, OBJPROP_COLOR, col);
   ObjectSetInteger(0, id, OBJPROP_FONTSIZE, 8);
   ObjectSetString (0, id, OBJPROP_TEXT, text);
}

ヘルパーDrawLabelNoOverlap()は、セッションラベルが常に一定の間隔で配置されるようにテキストの位置を調整します。乗数120は、ロンドンのラベルが東京の下に配置される距離を、東京がアジアの下にある距離と同じにすることを保証し、どの金融商品の価格スケールでも対称性を保ちます。

セッションのライフサイクルの制御

毎秒描画し直すとリソースを無駄にする可能性があるため、このEAではスマートな更新リズムを採用しています。タイマーイベントは1秒ごとに発生します。 

void OnTimer()
{
   ScrollTicker();            // move the text ticker
   CheckSessionAlerts();      // detect openings & closings
   CheckBreakouts();          // look for price range breaks

   static int counter = 0;
   if(++counter >= 60)        // refresh once per minute
   {
      DrawAll();
      UpdatePanel();
      counter = 0;
   }
}

毎分、既存の矩形をDeletePrefix()によって削除し、現在のサーバー時刻と同期させるために再作成します。すべてがイベント駆動で動作するため、複数のチャートを開いていてもEAはCPUを効率的に使用します。

セッションの開始と終了の検出

CheckSessionAlerts()関数は、現在のブローカー時刻を各セッションの開始および終了スケジュールと比較します。境界を跨いだ瞬間に、短いメッセージをティッカーに表示し、必要に応じてサウンドアラートをトリガーします。

void CheckSessionAlerts()
{
   datetime now  = TimeCurrent(), base = Day0(now);
   datetime asO  = MakeTime(base, AsiaStart),   asC = MakeTime(base, AsiaEnd);
   datetime lnO  = MakeTime(base, LondonStart), lnC = MakeTime(base, LondonEnd);
   datetime nyO  = MakeTime(base, NewYorkStart),nyC = MakeTime(base, NewYorkEnd);

   if(!openedAsia  && now >= asO){ openedAsia  = true;  UpdateTicker("Asia session opened");  }
   if(!closedAsia  && now >= asC){ closedAsia  = true;  UpdateTicker("Asia session closed");  }
   if(!openedLondon&& now >= lnO){ openedLondon= true;  UpdateTicker("London session opened");}
   if(!closedLondon&& now >= lnC){ closedLondon= true;  UpdateTicker("London session closed");}
   if(!openedNewYork&& now >= nyO){openedNewYork=true;  UpdateTicker("New York session opened");}
   if(!closedNewYork&& now >= nyC){closedNewYork=true;  UpdateTicker("New York session closed");}
}

実行時には、これらの通知がスクロールするヘッドライン内に滑らかに表示され、トレーダーは世界市場の移行をリアルタイムで把握できます。

ブレイクアウト検出

時間管理にとどまらず、トレーダーは価格が直前のセッションの値幅を抜けた瞬間を把握したい場合が多くあります。EAのブレイクアウトエンジンは、まさにその役割を果たします。

void CheckBreakouts()
{
   double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

   // Example: New York breaking the prior London range
   if(prevLondonHigh > 0)
   {
      if(!newYorkBreakHighDone && bid > prevLondonHigh)
      {
         newYorkBreakHighDone = true;
         UpdateTicker("New York breaks above prior London high");
      }
      if(!newYorkBreakLowDone && bid < prevLondonLow)
      {
         newYorkBreakLowDone = true;
         UpdateTicker("New York breaks below prior London low");
      }
   }
}

各フラグ(BreakHighDoneBreakLowDone)は、方向ごとにアラートが一度だけ送信されることを保証し、トレンドが継続している間でもメッセージを簡潔かつ関連性の高いものに保ちます。

「ロンドン市場が直前の東京市場高値を上抜けた」といった突然のアラートを見ることで、トレーダーは市場のボラティリティが拡大していることを即座に判断できます。これはブレイクアウトやリバーサル戦略のタイミングを測るうえで非常に有効なツールです。

ユーザー操作の処理

インターフェースは対話的です。トレーダーがセッションボタンをクリックすると、MetaTraderはOnChartEvent()で捕捉されるチャートイベントを送信します。EAはそれに応じてブール値を切り替え、影響を受ける矩形を再描画し、情報パネルを更新します。

void OnChartEvent(const int id,const long &l,const double &d,const string &s)
{
   if(id == CHARTEVENT_OBJECT_CLICK)
   {
      if(s == BTN_ASIA)    { showAsia    = !showAsia;    DrawAll(); UpdatePanel(); UpdateTicker("Asia toggle changed"); }
      if(s == BTN_TOKYO)   { showTokyo   = !showTokyo;   DrawAll(); UpdatePanel(); UpdateTicker("Tokyo toggle changed"); }
      if(s == BTN_LONDON)  { showLondon  = !showLondon;  DrawAll(); UpdatePanel(); UpdateTicker("London toggle changed"); }
      if(s == BTN_NEWYORK) { showNewYork = !showNewYork; DrawAll(); UpdatePanel(); UpdateTicker("New York toggle changed"); }
   }
}

この即時の応答により、モジュール性の概念が強化されます。つまり、ユーザーインターフェースの操作は分析ロジックから完全に分離されています。

初期化とクリーンアップ

2つのシンプルなルーチンがEAのライフサイクルを構成します。 

int OnInit()
{
   CreateButton(BTN_ASIA,   "Asia ON/OFF",   10, 20, AsiaColor);
   CreateButton(BTN_TOKYO,  "Tokyo ON/OFF",  125,20, TokyoColor);
   CreateButton(BTN_LONDON, "London ON/OFF", 240,20, LondonColor);
   CreateButton(BTN_NEWYORK,"New York ON/OFF",10,45, NewYorkColor);

   CreatePanel();
   CreateTicker();
   DrawAll();
   UpdatePanel();
   UpdateTicker(Headline);

   EventSetTimer(1);     // start 1‑second timer
   return INIT_SUCCEEDED;
}

void OnDeinit(const int reason)
{
   EventKillTimer();              // stop the timer
   DeletePrefix(PREF_ASIA);
   DeletePrefix(PREF_TOKYO);
   DeletePrefix(PREF_LONDON);
   DeletePrefix(PREF_NEWYORK);
}

起動時、EAはフルインターフェースを構築します。削除されると、孤立した矩形が残らないよう完全にクリーンアップします。

ロジックフローの実践

連続的なプロセスを視覚化すると以下のようになります。

各ステージは独立して動作しつつ、共有のグローバルデータを通じて通信します。その結果、常に状況を把握し、自動的に修正するツールが実現されます。

EAのコンパイルと実行

スクリプト全体をMetaEditorにコピーして保存します。

MQL5\Experts\All Sessions Toggle EA.mq5

次に、[コンパイル](F7)を押して、MetaTrader 5の任意のチャートにEAをアタッチします。読み込まれると、チャートは瞬時にインタラクティブなダッシュボードに変わります。左上にはアジア、東京、ロンドン、ニューヨークの各セッションを表す4つのトグルボタンが表示され、右上には黒い情報パネルが配置され、現在ONまたはOFFのセッションが表示されます。下部にはスクロールするティッカーヘッドラインがあり、ライブのステータスメッセージを報告します。メインチャートエリアには、前日および当日の取引日をカバーする色分けされた矩形が表示され、それぞれのH、L、O、C値が一度ずつラベル付けされ、迅速な参照が可能です。すべて正しくコンパイルされていれば、ターミナル下部の[エキスパート]タブに「Sessions viewer running.」というメッセージが表示され、初期化が成功したことが確認できます。


テストと検証

取引ツールを公開または使用する前には、徹底したテストが不可欠です。このEAの場合、テストによりグラフィカル要素、ロジック、時間管理などのすべてのコンポーネントが、異なるブローカー、銘柄、タイムゾーンでも一貫して動作することが確認されます。このセクションでは、EAの性能と信頼性を体系的に検証する方法を示します。

上の図は、Derivデモ口座(EURUSD H1)チャートでAll Sessions EAが動作している様子を示しています。テスト中、4つのセッション(アジア、東京、ロンドン、ニューヨーク)がすべて同時に有効になっています。各矩形は割り当てられた色で表示されます。アジアはスカイブルー、東京はライトグリーン、ロンドンはライトピンク、ニューヨークはゴールドです。左上のトグルボタン(「Asia ON/OFF」「Tokyo ON/OFF」など)は、DerivのMetaTrader 5環境内でインタラクティブインターフェースが正しく読み込まれたことを確認します。ボタンをクリックすると、対応するセッションボックスが瞬時に非表示または再描画され、このブローカーの環境下でもイベント処理と再描画機能が完全に応答することが示されます。右上の黒い情報パネルは、すべてのセッションのライブ状態を正確に表示します。  

  • ASIA :ON TOKYO :ON LONDON :ON NEW YORK :ON  

これは、UpdatePanel()ルーチンがセッション表示を制御するブール値とグラフィカルパネルを同期させたことを確認しています。その下には、アクティブなティッカーヘッドラインが「Sessions viewer running – toggle button」というテキストで表示され、ティッカーオブジェクトが正しく初期化され、重なりなくスクロールし続けることが確認できます。メインの価格エリアでは、色付き矩形がDerivのH1チャートのローソク足の時間境界に完全に揃って表示され、EAがTimeCurrent()を通じてDerivのサーバー時刻を正しく読み取っていることが示されます。各セッションにはH/L/O/Cラベルが1回だけ表示され、明確に確認できるようデザインルールが守られています。「NEW YORK H 1.16224」や「TOKYO H 1.16158 L 1.158xx」といった各セッションタイトル横の値は、EAがDerivの価格フィードからOHLCデータを正確に収集したことを示しています。EURUSD、USDCHF、GBPUSD、USDJPYの銘柄間で切り替えてもちらつきやパフォーマンスの遅延はなく、1秒間隔のタイマーリフレッシュ機構がDerivプラットフォーム上で安定して動作していることが確認されました。CPUとメモリの使用量もセッションを通して最小限に抑えられました。  

総合的に、このテストにより以下が検証されました。

  • EAはDerivのMetaTrader 5環境で正確に実行および描画されること
  • 時間の整合性とセッション長はグローバル標準に準拠していること
  • ボタン、パネル更新、ティッカーなどのインタラクティブ要素が滑らかに動作すること
  • ブレイクアウトアラートシステムが、価格が直前のセッションの高値や安値を超えたときに正確に作動すること

このDeriv環境での評価により、トレーディングセッションのロジック、描画ルーチン、アラート機能がリアルタイムチャート条件下でも安定しており、ブローカー仕様に準拠していることが確認されました。

下のGIFはアラートポップアップです。


結論

All Sessions EAの作成は、シンプルなコンセプト—取引日を世界の市場セッションごとに視覚的に区分する—が、洗練された分析ツールへと発展し得ることを示しています。当初はセッション時間を把握する補助として設計されましたが、このプロジェクトは完全なインタラクティブシステムへと成長し、ブローカーサーバー時刻とシームレスに同期し、ライブの市場変化を報告し、価格ブレイクアウトをリアルタイムでトレーダーに通知するようになりました。

色分けされた矩形、簡潔なセッションラベル、トグルボタン、スクロールするティッカーを組み合わせることで、EAは外国為替市場の連続するリズムを読みやすいストーリーに変換します。トレーダーは、どの地域が現在流動性を牽引しているか、ボラティリティがアジアから東京、ロンドン、ニューヨークへどのように移動するかを一目で把握できます。モジュール化されイベント駆動の構造により、これらの視覚要素はどのチャート上でも正確かつ軽量に保たれます。

新しいトレーダーにとって、EAは取引日の市場エネルギーの流れを明らかにする教育的ガイドとして機能します。経験豊富なユーザーにとっては、文脈を構築するオーバーレイとして役立ち、日中計画の効率化、ブレイクアウト挙動の確認、セッション分析の簡略化を実現します。  

開発サイクルにおいて、EAはDerivの取引環境で徹底的にテストされ、異なるチャートタイプや時間軸でも滑らかに動作しました。テスト結果は、Derivサーバー時刻との完全同期、オブジェクト描画の安定性、アラートの正確なタイミング、一貫したH/L/O/Cラベル更新を確認しました。連続運用中でも、EAは応答性の高いパフォーマンスときれいなグラフィック表示を維持し、Derivのライブおよびシミュレーション市場における効率性を実証しました。基盤となるアーキテクチャはモジュール化されているため、将来的なカスタマイズも簡単です。シドニーセッションの追加、プッシュ通知サポート、過去セッション値幅統計などの機能を、コアロジックを書き換えることなく容易に拡張できます。

最終的に、このEAは単なる色付きオーバーレイ以上の存在です。価格が何をしているかだけでなく、いつ、なぜ動くのかを理解するための教育的かつ分析的なパートナーです。各グローバルセッションの動きを追うことで、Derivプラットフォームや将来対応予定のブローカーを利用するトレーダーは、ボラティリティと流動性に関する明確で時間軸に基づいた視点を得ることができます。精度、明瞭さ、シンプルさを核とし、EAは24時間連続する市場を構造化され、セッションごとに、一目で理解できる形で、視覚的に直感的な体験へと変えます。 

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/19944

添付されたファイル |
All_Sessions_EA.mq5 (32.86 KB)
共和分株式による統計的裁定取引(第6回):スコアリングシステム 共和分株式による統計的裁定取引(第6回):スコアリングシステム
本記事では、共和分株式の統計的裁定取引に基づく平均回帰戦略のスコアリングシステムを提案します。流動性や取引コストから、共和分ベクトルの数(ランク)や回帰までの時間に至るまでの基準を示しつつ、時間足やルックバック期間のような戦略的基準も考慮し、スコアランキングを正しく評価する前に検討しています。バックテストの再現に必要なファイルも提供され、その結果についてもコメントしています。
迅速な取引判断を極める:実行麻痺を克服する 迅速な取引判断を極める:実行麻痺を克服する
UT BOT ATRトレーリングインジケーターは、個人向けにカスタマイズ可能なインジケーターであり、短期売買において素早い意思決定を好むトレーダー(スキャルパー)にとって非常に効果的です。また、長期取引をおこなうトレーダー(ポジショントレーダー)にとっても重要かつ非常に有効であることが実証されています。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
機械学習の限界を克服する(第6回):効果的なメモリクロスバリデーション 機械学習の限界を克服する(第6回):効果的なメモリクロスバリデーション
本記事では、時系列クロスバリデーションにおける従来のアプローチと、その前提に疑問を投げかける新しい考え方を比較します。特に、市場環境が時間とともに変化するという点を十分に扱えていないという、古典的手法の弱点に焦点を当てます。これらの問題を踏まえ、Effective Memory Cross-Validation (EMCV)という、ドメインを意識した検証手法を紹介します。このアプローチは、「過去データは多ければ多いほど良い」という長年の常識を見直すものです。