English Deutsch
preview
プライスアクション分析ツールキットの開発(第2回): Analytical Commentスクリプト

プライスアクション分析ツールキットの開発(第2回): Analytical Commentスクリプト

MetaTrader 5 | 1 4月 2025, 08:12
76 0
Christian Benjamin
Christian Benjamin

はじめに

プライスアクション分析を簡素化し、市場評価を加速するために、Chart Projectorの概念に基づいて構築した強力なツールを開発しました。このツールは、トレーダーがチャートをナビゲートすることなく、単一のスクリプトで重要な市場データの効率的な概要を提供します。前日の始値と終値、重要な支持と抵抗のレベル、前日の高値と安値、取引量などの主要な指標を簡単に表示します。さらに、簡単に参照できるように、チャート上に垂直テーブルも直接表示されます。

このツールは、重要な支持線と抵抗線を自動的に描画し、視覚的なヒントを提供して分析を支持します。また、市場の状況や潜在的な動きに関する有益な解説も提供し、取引の意思決定に重要な背景情報を加えます。

以下のサブトピックに進みます。

  1. このツールに注目する理由
  2. 新しいツールの概要
  3. MQL5スクリプト
  4. コード開発
  5. テスト
  6. 結論


このツールに注目する理由

特定の市場情報が市場の方向性の予測にどのように影響するかを調査した結果、最も重要な市場の洞察を迅速に提供するツールを作成しました。これにより、履歴データを精査したり、複雑な計算を実行したりする必要がなくなります。このツールの際立った特徴は、わずか数秒で情報を提供できることです。

このツールは、前日の始値と終値を表示し、主要な抵抗線および支持線を強調表示します。おそらく最も重要なのは、現在の取引量と前日の取引量の両方を計算する点です。取引量を理解することは、市場の参加者数を反映するため非常に重要です。今日の取引量が昨日を大きく上回る場合、より多くのトレーダーが市場に参加していることを示し、価格変動が激しくなり、上昇(強気)または下降(弱気)のトレンドがさらに強化される可能性があります。 これらすべての情報を組み合わせることで、予想される価格の動向に関する洞察を得ることができます。

主な機能の一部を以下の表に示します。

利点 詳細
主要レベルの識別 前日の高値と安値を知っておくと、トレーダーは買い圧力や売り圧力が高まる可能性のある重要な心理的レベルを把握するのに役立ちます。
取引量インサイト 取引量を分析すると、トレーダーは市場の関心度を測ることができます。特定の価格レベルでの取引量が多いということは、トレーダー間の強い確信を示すことが多く、将来の取引にとって重要な参考になります。
トレンドの確認 始値と終値は市場の感情についての洞察を提供します。始値と比較して終値が高い場合は強気の感情を示し、その逆の場合は弱気の感情を示します。
チャート注釈 このスクリプトは、チャート上に支持と抵抗の水平線を追加し、トレーダーの分析を強化できる視覚的なヒントを提供します。この視覚的サポートにより、市場レベルと価格変動のダイナミクスを理解しやすくなります。
明確なコミュニケーション グラフ上のコメントボックスを使用すると、重要な分析を簡潔に伝えることができ、迅速な意思決定に役立ちます。
学習ツール 初心者トレーダーにとって、このスクリプトは、過去の価格データ、取引量、将来の価格変動への影響の読み方や解釈方法を理解するのに役立つ教育ツールとして役立ちます。
効率性と時間の節約 このツールは主要な指標の計算と取得を自動化し、時間を節約します。トレーダーはデータの収集ではなく、取引計画の実行に集中できるようになります。


スクリプトの概要

これから紹介するMQL5スクリプトは、前取引日の重要な指標を自動的に収集するのに役立ちます。これにより分析が容易になり、データ収集に費やす時間を減らして戦略に多くの時間を費やすことができます。スクリプトは次のように実行されます。 

1. 取引プラットフォームで前取引日のデータが直接取得され、重要なテクニカルレベルが計算され、表示されます。

主要テクニカルレベル

 図1:必須レベル

図1には、前日の始値と終値、主要な抵抗レベルと支持レベル、およびそれらのレベルに対する市場の反応など、市場に関する重要な情報が表示されています。

2. すぐに参照できるようにチャートに注釈が付けられます。

情報の表示方法

図2:チャートの即時参照

図2では、MetaTrader 5チャートに即時参照情報がどのように表示されるかがわかります。

スクリプトがどのように機能するかを理解するために、詳細を見ていきましょう。


MQL5スクリプト

このスクリプトは、前日の市場パフォーマンスを分析し、トレーダーに重要な分析結果を提示するように設計されています。これは、情報に基づいた取引決定をおこなうために最近のプライスアクションと取引量の傾向を理解することに依存しているデイトレーダーやテクニカルアナリストにとって特に有用です。以下は、MetaTrader5プラットフォーム内で実装する準備が整った完全なスクリプトです。

//+------------------------------------------------------------------+
//|                                                          ACS.mq5 |
//|                        Copyright 2024, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2024, MetaQuotes Software Corp."
#property link        "https://www.mql5.com/ja/users/lynnchris"
#property description "Script that displays previous day metrics on the current chart and predicts market direction."
#property version     "1.0"

#include <Trade\Trade.mqh>

//+------------------------------------------------------------------+
//| Input parameters                                                 |
//+------------------------------------------------------------------+
input color TableTextColor = clrBlue; // Text color for the table
input int   TableXOffset   = 10;      // X offset for the table
input int   TableYOffset   = 50;      // Y offset for the table
input color SupportColor = clrGreen; // Color for the support line
input color ResistanceColor = clrRed; // Color for the resistance line

//+------------------------------------------------------------------+
//| Global variables                                                 |
//+------------------------------------------------------------------+
double prevDayHigh, prevDayLow, prevDayOpen, prevDayClose, prevDayVolume;
double currentDayVolume;
double keySupport, keyResistance; // Initialized but will be calculated

//+------------------------------------------------------------------+
//| Main function                                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Get previous day's data
   int prevDayIndex = iBarShift(NULL, PERIOD_D1, iTime(NULL, PERIOD_D1, 1));

   if(prevDayIndex == -1)
     {
      Print("Error retrieving previous day's data.");
      return;
     }

   prevDayHigh    = iHigh(NULL, PERIOD_D1, prevDayIndex);
   prevDayLow     = iLow(NULL, PERIOD_D1, prevDayIndex);
   prevDayOpen    = iOpen(NULL, PERIOD_D1, prevDayIndex);
   prevDayClose   = iClose(NULL, PERIOD_D1, prevDayIndex);
   prevDayVolume  = iVolume(NULL, PERIOD_D1, prevDayIndex);

//--- Get today's volume
   currentDayVolume = iVolume(NULL, PERIOD_D1, 0); // Current day's volume

//--- Calculate key support and resistance
   keySupport = prevDayLow;  // Support level can be set to the previous day's low
   keyResistance = prevDayHigh; // Resistance level can be set to the previous day's high

//--- Manage existing lines (if any)
//ObjectDelete("SupportLine");
//ObjectDelete("ResistanceLine");

//--- Create support line
   if(!ObjectCreate(0, "SupportLine", OBJ_HLINE, 0, 0, keySupport))
     {
      Print("Failed to create SupportLine");
     }
   ObjectSetInteger(0, "SupportLine", OBJPROP_COLOR, SupportColor);
   ObjectSetInteger(0, "SupportLine", OBJPROP_WIDTH, 2); // Set the width of the line

//--- Create resistance line
   if(!ObjectCreate(0, "ResistanceLine", OBJ_HLINE, 0, 0, keyResistance))
     {
      Print("Failed to create ResistanceLine");
     }
   ObjectSetInteger(0, "ResistanceLine", OBJPROP_COLOR, ResistanceColor);
   ObjectSetInteger(0, "ResistanceLine", OBJPROP_WIDTH, 2); // Set the width of the line

//--- Determine the day's nature (Bullish or Bearish)
   string marketNature;
   if(prevDayClose > prevDayOpen)
     {
      marketNature = "Bullish";
     }
   else
      if(prevDayClose < prevDayOpen)
        {
         marketNature = "Bearish";
        }
      else
        {
         marketNature = "Neutral";
        }

//--- Compare volumes and determine market sentiment
   string volumeCommentary;
   if(currentDayVolume > prevDayVolume)
     {
      volumeCommentary = "Current day volume is higher than previous day volume. Bullish sentiment may continue.";
     }
   else
      if(currentDayVolume < prevDayVolume)
        {
         volumeCommentary = "Current day volume is lower than previous day volume. Bearish sentiment may follow.";
        }
      else
        {
         volumeCommentary = "Current day volume is equal to previous day volume. Market sentiment remains uncertain.";
        }

//--- Generate market movement commentary
   string marketCommentary;
   if(marketNature == "Bullish")
     {
      marketCommentary = "The market closed higher yesterday, indicating bullish sentiment. Look for potential continuation patterns.";
     }
   else
      if(marketNature == "Bearish")
        {
         marketCommentary = "The market closed lower yesterday, indicating bearish sentiment. Consider taking positions that align with this trend.";
        }
      else
        {
         marketCommentary = "The market showed neutrality with little change. Watch for potential breakout opportunities.";
        }

//--- Display the information in a table-like format on the chart
   string textOutput = "Previous Day Analytics:\n";
   textOutput += "Open: " + DoubleToString(prevDayOpen, 5) + "\n";
   textOutput += "Close: " + DoubleToString(prevDayClose, 5) + "\n";
   textOutput += "High: " + DoubleToString(prevDayHigh, 5) + "\n";
   textOutput += "Low: " + DoubleToString(prevDayLow, 5) + "\n";
   textOutput += "Volume (Prev Day): " + DoubleToString(prevDayVolume, 0) + "\n";
   textOutput += "Volume (Current Day): " + DoubleToString(currentDayVolume, 0) + "\n";
   textOutput += "Support: " + DoubleToString(keySupport, 5) + "\n";
   textOutput += "Resistance: " + DoubleToString(keyResistance, 5) + "\n";
   textOutput += "\nMarket Nature: " + marketNature + "\n";
   textOutput += volumeCommentary + "\n";
   textOutput += marketCommentary;

// Draw the text output on the chart
   Comment(textOutput);
  }

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+


コード開発

MetaEditorを使用してコードを開発します。ここでは、スクリプトを作成することを選択します。以下では、これを達成するための手順を概説します。

1. プロパティ

これらのプロパティは、自分の作品に適切なクレジットを与え、スクリプトの作者やソースに関する重要な詳細を共有するのに役立ちます。また、スクリプトのバージョンも指定します。これは、更新を追跡し、ユーザーが変更を認識できるようにするのに役立ちます。

#property copyright "2024, MetaQuotes Software Corp"
#property link      "https://www.mql5.com/ja/users/lynnchris"
#property version   "1.0"

2.   必要なライブラリをインクルードする

この行ではTrade.mqhライブラリがインクルードされています。

Trade:この用語は、取引操作を管理するために設計されたさまざまな関数、クラス、またはオブジェクトを指すと考えられます。これらの要素により、取引の実行、取引ステータスの確認、取引アルゴリズム内での関連タスクの処理が容易になります。

.mqh:このファイル拡張子は、MetaQuotesヘッダーファイルに使用されます。MetaTraderでは、.mqhファイルは関数、クラス、ライブラリなどの再利用可能なコードを保存する手段として機能します。このコードは他のMQLプログラムに簡単に組み込むことができ、効率性とモジュール性が向上します。

#include <Trade\Trade.mqh>

3. 入力パラメータ 

入力パラメータは、MQL5プログラムで定義される変数であり、ユーザーは基礎となるコードを変更することなく、ストラテジーまたはEAの入力設定で調整できます。

スクリプトではユーザー入力パラメータも使用できるため、トレーダーは自分の好みに合わせて分析を柔軟に調整できます。つまり、支持線と抵抗線に特定のシンボルや色を選択できるため、ツールがよりパーソナライズされ、読みやすくなります。

input color TableTextColor = clrBlue; // Text color for the table
input int   TableXOffset   = 10;      // X offset for the table
input int   TableYOffset   = 50;      // Y offset for the table
input color SupportColor = clrGreen; // Color for the support line
input color ResistanceColor = clrRed; // Color for the resistance line

次に、グローバル変数について説明します。これらのグローバル変数には、前日の価格変動と当日の取引量に関する情報が保存されます。変数keySupportとkeyResistanceは、後にコード内で初期化されます。

double prevDayHigh, prevDayLow, prevDayOpen, prevDayClose, prevDayVolume;
double currentDayVolume;
double keySupport, keyResistance; // Initialized but will be calculated

4. 主な機能

これはスクリプトの実行が開始されるメイン関数です。この関数内にあるものはすべて、スクリプトの実行時に実行されます。スクリプトは、取引の実行、注文の変更、シグナルの生成など、MetaTrader 5環境で特定のタスクを実行する単一実行プログラムです。

void OnStart()

まず、価格レベルや取引量など、前取引日のデータを取得します。このステップでは、最新の市場動向を分析し、情報に基づいた取引決定をおこなうために不可欠な、最後に完了した日足のインデックスを識別します。

int prevDayIndex = iBarShift(NULL, PERIOD_D1, iTime(NULL, PERIOD_D1, 1));

前日のインデックスが正常に取得されたかどうかを確認します。そうでない場合は、エラーメッセージを出力して関数を終了します。

if (prevDayIndex == -1)
{
   Print("Error retrieving previous day's data.");
   return;
}

次に、前日のデータを取得します。

prevDayHigh    = iHigh(NULL, PERIOD_D1, prevDayIndex);
prevDayLow     = iLow(NULL, PERIOD_D1, prevDayIndex);
prevDayOpen    = iOpen(NULL, PERIOD_D1, prevDayIndex);
prevDayClose   = iClose(NULL, PERIOD_D1, prevDayIndex);
prevDayVolume  = iVolume(NULL, PERIOD_D1, prevDayIndex);

当日の取引量を取得する

現在の日の取引量を取得します。

currentDayVolume = iVolume(NULL, PERIOD_D1, 0); // Current day's volume

支持レベルと抵抗レベルを計算する

支持は前日の安値に設定され、抵抗は前日の高値に設定されます。

keySupport = prevDayLow;  // Support level can be set to the previous day's low
keyResistance = prevDayHigh; // Resistance level can be set to the previous day's high

支持線と抵抗線を作成する

支持を表す水平線の作成を試みます。失敗した場合は、エラーメッセージが出力されます。抵抗線でも同じプロセスが続きます。

if (!ObjectCreate(0, "SupportLine", OBJ_HLINE, 0, 0, keySupport))
{
   Print("Failed to create SupportLine");
}

 市場の性質を判断する

次の部分では、前日の始値と終値に基づいて、市場が強気、弱気、中立のどちらであったかを判断します。

if (prevDayClose > prevDayOpen)
{
   marketNature = "Bullish";
}
else if (prevDayClose < prevDayOpen)
{
   marketNature = "Bearish";
}
else
{
   marketNature = "Neutral";
}

コメント

Comment()関数は、取引チャート上に説明テキストを直接表示する方法を提供します。これを使用して、現在の値、取引シグナル、ステータスメッセージなどの重要な情報を表示できます。

以下は、現在の取引量と前日の取引量の比較に対するコメントです。

if (currentDayVolume > prevDayVolume)
{
   volumeCommentary = "Current day volume is higher...";
}
else if (currentDayVolume < prevDayVolume)
{
   volumeCommentary = "Current day volume is lower...";
}
else
{
   volumeCommentary = "Current day volume is equal...";
}

このスクリプトは、Comment関数を使用して、前日の始値、高値、安値、終値、前日と当日の取引量を表示する、わかりやすい書式設定されたメッセージをチャート上に書き込みます。これはトレーダーにとって即時の参照ポイントとして機能します。

if (marketNature == "Bullish")
{
   marketCommentary = "The market closed higher yesterday...";
}
else if (marketNature == "Bearish")
{
   marketCommentary = "The market closed lower yesterday...";
}
else
{
   marketCommentary = "The market showed neutrality...";
}

テーブルを表示する

最後に、収集されたすべてのデータを含むテキストメッセージを作成し、それをチャートに表示します。

string textOutput = "Previous Day Analytics:\n";
textOutput += "Open: " + DoubleToString(prevDayOpen, 5) + "\n";
...
textOutput += marketCommentary;

// Draw the text output on the chart
Comment(textOutput);


テスト

スクリプトを正常に実装するための手順を以下に示します。

1. MetaTrader 5を開き、MetaEditorに移動します。

2. MetaEditorで、[新規作成] > [スクリプト]を選択して新しいスクリプトを作成します。

3. 提供されたスクリプトをコピーしてエディターに貼り付けます。

4. [コンパイル]ボタンを使用してスクリプトをコンパイルします。エラーがないことを確認します。

5. MetaTraderプラットフォームに戻り、ナビゲーターパネルで[Script]下のスクリプトを見つけて、目的のチャートにドラッグします。 スクリプトをチャートにドラッグすると、次のような結果が得られました。

  テスト結果1

図3:ツールテスト結果1

6. 表示されるダイアログボックスで、カスタム入力パラメータ(必要に応じて)を設定します。以下は、MetaTrader 5でいくつかのパラメータを変更する方法を示すGIFです。

  パラメータの変更

図4:パラメータの設定

スクリプトを実行すると、次の結果が得られました。以下に、スクリプトをテストしたさまざまなペアの3つの異なるGIFを提供します。最初のGIFは、通貨ペアUSD/SEKの結果を示しています。

  ツールの結果

図5:ツールテスト結果2

上の図5では、ツールが必要な情報を効果的に提示しています。これは、予想される強気の市場センチメントを示しています。市場は当初わずかに弱気な動きを見せましたが、日が進むにつれて強い強気の勢いを見せました。

次に、Crash 900 Indexも分析しました。

  テスト結果

図6:ツールテスト結果3

図6のCrash 900 Indexでも、この情報が明確に示されており、弱気な感情が急速に高まり、反転も見られなかったことが明らかになりました。

最後に、USDCNHペアを以下のように分析しました。

  結果

図7:ツールテスト結果4

上の図7では、ツールのパフォーマンスが非常に良好で、強気な市場の動きを示しています。市場はそれに応じて反応し、抵抗レベルと支持レベルの両方を尊重しました。

さらに、ツールのテストプロセス中に、図3 (Boom 300 Index)にいくつかの注目すべき結果が示されています。前日の開始価格と終了価格を明確に示し、市場分析と市場行動に関する貴重な洞察を提供します。ツールのナビゲーションによって識別されたように、データは弱気傾向も示しています。


結論

ツールの開発とテストに成功したので、Analytical Commentツールは堅牢であると自信を持って言えます。過去の市場動向を迅速に分析し、支持と抵抗のレベルを特定し、取引量を計算し、収集された情報に基づいて予想される将来の価格変動に関する洞察を提供する機能は印象的です。

 情報が明確に提示されるため、使いやすさが向上します。トレーダーには、結果と意思決定プロセスを改善するために、このツールと独自の取引戦略を統合することをお勧めします。さらに、このツールは、正確な分析に必要な現在の時間量を計算するため、日が進むにつれて最適に機能することがわかりました。

日付 ツール名   詳細 バージョン  アップデート  備考
01/10/24 Chart Projector 前日のプライスアクションをゴースト効果でオーバーレイするスクリプト  1.0 初回リリース Lynnchris Toolchestの最初のツール
18/11/24 Analytical Comment 前日の情報を表形式で提供し、市場の将来の方向性を予測する  1.0 初回リリース Lynnchris Tool Chestの2番目のツール

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

添付されたファイル |
Connexus Observer(第8回):リクエストObserverの追加 Connexus Observer(第8回):リクエストObserverの追加
連載「Connexusライブラリ」の最終回では、Observerパターンの実装に加え、ファイルパスやメソッド名に関する重要なリファクタリングについて解説します。本連載を通じて、複雑なアプリケーションにおけるHTTP通信を簡素化することを目的としたConnexusの開発全体を取り上げました。
MQL5での取引戦略の自動化(第1回):Profitunityシステム(ビル・ウィリアムズ著「Trading Chaos」) MQL5での取引戦略の自動化(第1回):Profitunityシステム(ビル・ウィリアムズ著「Trading Chaos」)
この記事では、ビル・ウィリアムズのProfitunityシステムを詳しく分析し、その核心となる構成要素や、市場の混乱の中での独自の取引アプローチを解説します。MQL5用いたシステムの実装方法を、主要なインジケーターやエントリー/エグジットシグナルの自動化に焦点を当てながら説明します。さらに、戦略のテストと最適化をおこない、さまざまな市場環境におけるパフォーマンスについて考察します。
MQL5で取引管理者パネルを作成する(第7回):信頼できるユーザー、回復、暗号化 MQL5で取引管理者パネルを作成する(第7回):信頼できるユーザー、回復、暗号化
チャートの更新や管理パネル(Admin Panel) EAとのチャットに新しいペアを追加する際、または端末を再起動するたびにトリガーされるセキュリティプロンプトは、時に煩わしく感じられることがあります。このディスカッションでは、ログイン試行回数を追跡して信頼できるユーザーを識別する機能を検討し、実装します。一定回数の試行に失敗した場合、アプリケーションは高度なログイン手続きに移行し、パスコードを忘れたユーザーが回復できるようにします。さらに、管理パネルに暗号化を効果的に統合してセキュリティを強化する方法についても取り上げます。
知っておくべきMQL5ウィザードのテクニック(第47回):時間差分を用いた強化学習 知っておくべきMQL5ウィザードのテクニック(第47回):時間差分を用いた強化学習
時間差分学習は、エージェントの訓練中に予測された報酬と実際の報酬の差に基づいてQ値を更新する強化学習のアルゴリズムの一つです。特に、状態と行動のペアにこだわらずにQ値を更新する点に特徴があります。したがって、これまでの記事と同様に、ウィザードで作成したエキスパートアドバイザー(EA)での適用方法を検討していきます。