English Deutsch
preview
MQL5標準ライブラリエクスプローラー(第7回):CCanvasによるインタラクティブなポジションラベル表示

MQL5標準ライブラリエクスプローラー(第7回):CCanvasによるインタラクティブなポジションラベル表示

MetaTrader 5 |
18 0
Clemence Benjamin
Clemence Benjamin

内容

  1. はじめに
  2. 概念
  3. 実装
  4. テスト結果
  5. 結論
  6. 添付ファイル


はじめに

MQL5標準ライブラリを解説するシリーズへようこそ。本連載の各回が、皆さまにとって有益で、新たな気づきを得られる内容となっていれば幸いです。学習を進めていくと、MQL5プログラミングは数多くの要素を積み重ねながら習得していくものであり、常に新しい知識や改善点、発見があることに気付くでしょう。そして、そのすべての学びは最終的に一つの目的へとつながります。それは、効率的で信頼性が高く、使いやすい取引ツールをトレーダーに提供することです。 

今回は、MetaTrader 5のチャート画面とツールボックスの[取引]タブとの間に存在する、操作性の課題に着目します。通常、ポジションはツールボックスの[取引]タブで管理します。しかし、そこには注文や他の取引と並んで表示されるため、リアルタイムで特定のポジションだけに注目することが難しい場合があります。この問題を解決するため、本記事ではチャート上へのポジションラベル表示を実装します。各保有ポジションに対応するラベルをチャート上へ直接表示することで、現在の価格や市場構造とポジションとの関係を一目で把握できるようになります。これにより、市場の状況を確認しながら、「今ポジションを決済すべきか、それとも保有を継続すべきか」を、より迅速かつ的確に判断できるようになります。

本記事は、前回までのウィザードで生成したエキスパートアドバイザー(EA)の最適化に関する内容を踏まえつつも、あえて視点を変えて解説を進めます。現段階では最適化をさらに掘り下げるのではなく、一度シンプルなテーマへ戻ることで、基礎理解をより確実なものにすることを目的としています。第4回第5回第6回では、Wizardとその各種モジュールの利用方法を学び、最小限のコーディングでEAを作成するための基礎を築きました。最適化は非常に重要なテーマではありますが、その内容は幅広く奥深いため、本連載の後半で改めて時間をかけて詳しく取り上げる予定です。

次のセクションでは、実装へ進む前に、本記事で扱う手法の基本概念を解説します。この概念の理解は、本記事の中でも特に重要な部分です。どのような仕組みで動作するのか、そしてなぜこのアプローチが有効なのかを理解する土台となります。実装セクションへ進む前に、ぜひこの考え方を十分に理解してから読み進めてください。


概念

MetaTrader 5では、ポジションは主にツールボックス内の[取引]タブから管理されます。保有ポジションや指値・逆指値注文の数が増えるにつれて、このリストベースの管理方式はすぐに煩雑になり、直感的な把握が難しくなります。さらに重要な点として、エントリー時の市場構造や価格の動きといった文脈情報は、ポジションそのものとは視覚的に分離されてしまいます。

MetaTrader 5には既に基本的なチャート上でのポジション表示機能が存在しますが、その機能は限定的です。たとえば、下図のようにエントリーレベル、注文タイプ、ロットサイズ、注文価格などはチャート上に表示されます。

図1:チャート上のデフォルトのポジション管理

図1では、チャート上にポジションのエントリーレベル、タイプ、ロット数量が表示され、右側の価格軸はリアルタイムで更新され続けます。しかし、ここには重要な要素が欠けています。それは、ポジション単位での明確かつ動的な損益表示です。また、標準のチャート表示要素はスタイルの柔軟性が低く、チャート上から直接ポジションを直感的に決済する仕組みも備わっていません。ポジションの決済自体は右クリックメニューやツールボックスの[取引]タブから可能ですが、本記事では「チャート上でどこまで完結できるか」に焦点を当てます。

これらの制約は改善の余地を示しており、その解決にはMQL5標準ライブラリの活用が有効です。カスタムでインタラクティブな描画要素をチャートに追加することで、取引データと価格アクションの間に存在するギャップを埋めることができます。次のセクションでは、ポジション情報、リアルタイム損益表示、およびチャート上からの迅速な決済操作を統合する概念的な解決策を紹介します。現時点では決済機能はツールボックス側にも存在しますが、本記事では「チャートがどこまで役割を拡張できるか」に注目します。以下にその概念を示します。

ポジションのフローティングバブル

図2:ポジション情報フローティングバブルの概念

図2では、ポジション表示手法をグラフィカルな吹き出し(バブル)として概念化し、注文チケットやリアルタイムの損益情報をチャート上に直接表示するイメージを示しています。ツールボックスの[取引]タブに依存するのではなく、ポジションは対応する価格と時間に紐づいたインタラクティブなバブルとして可視化されます。これにより、市場構造と取引状況を同時に把握できるようになります。

この設計により、ポジション管理は、文脈から切り離されたリスト管理から実際の取引コンテキスト内での管理へと移行します。各ポジションがエントリーポイントに視覚的に結び付けられることで、価格がポジションに対してどのように推移しているのかを即座に理解でき、判断速度と直感性が大幅に向上します。

このシステムは3層で構成されます。まず、戦略ロジック層はエントリー条件と注文発生を管理します。次に、可視化層はCanvasを用いてチャート上にポジション情報を描画します。最後にインタラクション層はユーザー入力を処理し、クリックなどの簡単な操作でポジション管理を可能にします。

これら3つの層を組み合わせることで、取引ロジック、チャート描画、ユーザー操作がシームレスに統合され、MQL5標準ライブラリを活用したより高度で直感的なトレードツールの基盤が形成されます。

本記事で扱う標準ライブラリのコンポーネント

本記事を通じて、以下のMQL5標準ライブラリの主要コンポーネントとその役割を理解できます。

  • Canvas:図形、テキスト、インタラクティブ要素などのカスタムグラフィックの描画
  • PositionInfo:チケット番号、建値、損益などのリアルタイムポジション情報の取得
  • Trade:注文の発注およびポジションの決済処理
  • Trend:移動平均などのトレンド系インジケータの構築および利用

これらのモジュールがどのように組み合わされて機能するかについては、次の実装セクションで実際のコードとともに詳しく解説します。


実装

このセクションでは、概念から実装へと移行します。ここでの目的は、高度なトレーディング戦略を構築することではなく、MQL5標準ライブラリの複数のコンポーネントを組み合わせて、統合されたインタラクティブシステムを構築できることを示すことにあります。

この解説を通して常に意識してほしいのは、ここで使用するすべてのクラスは本プロジェクトに限定されるものではなく、再利用可能な汎用コンポーネントであるという点です。「インタラクティブポジションラベラー」は、それらの機能を実践的かつ視覚的に理解するための一つの手段にすぎません。

MQL5プログラムにおいて、コンパイラが最初に認識するのは「機能」ではなく「メタデータ」です。このヘッダー部分は、プログラムが何をするかではなく、何であるかを定義します。ファイル名バナー、著作権情報、バージョン、説明などのプロパティは、正式な識別情報として機能します。これらはMetaTrader上でナビゲーター、ストラテジーテスター、ログなどに表示され、プログラムの識別や管理を支援します。

//+------------------------------------------------------------------+
//|                              Part7_InteractivePositionLabeler.mq5|
//|                        Copyright 2025, MQL5 Standard Lib Explorer|
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Clemence Benjamin"
#property version   "1.00" 
#property description "Interactive Position Info Bubbles with MA Cross Strategy"

メタデータブロックの後になって初めて、プログラムの構成要素を組み立て始めます。そのために標準ライブラリのファイルをインクルードします。この順序は単なるスタイルではなく、明確な思考モデルを反映しています。まず「このプログラムが何であるか」を定義し、その後に「どのような機能を持つか」を決めます。#includeディレクティブは、MQL5インストール内のルートディレクトリである MQL5\Include\ フォルダに存在する既製クラスを読み込みます。このルート構造を理解することは非常に重要です。なぜなら標準ライブラリのほぼすべてのコンポーネントはここを起点として、Trade、Canvas、Indicators、Controlsなどの整理されたサブフォルダへと分岐しているからです。

1. 標準ライブラリのインクルード

まず、以下のコードに示すように、ツールを組み立てます。ピクセルを描画したり取引をおこなったりするための生のコードを書く代わりに、標準ライブラリから専用のクラスをインポートします。

//--- 1. INCLUDES
#include <Canvas\Canvas.mqh>       // For drawing custom graphics
#include <Trade\PositionInfo.mqh>  // For reading trade details
#include <Trade\Trade.mqh>         // For executing trades
#include <Indicators\Trend.mqh>    // For Moving Averages

これら4つのヘッダーがアプリケーション全体のスコープを定義します。それぞれは標準ライブラリの特定の領域を担当しています。

ライブラリファイル 説明
Canvas CCanvasクラスを提供し、チャート上でピクセルレベルの描画を可能にします。これはこのプロジェクトの中心となるビジュアルエンジンであり、標準チャートオブジェクトを超えて、図形、透明処理、テキスト描画、インタラクティブなオーバーレイを実現します。
PositionInfo CPositionInfoクラスを提供し、オープンポジションを状態オブジェクトとして扱えるようにします。個別のプロパティを繰り返し取得する代わりに、ポジションを一度選択し、オブジェクトとして扱います。
Trade CTradeクラスを提供し、注文実行と管理のための高レベルインターフェースを提供します。注文チケット、実行結果、エラー処理を抽象化し、戦略ロジックを簡潔かつ読みやすく保ちます。
Trend CiMAなどのインジケータクラスを提供します。これらのクラスはCreate → Refresh → Mainという統一されたAPIでインジケータ処理を扱い、構造を変えずに拡張や置換を容易にします。

この段階ですでに、標準ライブラリの重要な設計思想が見えています。それぞれのクラスは独立した問題領域を解決しつつ、他のクラスと滑らかに統合できるように設計されているという点です。

2. 入力とグローバル変数:ライブラリに重い処理を任せる設計

ここでは複数のバブル形状を切り替えられるように列挙型を定義します。形状をenumとして抽象化することで、描画ロジックにハードコードされたレイアウト依存を持ち込まず、レンダリングシステムを拡張可能な構造にします。

続いて入力パラメータを定義します。ここでは「戦略の設定」と「表示の設定」を明確に分離します。この分離によって、視覚的な調整が売買ロジックに影響を与えない構造が保証されます。

//--- 2. INPUTS
enum EnumBubbleShape
  {
   SHAPE_ROUNDED_RECT,
   SHAPE_CIRCLE,
   SHAPE_TRIANGLE
  };

input group "Strategy Settings"
input int             InpFastMA = 10;               // Fast MA Period
input int             InpSlowMA = 20;               // Slow MA Period
input int             InpSL     = 300;              // Stop Loss (Points)
input int             InpTP     = 600;              // Take Profit (Points)

input group "Visual Settings"
input EnumBubbleShape InpShape  = SHAPE_TRIANGLE;   // Default to test layout logic

//--- 3. GLOBAL OBJECTS
CCanvas           ExtCanvas;       // The drawing canvas
CPositionInfo     ExtPosition;     // Position reader
CTrade            ExtTrade;        // Execution module
CiMA              ExtFastMA;       // Fast Moving Average
CiMA              ExtSlowMA;       // Slow Moving Average

ここで移動平均を手動計算する代わりにCiMAオブジェクトを使うことで、バッファ管理や再計算の処理をライブラリ側に任せています。これらのオブジェクトがグローバルとして宣言されている理由は、それぞれが「状態を持つ永続的なコンポーネント」だからです。

  • CTradeは取引実行のコンテキスト(マジックナンバーなど)を保持する
  • CPositionInfoはポジション情報を参照するための移動可能なカーソルとして機能する
  • CCanvasは長期間維持される描画面であり、毎ティック再生成するとパフォーマンスが大きく低下する

3. ヒットボックス構造: インタラクションの実現

Canvasにはボタンのようなネイティブな仕組みが存在しないため、独自のヒットボックス構造を定義します。これにより、ピクセル座標とトレードチケットを対応付けることができます。

閉じるボタンを描画するたびに、そのクリック可能領域を登録します。その後、マウスクリックがこれらの範囲内にあるかどうかを評価します。

//--- HITBOX STRUCTURE (For Mouse Clicks)
struct BubbleHitbox
  {
   ulong    ticket; 
   int      x1, y1, x2, y2;
  };
BubbleHitbox ExtHitboxes[]; // Dynamic array to store clickable areas

このシンプルな構造により、視覚的な矩形領域(x1.y1からx2.y2)を特定の取引チケットに対応付けることができます。このパターンは、視覚表現とロジック領域を分離する設計であり、ボタン、スライダー、その他のカスタムUIコントロールにも再利用可能です。

4. 初期化:コンポーネントの準備

エキスパートアドバイザー(EA)が起動するとき、OnInit()関数はシステム全体の起動シーケンスとして機能します。この関数は一度だけ実行され、必要なすべてのコンポーネントが正常に作成されていることを確認する役割を持ちます。もし初期化中に重要なサブシステムの作成に失敗した場合、関数は即座に終了し、EAは実行状態に移行しません。

int OnInit()
  {

最初におこなわれる処理は、短期移動平均インジケーターの初期化です。この時点ではまだ値の計算は行われておらず、MetaTrader 5に対してインジケータハンドルの確保と、現在の銘柄および時間足への紐付けを要求している段階です。このインジケータは終値に適用される単純移動平均として設定されます。もし作成に失敗した場合は、未定義のロジック実行を防ぐために初期化が中止されます。

   if(!ExtFastMA.Create(_Symbol, _Period, InpFastMA, 0, MODE_SMA, PRICE_CLOSE))
      return(INIT_FAILED);

続いて、長期移動平均も同様に作成されます。この初期化フェーズで両方のインジケータを準備しておくことで、実行時に常に有効な状態で更新できることが保証されます。短期移動平均と同様に、失敗した場合はEAの実行は停止されます。

   if(!ExtSlowMA.Create(_Symbol, _Period, InpSlowMA, 0, MODE_SMA, PRICE_CLOSE))
      return(INIT_FAILED);

次に、チャートがマウスイベントをEAへ転送するように設定されます。これにより、OnChartEvent()ハンドラを通じてマウス移動やクリックといったユーザー操作を受け取ることが可能になります。このステップはCanvas上で構築されるインタラクティブなチャートインターフェースにおいて非常に重要です。なぜなら、グラフィカルな要素がユーザー入力に反応できるようになるためです。

   ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, true);

次のブロックでは、すべての視覚要素を描画するためのCanvasを作成します。ビットマップラベルがチャートの左上に配置され、その幅と高さはチャートのピクセルサイズと完全に一致します。このビットマップはオフスクリーンのレンダリングサーフェスとして機能し、図形やテキスト、UIコンポーネントを効率的に描画することを可能にします。ARGBカラーフォーマットにより透過が有効になり、描画結果がチャート背景と自然に合成されます。もしビットマップの作成に失敗した場合、このEAはインタラクティブ表示に依存しているため初期化は失敗します。

   if(!ExtCanvas.CreateBitmapLabel("TradeBubblesCanvas", 0, 0,
                                   (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS),
                                   (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS),
                                   COLOR_FORMAT_ARGB_NORMALIZE))
      return(INIT_FAILED);

Canvasが正常に作成された後は、すべてのテキスト描画に使用されるデフォルトフォントを設定します。初期化時に一度フォントを設定することで、以降のすべてのテキスト描画呼び出しは同一のフォントとサイズを自動的に使用するようになります。この方式はパフォーマンスの向上と、描画要素間の視覚的一貫性の確保に寄与します。

   ExtCanvas.FontSet("Calibri", 16);

最後に、関数は初期化成功を返します。この時点で、インジケーター、チャートイベント、レンダリングサーフェスなど、すべての必要なシステムが完全に準備されています。INIT_SUCCEEDEDを返すことで、MetaTraderはEAをアクティブ状態へと移行させ、ティックおよびチャートイベントの受信を開始します。

   return(INIT_SUCCEEDED);
  }

なお、Canvas生成時に使用されているCOLOR_FORMAT_ARGB_NORMALIZEフラグは非常に重要です。これは、標準ライブラリにアルファチャンネル(透過)をサポートするよう指示します。このフラグが存在しない場合、レイヤーは不透明な黒として描画されてしまい、価格チャート全体を覆い隠してしまう原因となります。

5. OnTick():戦略と可視化の分離

新しいティックが到来すると、EAはOnTick()関数を実行し、その後のすべての処理を制御します。この関数は取引戦略の評価と視覚更新の効率的な管理を担当します。このプロセスにおいてEAは市場状況を継続的に監視し、既存ポジションを確認し、チャートへの描画を行うか、または取引を実行するかを判断します。

各ティックの開始時点で、EAは移動平均インジケータを更新し、最新の市場データを確実に反映させます。この即時更新により、その後におこなわれる価格判定やクロスオーバー判定が、古いデータではなく常に最新の値に基づいて実行されることが保証されます。

次に、EAは保有ポジションの有無を確認します。もしポジションが存在しない場合のみ、新規取引の実行条件を評価する段階へ進みます。これは内部的にPositionsTotal()を呼び出すことで管理されており、単一ポジションルールを強制することでポジションの重複を防ぎ、リスクを制御します。

EAはまた、描画処理をおこなう前に実行環境も評価します。ストラテジーテスター上でビジュアルモードが無効になっている場合には、リソース節約のためレンダリング処理を完全にスキップします。

視覚更新においては内部タイマーが用いられ、フレームレートが制御されます。各ティックごとに現在のシステム時刻と前回の描画時刻を比較し、一定の時間間隔が経過した場合にのみ新しい描画ルーチンが実行されます。これにより、滑らかな視覚表現とパフォーマンスのバランスが維持され、一般的には約30フレーム毎秒程度の描画速度が実現されます。

//+------------------------------------------------------------------+
//| Expert tick function (SPEED OPTIMIZED)                           |
//+------------------------------------------------------------------+
void OnTick()
  {
   // --- PRIORITY 1: STRATEGY (Always Run) ---
   // We never skip this. The EA must react to every price change instantly.
   ExtFastMA.Refresh(-1);
   ExtSlowMA.Refresh(-1);

   if(PositionsTotal() == 0)
     {
      CheckStrategy();
     }

   // --- PRIORITY 2: VISUALS (Throttled) ---
   
   // Optimization A: If running a backtest WITHOUT visual mode, skip drawing completely.
   if(MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE)) return;

   // Optimization B: Frame Rate Limiter (Max 30 FPS)
   static uint last_render_time = 0;
   uint current_pc_time = GetTickCount();

   if(current_pc_time - last_render_time > 30)
     {
      DrawBubbles();
      last_render_time = current_pc_time;
     }
  }

GetTickCount()を使用してレンダリングを毎秒約30フレームに制限することで、取引ロジックは最大速度で実行しつつ、CPU使用率を低く抑えることができます。このパターンは、構築するあらゆるダッシュボードやパネルに転用可能です。

6. 戦略ロジック:インジケータクラスの使用

この戦略自体は意図的にシンプルに設計されており、主に可視化のためのポジション生成を目的としています。

void CheckStrategy()
  {
   // Request indicator values through the library API
   double fast0 = ExtFastMA.Main(0);
   double fast1 = ExtFastMA.Main(1);
   double slow0 = ExtSlowMA.Main(0);
   double slow1 = ExtSlowMA.Main(1);

   // ... (Symbol Info & Trade Logic) ...

   // Example: Golden Cross
   if(fast1 < slow1 && fast0 > slow0)
     {
      double sl = ask - (InpSL * point);
      double tp = ask + (InpTP * point);
      // Clean execution using CTrade
      ExtTrade.Buy(0.10, _Symbol, ask, sl, tp, "MA_Cross_Buy");
     }
   // ... (Sell Logic Symmetrical) ...
  }

バッファ値に正しくアクセスするためにExtFastMA.Main(index)を使用します。この抽象化により、生の配列でよく発生する「配列の範囲外」エラーを防ぐことができます。

7. 描画レイヤー:市場データから画面ピクセルまで

この関数は、取引データ(時間/価格)と視覚化(X/Yピクセル)の間のギャップを埋めるものです。

void DrawSingleBubble()
  {
   // ... (Get Position Data) ...

   int x, y;
   // Convert Market Info to Screen Pixels
   // This function aligns graphics with candles during scrolling
   if(!ChartTimePriceToXY(0, 0, time, open_price, x, y)) return; 

   // ... (Color and Shape Logic) ...
   
   // Example: Drawing the Text
   ExtCanvas.TextOut(text_x_final, text_y_final, text, text_color, text_align_final);
   
   // Example: Registering the Hitbox for the "X" button
   int new_idx = ArraySize(ExtHitboxes);
   ArrayResize(ExtHitboxes, new_idx + 1);
   ExtHitboxes[new_idx].ticket = ticket;
   ExtHitboxes[new_idx].x1 = btn_x1_final;
   // ... (Save coordinates) ...
  }

ChartTimePriceToXY関数は非常に重要です。この関数は、取引の開始価格をピクセル座標に変換します。変換が完了すると、CCanvas APIが引き継ぎ、図形の描画、色のブレンド、テキストのレンダリングをおこないます。ボタンを描画する際に、その位置をExtHitboxesに即座に保存することに注意してください。

8. インタラクションレイヤー:グラフィックをクリック可能にする

最後に、ユーザー入力をライブラリのアクションに接続します。

//+------------------------------------------------------------------+
//| Chart Event Handler (Clicks & Scrolls)                           |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  {
   // Handle Resizing/Scrolling
   if(id == CHARTEVENT_CHART_CHANGE)
     {
      ExtNeedResize = true; 
      DrawBubbles(); 
     }

   // Handle Clicks
   if(id == CHARTEVENT_CLICK)
     {
      int mouse_x = (int)lparam;
      int mouse_y = (int)dparam;

      for(int i = 0; i < ArraySize(ExtHitboxes); i++)
        {
         // Check if click is inside a button's hitbox
         if(mouse_x >= ExtHitboxes[i].x1 && mouse_x <= ExtHitboxes[i].x2 &&
            mouse_y >= ExtHitboxes[i].y1 && mouse_y <= ExtHitboxes[i].y2)
           {
            Print("Interactive Close: Ticket #", ExtHitboxes[i].ticket);
            // Use Standard Library to close the specific ticket
            ExtTrade.PositionClose(ExtHitboxes[i].ticket);
            DrawBubbles(); 
            return;
           }
        }
     }
  }

CHARTEVENT_CLICKを処理することで、ループが完了します。

  • ユーザー入力:クリックが検出される
  • ビジュアルロジック:ExtHitboxesを確認して、ボタンが押されたかどうかをみる
  • 取引執行:ExtTrade.PositionCloseを使用してコマンドを実行する

この相互作用モデルによって、静的なチャートが動的な取引ツールへと変わります。


テストと結果

システムを構築したので、いよいよ実際に動作させてみましょう。MetaTrader 5でストラテジーテスターを開き、Part7_InteractivePositionLabeler.ex5を選択します。[開始]をクリックする前に、チャート表示を伴うビジュアルモードが有効になっていることを確認してください。

この機能はリアルタイムのグラフ描画とマウス操作に依存しているため、テスト中は最適化を無効にする必要があります。Canvasベースのラベルやボタンなどのインタラクティブなコンポーネントを検証する際は、必ずストラテジーテスターで単一のビジュアル実行を使用してください。

EAが移動平均線クロスオーバー戦略を実行すると、新しいポジションごとにカスタムラベルが即座に表示されます。これらのラベルは、価格変動に応じて損益値と色をリアルタイムで更新します。

インタラクティブ機能をテストするには、ライブチャート上で、任意のラベルにある赤いXボタンにカーソルを合わせてクリックするだけです。関連する取引は即座に決済され、チャートからラベルが消えます。 

以下のスクリーンショットで、テスト結果が実際にどのように機能するかを確認できます。

実際のチャートテスト

図3:ライブチャートでのテスト

metatester64_ID7Li6usp1.gif

図4:ストラテジーテスターの可視化におけるテスト

このプロジェクトの完全なコンパイル可能なソースコードは、この記事の末尾に添付されています。ダウンロードしてコンパイルすれば、MQL5標準ライブラリの強力な機能をすぐに体験できます。


結論

戦略ロジックと動的チャート可視化を統合したインタラクティブなポジションラベラーEAの構築に成功しました。インジケータ、Canvas、取引管理のためのグローバルオブジェクトを定義・初期化し、CPositionInfoを通じて保有ポジションへオブジェクトとしてアクセスする方法、CTradeを用いた効率的な取引実行、そしてトレンドライブラリのCiMAによる移動平均の計算方法を学びました。同時に、ピクセルレベルの描画を可能にするCCanvasの使い方を理解し、ポジション情報を表示し、チャート上のクリックに直接反応するインタラクティブなバブルを作成しました。

このプロジェクトを通じて、MQL5標準ライブラリが取引アプリケーションの複数領域に対して一貫した高レベルインターフェースを提供していることを確認しました。また、リソースを効率的に管理し、レンダリングをスロットリングしてパフォーマンスを維持し、チャートイベントを処理して可視化をインタラクティブにする方法も学びました。このEAに限らず、同じアプローチを用いることで、手動で開いたポジションや他のEAによるポジションも含め、チャート上の任意のポジションにラベルを付けることが可能です。これはこのコンテキストではマジックナンバーを使用していないためです。 

ぜひご自身の口座やデモ環境でこの機能をテストしてください。異なるバブル形状、インジケーター設定、複数シンボルなどを試しながら、キャンバスとインタラクティブロジックの動作を観察することができます。

皆さんの経験やアイデアは非常に貴重ですので、ぜひコメント欄でご意見を共有してください。このフィードバックは、次回の内容を方向づけるうえで大いに役立ちます。今後もMQL5標準ライブラリのより深い機能を探求していきます。それでは、引き続きコーディングとチャート分析をお楽しみください。


添付ファイル

ソースファイル名 説明
Part7_InteractivePositionLabeler.mq5 MAクロス戦略とCCanvas統合を備えた、Interactive Position Labeler EAの完全ソースコード

目次に戻る

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

添付されたファイル |
EAのサンプル EAのサンプル
一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。
カスタムインジケータワークショップ(第2回):MQL5で実用的なSupertrend EAを構築する カスタムインジケータワークショップ(第2回):MQL5で実用的なSupertrend EAを構築する
Supertrend駆動型エキスパートアドバイザー(EA)をMQL5でゼロから構築する方法を学びます。本記事では、インジケータのリソースとしての組み込み、確定済みバーからのバッファ値の読み取り、確定したフリップの検出、ポジションの整合と切り替え、ストップロス方式およびポジションサイジングの設定について解説します。最後にストラテジーテスターの設定と再現可能なテストを示し、設定可能なEAと、さらなる研究および拡張のための明確なフレームワークを手にすることができます。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
ラリー・ウィリアムズの『市場の秘密』(第10回):スマッシュデー反転パターンの自動化 ラリー・ウィリアムズの『市場の秘密』(第10回):スマッシュデー反転パターンの自動化
ルールベースのエキスパートアドバイザー(EA)を構築し、動的なリスク管理、ブレイクアウト確認ロジック、そして「常に1ポジションのみ保有する」売買ルールを組み込みます。読者は、MetaTrader 5のストラテジーテスターと付属のソースコードを用いてバックテストを実施し、結果を再現するとともに、各パラメータがパフォーマンスへ与える影響を検証できます。