English Русский Deutsch
preview
プライスアクション分析ツールキットの開発(第64回):手動で描画したトレンドラインと自動監視の同期

プライスアクション分析ツールキットの開発(第64回):手動で描画したトレンドラインと自動監視の同期

MetaTrader 5 |
18 0
Christian Benjamin
Christian Benjamin

内容


はじめに

すでに手動でトレンドラインを描画しており、完全自動検出よりも自身の視覚的な判断を信頼しているトレーダーは多くいます。実際の問題は別のところにあります。1つまたは複数のチャート上に多くのラインを配置すると、すべてのレベルを常に監視することは物理的に不可能になります。価格が手動で描画したトレンドラインに接近する、タッチする、ブレイクする、または反発するといった重要な瞬間は、時間足を切り替えている間、ターミナルから離れている間、または別のポジションを管理している間に発生することがよくあります。この記事では、このまさに不足している部分に取り組みます。それは、手動チャート分析を入力として維持しながら、これらのラインを監視する反復的な作業を自動化する方法です。

技術的には、不足している要素は、手描きの OBJ_TREND をエキスパートアドバイザー(EA)のロジックおよびライフサイクル(作成、変更、削除)に「接続」する能力です。そして、時間の経過に伴って変化するトレンドライン上の現在価格を計算し、あらかじめ定義された相互作用条件が発生した際に、信頼性の高い通知を発生させます。ここで提示するソリューションは、裁量的なライン描画を維持します。つまり、監視したいラインを自分で選択して同期し、MetaTrader 5(EA経由)がそれらの同期されたラインを継続的に評価し、意味のあるイベントを通知します。これにより、すべてのチャートを常に注視する必要がなくなります。

 以下のセクションでは、手動で描画したトレンドラインを自動監視と同期させる概念について説明し、システムが MQL5 でどのように実装されるかを解説し、ライブチャート環境で動作を検証するために使用したテストプロセスを紹介します。


概念の理解


連載「プライスアクション分析ツールキット開発」の以前の記事では、MQL5 におけるトレンドラインの描画および監視の自動化について紹介しました。そのアプローチでは、プログラムが潜在的なピボットポイントを識別し、事前に定義されたルールに基づいて自動的にトレンドラインを構築します。この自動化は体系的な分析には有効ですが、多くのトレーダーは依然としてトレンドラインを手動で描画することを好みます。

手動描画では、トレーダーはピボットポイントを選択する際に裁量を適用できます。アルゴリズムによる検出だけに依存するのではなく、トレーダーはチャートを視覚的に分析し、どのスイング高値やスイング安値が市場構造を最も適切に表しているかを判断できます。この人間による判断は、特に複雑な価格形成を分析する際に価値があります。固定されたルールでは、微妙な市場構造の詳細を十分に捉えられない場合があるためです。

プライスアクション分析において、トレンドラインを手動で描画することにはいくつかの利点があります。主な利点を以下の表にまとめます。

利点 詳細
構造解釈

トレーダーは市場構造を解釈し、単なる機械的な検出に依存するのではなく、トレンドを最も適切に表すピボットポイントを選択できます。

柔軟性

手動描画では、市場環境の変化や新たに形成された値動きに合わせて、素早く調整できます。

コンテキスト認識

トレーダーは、ラインを配置する際に、サポート、レジスタンス、レンジ形成ゾーンなど、追加のチャート要素を考慮できます。

戦略との整合性

トレーダーは、共通ルールに従うのではなく、自身の取引戦略のロジックに合わせてトレンドラインを設定できます。

視覚的明瞭性

手動で配置されたラインは、トレーダー自身の分析視点を反映することが多く、意思決定時に価格の動きを解釈しやすくなります。

しかし、複数のトレンドラインをチャート上に描画すると、すぐに実用上の制限が発生します。それぞれのラインに対して価格がどのように反応しているかを監視するには、継続的な注意が必要になります。複数のチャートを同時に開いているアクティブな取引環境では、取引セッション全体を通じてそのレベルの監視を維持することは困難になります。

その結果、価格とトレンドラインの間で発生する重要な相互作用を簡単に見逃す可能性があります。トレーダーが短時間チャートから離れて戻ってきた時には、価格がすでに慎重に描画したトレンドラインへタッチしていたり、ブレイクしていたりする場合があります。多くの場合、これらの相互作用は、ポジションをより効果的にエントリーまたは管理するために利用できた貴重な取引機会を示しています。核心となる問題は分析そのものではなく、価格と手動で描画したラインとの関係が時間とともに変化していく状況を継続的に監視する能力にあります。

本記事で紹介するコンセプトは、手動チャート分析と自動監視を組み合わせることで、この制限に対応します。基本的な考え方は単純です。トレーダーはチャート上で意味のある水準を特定する役割を担い、プログラムはそれらの水準周辺での価格動向を監視する反復的な作業を引き受けます。

トレンドラインが監視システムと同期されると、プログラムはそのラインに対して価格がどのように動いているかの評価を開始します。その後、複数の種類の相互作用を自動的に検出できます。これには、市場がラインへ接近する状況、タッチする状況、ラインを突破する状況、または接触後に反転する状況が含まれます。これらの相互作用はそれぞれ、トレンドの強さや、継続または反転の可能性について有用な情報を提供します。

システムのワークフロー


監視メカニズムが実際にどのように動作するかを理解するためには、システムが実行するワークフローを確認することが有用です。このプロセスは、手動分析を維持しながら、プログラムに価格動向の継続的な監視を任せるよう設計されています。

1. トレンドラインの描画

プロセスは、トレーダーがMetaTrader 5 に標準搭載されている描画ツールを使用して、チャート上に直接トレンドラインを描画するところから始まります。この段階で、トレーダーはスイングハイやスイングローなどの意味のあるピボットポイントを識別し、それらを結んでトレンドラインを形成します。のステップにより、プライスアクション分析の裁量的な性質が維持されます。アルゴリズムによる検出だけに完全依存するのではなく、トレーダーはチャートを視覚的に解釈し、市場構造を最も適切に表すピボットポイントを判断します。

2. トレンドラインの同期

トレンドラインを描画した後、それを監視システムと同期する必要があります。同期は、その特定のラインをプログラムによる監視対象として登録する確認ステップとして機能します。この段階で、トレンドラインはシステム内部に登録され、監視対象チャートオブジェクトのリストへ追加されます。その瞬間から、プログラムはそのラインを継続的な観察が必要な分析基準レベルとして扱います。

3. 継続的な価格評価

同期が完了すると、プログラムは現在の市場価格とトレンドラインの位置関係を継続的に評価し始めます。水平なサポートやレジスタンスとは異なり、トレンドラインは時間の経過とともに値が変化する動的な水準を表します。そのため、システムは現在時点におけるラインの正確な価格を計算し、各評価サイクルでリアルタイムの市場価格と比較します。この計算により、プログラムは価格がラインへ接近しているのか、タッチしているのか、またはラインから離れているのかを判断できます。

4. 相互作用の検出とアラート

価格が監視対象のトレンドラインと相互作用すると、システムはそのイベントを検出し、適切な通知を生成します。

検出可能な相互作用状態には、前述した接近、タッチ、ブレイクアウト、反転条件などがあります。

    これらのイベントが発生すると、アラートが生成され、トレーダーへ通知されます。さらに、チャート上の監視パネルにはリアルタイムの状態更新が表示され、同期された各ラインについて最後に検出された相互作用が確認できます。

    5. 自動監視と手動制御

    このワークフローを通じて、手動で描画したトレンドラインは継続的に監視される分析レベルになります。

    この組み合わせにより、手動によるプライスアクション分析を維持しながら、トレンドラインとの相互作用を監視する反復的な作業は自動化されます。その結果、トレーダーはすべてのチャートを常に監視するのではなく、市場の動きを解釈することに集中できます。


    MQL5での実装

    このセクションでは、監視コンセプトをMetaTrader 5上でMQL5を使用した機能的なシステムへどのように変換するかを説明します。目的は、手動で描画されたトレンドラインをプログラムが認識し、チャート上で価格が変化する間も継続的に監視できるようにすることです。

    EAはいくつかの処理を連携して実行します。トレーダーによって作成されたトレンドラインオブジェクトを検出し、選択されたラインを監視システムと同期し、監視対象ラインを整理された内部構造で管理し、時間の経過に伴う各トレンドラインの動的な値を計算し、それらのラインに対する価格の相互作用を評価し、検出されたイベントをアラートや視覚的なフィードバックによって通知します。これらの各処理は、連携して動作する特定のMQL5関数および仕組みによって実装され、応答性の高い監視環境を構築します。


    チャート上のトレンドライン検出

    実装の最初のステップは、チャート上に描画されたトレンドラインを識別することです。MetaTrader 5では、トレンドラインなどのグラフィカル要素はチャートオブジェクトとして表現されており、プログラムからアクセスおよび管理することができます。

    これらのオブジェクトを検出するために、EAはMQL5が提供するチャートイベントシステム、特にOnChartEvent()関数を利用します。この関数は、グラフィカルオブジェクトの作成、変更、削除を含む、チャート上でイベントが発生するたびに呼び出されます。トレーダーがチャート上にトレンドラインを描画すると、プラットフォームはイベントを生成し、そのイベントをOnChartEvent()内で取得できます。この関数は、イベントの種類および対象となるオブジェクトを説明するパラメータを受け取ります。この情報を使用することで、プログラムはそのイベントがトレンドラインの作成に関連するものかどうかを判定できます。

    //+------------------------------------------------------------------+
    //| Handle chart events and detect newly created trendlines          |
    //+------------------------------------------------------------------+
    void OnChartEvent(const int id,
                      const long &lparam,
                      const double &dparam,
                      const string &sparam)
      {
       //--- Detect object creation event
       if(id==CHARTEVENT_OBJECT_CREATE)
         {
          string object_name=sparam;
    
          //--- Check if the object is a trendline
          if(ObjectGetInteger(0,object_name,OBJPROP_TYPE)==OBJ_TREND)
            {
             Print("Trendline detected: ",object_name);
    
             //--- Further processing can be performed here
            }
         }
      }
    //+------------------------------------------------------------------+

    トレンドラインの識別は、通常 ObjectGetInteger()関数を使用してオブジェクトタイプを取得し、そのオブジェクトがOBJ_TRENDカテゴリに属しているかを確認することで実行されます。確認が完了すると、プログラムはオブジェクト名を取得し、そのプロパティへアクセスします。この仕組みにより、EAはトレーダーが直接チャート上に導入した分析構造を認識できるようになります。

    トレンドラインプロパティの取得

    トレンドラインが検出された後、次のステップでは、その構造を定義するパラメータを取得します。EAは、チャート上のトレンドラインを定義する2つのアンカーポイントを取得します。各アンカーポイントには、時間座標と価格座標が含まれています。これらの値はObjectGetInteger()およびObjectGetDouble()関数を使用して取得されます。

    時間座標はOBJPROP_TIME1およびOBJPROP_TIME2などのプロパティから取得され、価格座標はOBJPROP_PRICE1およびOBJPROP_PRICE2を使用して取得されます。この4つの値を取得することで、システムはトレンドラインの完全な幾何学的定義を取得できます。これらのパラメータは内部的に保存され、その後の監視サイクルでラインを評価できるように使用されます。

    //+------------------------------------------------------------------+
    //| Retrieve anchor points from a trendline object                   |
    //+------------------------------------------------------------------+
    bool GetTrendlinePoints(string name,
                            datetime &t1,double &p1,
                            datetime &t2,double &p2)
      {
       //--- Verify that the object exists
       if(ObjectFind(0,name)<0)
          return(false);
    
       //--- Retrieve first anchor point
       t1=(datetime)ObjectGetInteger(0,name,OBJPROP_TIME1);
       p1=ObjectGetDouble(0,name,OBJPROP_PRICE1);
    
       //--- Retrieve second anchor point
       t2=(datetime)ObjectGetInteger(0,name,OBJPROP_TIME2);
       p2=ObjectGetDouble(0,name,OBJPROP_PRICE2);
    
       return(true);
      }
    //+------------------------------------------------------------------+

    このステップにより、グラフィカルなトレンドラインは、プログラムによって分析可能な数値データへ効果的に変換されます。

    トレンドラインと監視システムの同期

    トレンドラインが検出され、そのプロパティが取得された後、次のステップは同期処理です。同期は、特定のトレンドラインオブジェクトをシステムによる監視対象にするかどうかを決定します。

    トレーダーは、チャートを分析する際に複数のトレンドラインを描画することがよくあります。これらのラインの中には、一時的な視覚的ガイドとしてのみ使用されるものもあれば、継続的な監視が必要となる重要なサポートやレジスタンス水準を表すものもあります。このため、監視システムはチャート上に表示されるすべてのトレンドラインを自動的に追跡するわけではありません。代わりに、同期ステップが導入されます。このステップでは、トレーダーが監視対象とする特定のトレンドラインオブジェクトを選択します。その後、プログラムはObjectGetInteger()およびObjectGetDouble()を使用して、オブジェクト名とアンカーポイントのプロパティを取得します。

    //+------------------------------------------------------------------+
    //| Structure representing a monitored trendline                     |
    //+------------------------------------------------------------------+
    struct TrendlineInfo
      {
       string   name;
       datetime t1;
       double   p1;
       datetime t2;
       double   p2;
       int      state;
      };
    
    //--- Dynamic list of monitored trendlines
    TrendlineInfo MonitoredLines[];
    
    //+------------------------------------------------------------------+
    //| Synchronize a trendline with the monitoring system               |
    //+------------------------------------------------------------------+
    void SynchronizeTrendline(string name)
      {
       TrendlineInfo line;
    
       //--- Retrieve anchor points
       if(!GetTrendlinePoints(name,line.t1,line.p1,line.t2,line.p2))
          return;
    
       line.name=name;
       line.state=0;
    
       int size=ArraySize(MonitoredLines);
       ArrayResize(MonitoredLines,size+1);
    
       MonitoredLines[size]=line;
    
       Print("Trendline synchronized: ",name);
      }
    //+------------------------------------------------------------------+

    トレンドラインが同期されると、その識別情報は内部の監視構造へ保存されます。システムは以下の情報を記録します。

    • トレンドラインオブジェクト名
    • 最初のアンカーポイント(OBJPROP_TIME1、OBJPROP_PRICE1
    • 2番目のアンカーポイント(OBJPROP_TIME2、OBJPROP_PRICE2
    • 現在の監視状態

    この時点以降、同期されたトレンドラインは、EAによって継続的に評価される分析レベルの集合に組み込まれます。このアプローチにより、監視対象をトレーダーが重要と判断したトレンドラインのみに限定し、管理された効率的な監視を維持できます。

    監視対象トレンドラインの構造化リスト管理

    トレンドラインが同期された後、その情報は各監視サイクルで効率的に評価できるよう、構造化された形式で保存する必要があります。このような構造がなければ、プログラムは複数のトレンドラインを同時に管理することが困難になります。そのため、EAは、現在監視対象となっているすべての同期済みトレンドラインを保持する内部リストを管理します。このリストは、配列またはカスタム構造体を使用して実装できます。そこには、各トレンドラインオブジェクトに関連するプロパティが保存されます。

    //+------------------------------------------------------------------+
    //| Main monitoring cycle executed on every market tick              |
    //+------------------------------------------------------------------+
    void OnTick()
      {
       int total=ArraySize(MonitoredLines);
    
       //--- Evaluate each synchronized trendline
       for(int i=0;i<total;i++)
         {
          EvaluateTrendline(MonitoredLines[i]);
         }
      }
    //+------------------------------------------------------------------+

    トレンドラインが同期されると、プログラムはObjectName()やObjectFind()などの関数を使用して、その識別情報を取得します。これらの関数により、プログラムはチャート上にオブジェクトが存在することを確認し、その一意の名前を取得できます。オブジェクト名は、監視システムで使用される主要な識別子になります。その後、トレンドラインの構造的なプロパティはObjectGetInteger()およびObjectGetDouble()を使用して取得されます。これらの関数により、ラインを定義するアンカーポイントの座標へアクセスできます。

    • OBJPROP_TIME1 最初のアンカーポイントの時刻
    • OBJPROP_PRICE1 最初のアンカーポイントの価格
    • OBJPROP_TIME2 2番目のアンカーポイントの時刻
    • OBJPROP_PRICE2 2番目のアンカーポイントの価格

    これらの値は、トレンドラインオブジェクト名とともに監視構造へ保存されます。さらに、トレンドラインの傾きや、最後に検出された相互作用状態など、計算されたパラメータを含む追加フィールドを保存することもできます。情報が保存されると、監視システムはOnTick()関数が実行されるたびに、このリストを順番に処理できます。各サイクルでは、プログラムが各トレンドラインの保存済みパラメータを取得し、最新の時間座標に基づいて現在のライン価格を再計算します。この構造化されたリストにより、EAは、同期されたすべてのトレンドラインに対する価格の動きを、一貫性のある整理された方法で評価できます。チャート上に複数のラインが存在する場合でも、システムはそれぞれのライン固有のプロパティを失うことなく、順番に処理できます。

    この構造を維持するもう1つの利点は、ライフサイクル管理が簡単になることです。監視対象のトレンドラインがチャートから削除された場合、プログラムはOnChartEvent()を通じてそのイベントを検出し、対応するエントリーを内部リストから削除できます。これにより、監視システムは常に現在のチャート状態を反映した状態に保たれます。

    トレンドライン値の数学的計算

    トレンドラインは、チャート上の2つのポイントを結ぶ直線を表します。各ポイントには、時間座標と価格座標が含まれています。価格とラインの相互作用を評価するためには、プログラムが現在の時間におけるトレンドラインの予想価格を計算する必要があります。

    //+------------------------------------------------------------------+
    //| Calculate the dynamic price of a trendline at current time       |
    //+------------------------------------------------------------------+
    double CalculateTrendlinePrice(datetime t1,double p1,
                                   datetime t2,double p2,
                                   datetime current_time)
      {
       double slope=(p2-p1)/(double)(t2-t1);
    
       double price=p1+slope*(current_time-t1);
    
       return(price);
      }
    //+------------------------------------------------------------------+

    トレンドラインの2つのアンカーポイントを次のように定義します。

    • ポイント1:(T1, P1)
    • ポイント2:(T2, P2)

    ここで、Tは時間座標を表し、Pは価格座標を表します。トレンドラインの傾きは、2つのアンカーポイント間の差を使用して計算されます。

    • 傾き = (P2 - P1)/(T2 - T1)

    傾きが求められると、任意の時点Tにおけるトレンドラインの価格は、直線の線形方程式を使用して計算できます。

    プログラムでは、現在の時間値は TimeCurrent()関数を使用して取得するか、最新バーの時間を参照して取得できます。この値を式へ代入することで、現在時点におけるトレンドラインの正確な価格水準が算出されます。この計算された値は、トレンドラインの動的な位置を表します。時間が進み、新しいローソク足が形成されるにつれて、計算されたライン価格は自動的に調整されます。これにより、価格との相互作用は常に正しいライン位置を基準として評価されます。

    トレンドラインとの価格相互作用の評価

    現在のトレンドライン値が計算された後、プログラムはこの値をSymbolInfoDouble()を通じて取得したリアルタイム市場価格と比較します。この比較により、システムは市場価格が監視対象のトレンドラインに対してどのように動いているかを判断できます。価格とラインとの距離、およびラインに対する価格の移動方向を評価することで、プログラムはいくつかの種類の相互作用を分類できます。

    //+------------------------------------------------------------------+
    //| Evaluate market interaction with a monitored trendline           |
    //+------------------------------------------------------------------+
    void EvaluateTrendline(TrendlineInfo &line)
      {
       datetime current_time=TimeCurrent();
    
       double trend_price=
          CalculateTrendlinePrice(line.t1,line.p1,
                                  line.t2,line.p2,
                                  current_time);
    
       double market_price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
    
       double tolerance=10*_Point;
    
       double distance=MathAbs(market_price-trend_price);
    
       //--- Detect touch condition
       if(distance<=tolerance)
         {
          Print("Touch detected on ",line.name);
         }
    
       //--- Detect breakout above
       else if(market_price>trend_price+tolerance)
         {
          Print("Breakout above trendline: ",line.name);
         }
    
       //--- Detect breakout below
       else if(market_price<trend_price-tolerance)
         {
          Print("Breakout below trendline: ",line.name);
         }
      }
    //+------------------------------------------------------------------+

    評価できる相互作用条件には、以下のようなものがあります。

    • 接近:市場価格が、あらかじめ定義された距離以内までトレンドラインへ近づいた場合です。この状態は、価格が重要となる可能性のある水準へ接近していることを示します。
    • タッチ:価格が計算されたトレンドラインの値に到達した場合です。このイベントは、市場がトレンドラインを試していることを示します。
    • ブレイクアウト:価格がトレンドラインを横切り、そのままラインの向こう側へ動き続けた場合です。このような動きは、市場がこれまで維持されていたトレンド構造を突破したことを示唆する場合が多くあります。
    • リジェクション:価格がトレンドラインへ接近したものの、それを横切ることなく反転した場合です。この動きは、トレンドラインが動的なサポートまたはレジスタンスとして機能していることを示している可能性があります。

    これらの状態を確実に検出するために、システムは現在の市場価格と計算されたトレンドライン値との差を評価します。通常は、小さな価格変動やスプレッドの変化を考慮するために、許容閾値が適用されます。この比較処理を通じて、監視システムは市場と同期済みトレンドラインとの関係を継続的に解釈します。

    アラートと通知の生成

    相互作用イベントが検出されると、システムはアラートや通知を通じてトレーダーへ知らせます。この目的には、MQL5 に標準搭載されている複数の関数を使用できます。Alert ()関数はプラットフォーム内で即座に通知を表示し、Print()関数はターミナルのジャーナルへ情報を記録します。モバイル通知が必要な場合はSendNotification()関数も利用できます。

    //+------------------------------------------------------------------+
    //| Send notifications when trendline interaction occurs             |
    //+------------------------------------------------------------------+
    void NotifyInteraction(string message)
      {
       //--- Platform alert
       Alert(message);
    
       //--- Terminal log entry
       Print(message);
    
       //--- Mobile push notification
       SendNotification(message);
      }
    //+------------------------------------------------------------------+

    これらのアラートにより、価格が監視対象のトレンドラインへ接近した場合や相互作用が発生した場合に、トレーダーへ通知が送られます。その結果、トレーダーがチャートを継続的に監視していなくても、重要なイベントを把握できます。

    チャートパネルによる視覚的フィードバック

    アラートに加えて、このシステムはチャート上に表示される監視パネルを通じて視覚的なフィードバックも提供します。このパネルはObjectCreate()関数を使用して作成したチャートラベルによって構築できます。各ラベルには、同期されたトレンドラインに関する情報が表示されます。これには、トレンドライン名と、最後に検出された相互作用の内容が含まれます。

    //+------------------------------------------------------------------+
    //| Create a simple monitoring panel on the chart                    |
    //+------------------------------------------------------------------+
    void CreatePanel()
      {
       string name="TrendMonitorPanel";
    
       //--- Create label if it does not exist
       if(ObjectFind(0,name)<0)
         {
          ObjectCreate(0,name,OBJ_LABEL,0,0,0);
    
          ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
          ObjectSetInteger(0,name,OBJPROP_XDISTANCE,10);
          ObjectSetInteger(0,name,OBJPROP_YDISTANCE,20);
          ObjectSetInteger(0,name,OBJPROP_FONTSIZE,10);
         }
    
       //--- Update label text
       ObjectSetString(0,name,OBJPROP_TEXT,
                       "Trendline Monitoring Active");
      }
    //+------------------------------------------------------------------+

    これらのラベルを動的に更新することで、パネルは監視対象のトレンドラインとその相互作用状況をリアルタイムで概観できます。トレーダーは、各ラインを個別に手動で確認することなく、価格が各ラインに対してどのように動いているかを迅速に評価できます。

    この視覚的なインターフェースは、アラートシステムを補完し、監視ツールの使いやすさを向上させます。

    トレンドラインのライフサイクル管理

    取引分析の進化に伴い、トレンドラインはチャート上で修正または削除される場合があります。したがって、監視システムはチャートの現在の状態と常に同期している必要があります。これは、OnChartEvent()を介してオブジェクト削除イベントを検出することによって処理されます。監視対象のトレンドラインがチャートから削除されると、対応するレコードも内部監視構造から削除されます。

    //+------------------------------------------------------------------+
    //| Remove a trendline from the monitoring list                      |
    //+------------------------------------------------------------------+
    void RemoveTrendline(string name)
      {
       int total=ArraySize(MonitoredLines);
    
       for(int i=0;i<total;i++)
         {
          if(MonitoredLines[i].name==name)
            {
             ArrayRemove(MonitoredLines,i);
             Print("Trendline removed: ",name);
             break;
            }
         }
      }
    //+------------------------------------------------------------------+

    この動的な管理により、監視リストは常にチャート上に存在する有効なトレンドラインを正確に反映します。

    手動分析と自動監視の統合

    最終的な結果として、手動によるチャート分析と自動監視を組み合わせたハイブリッドな分析システムが実現されます。 同期後、EAは、選択されたトレンドラインに対する価格の相互作用を継続的に評価します。

    裁量分析と自動監視を組み合わせることで、このシステムはチャートを常時監視する必要性を軽減しながら、価格とトレンドラインの重要な相互作用をリアルタイムで確実に検出します。

    EAの使用

    コンパイル後にチャートへ適用すると、EAは3つのボタンを表示します。

    • [Draw]クリックすると描画モードへ入ります。ボタンがハイライト表示され、EA が新しいトレンドラインを検出する準備ができたことを示します。
    • [Sync]ラインを描画すると、このボタンが有効になります。クリックすると、新しく描画したラインを監視システムと同期します。
    • [Clear All]:同期済みのすべてのトレンドラインを監視対象から解除し、元の表示状態へ戻します。

    同期が完了すると、ラインは自動的に右方向へ延長され、色が変更され、線幅も太くなります。 監視パネルには、同期されたすべてのラインと、それぞれの現在の相互作用状態が表示されます。パネルは背景部分をクリックしたままドラッグすることで、チャート上の任意の位置へ移動できます。


    テスト

    監視システムの動作を検証するため、複数の通貨ペアおよび時間足でテストを実施しました。わかりやすくするため、このセクションでは、以下のGIFに示すEURUSDの30分足(M30)を使用した代表的な例に焦点を当てます。

    テストでは、監視システムがパフォーマンスを低下させることなく複数の分析レベルを追跡できることを確認するため、複数のトレンドラインを同時に同期しました。また、チャートスケールに関係なくトレンドライン価格が正確に計算されることを確認するため、異なる時間足でもEAをテストしました。 

    市場が推移する中で、プログラムは同期済みトレンドラインに対する価格の相互作用を継続的に監視しました。価格がラインへ接近し、最終的にタッチすると、システムはその相互作用を検出し、アラートを生成しました。この動作はGIFで確認でき、価格が監視対象トレンドラインへ到達した瞬間にアラートが発生しています。


    このテストにより、監視ロジックがトレンドラインの幾何学的な位置を正しく解釈し、価格との相互作用をリアルタイムで評価していることが確認されました。同期機構、視覚的フィードバック、およびアラートシステムはすべて期待通りに連携して動作し、手動で描画した分析構造を、チャートを継続的に監視することなく自動的に追跡できることが確認されました。

    全体として、この結果は、システムがライブチャート環境において安定して動作し、価格と同期済みトレンドラインとの相互作用を確実に検出・通知できることを示しています。


    結論

    本記事で実装したアプローチは、手動によるトレンドライン分析を再現可能なハイブリッドワークフローへと変換します。トレーダーは、市場構造を表すアンカーポイントやトレンドラインを自らの判断で自由に選択でき、その一方で、EAが継続的な監視とイベント通知を担当します。実際には、本記事の内容に沿って実装を進めることで、MT5上で利用可能な明確かつ実装しやすいテンプレートが完成し、以下の機能を備えることができます。

    • OnChartEventを使用した、新しく作成されたOBJ_TRENDの検出
    • トレーダーが選択したラインのみを登録する明示的な同期ステップ
    • アンカーポイント情報の保存と、作成・変更・削除を含むライフサイクル管理
    • 現在時刻におけるトレンドラインの動的な価格計算
    • 許容閾値を用いた、接近・タッチ・ブレイクアウト・リジェクションの判定
    • Alert()、Print()、SendNotification()による通知と、状態を表示するリアルタイムのチャートパネル

    本システムの制限と適用範囲も明確です。監視対象となるのは同期されたトレンドラインのみであり、チャート上のすべてのグラフィカルオブジェクトを監視するわけではありません。また、誤検出を減らすために設定可能な許容しきい値を使用し、価格との相互作用は選択した市場価格(例:BID)を基準として評価されます。その結果、このシステムは、トレンドラインの描画における人間の判断を維持しながら、市場状況の把握能力を確実に高め、重要な機会の見逃しを減らす、実用的かつ検証可能なEAの設計パターンとなります。

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

    添付されたファイル |
    EAのサンプル EAのサンプル
    一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。
    ラリー・ウィリアムズの『市場の秘密』(第15回):相場環境を用いた「隠れスマッシュデー」反転戦略 ラリー・ウィリアムズの『市場の秘密』(第15回):相場環境を用いた「隠れスマッシュデー」反転戦略
    ラリー・ウィリアムズの「隠れスマッシュデー」の反転を自動化するMQL5エキスパートアドバイザー(EA)を構築します。カスタムインジケータから確定済みのシグナルを読み取り、コンテキストフィルタ(Supertrendの方向一致および任意の取引日ルール)を適用します。また、スマッシュバーの構造またはATRを基準としたストップロスモデル、固定またはリスクベースのポジションサイズによってリスクを管理します。その結果、テストおよび拡張に対応した、再現可能なフレームワークを構築できます。
    エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
    この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
    MetaTrader 5機械学習の設計図(第8回):パージ済み交差検証と試行枝刈りを用いたベイズ最適化によるハイパーパラメータ最適化 MetaTrader 5機械学習の設計図(第8回):パージ済み交差検証と試行枝刈りを用いたベイズ最適化によるハイパーパラメータ最適化
    GridSearchCVとRandomizedSearchCVは、金融機械学習(金融ML)における本質的な制約を共有しています。それは、各試行が独立しているため、計算資源を増やしても探索そのものが賢くならないという点です。本記事では、TPE (Tree-structured Parzen Estimator)を用いるOptunaを、PurgedKFold交差検証、HyperbandPrunerによる早期終了、および学習用重みと評価用重みを分離する二重重み規約と統合する方法を紹介します。その結果として、フォールド単位で枝刈りをおこなう目的関数、モデルのハイパーパラメータと重み付けスキームを同時に最適化する提案層、金融タスク向けに調整されたプルーナー、SQLiteをバックエンドとする、再開可能なオーケストレーター、Optunaの結果をscikit-learnのcv_results_形式へ変換するコンバータの5つの要素から構成されるシステムが得られます。さらに本記事では、Timothy Mastersが示した境界についても説明します。すなわち、「統計的な目的関数では誘導的な探索が有益である一方、金融目的関数では逆に有害となる」という考え方です。