English Deutsch
preview
プライスアクション分析ツールキットの開発(第4回):Analytics Forecaster EA

プライスアクション分析ツールキットの開発(第4回):Analytics Forecaster EA

MetaTrader 5統合 | 11 4月 2025, 15:20
79 0
Christian Benjamin
Christian Benjamin

内容


はじめに

スクリプトからエキスパートアドバイザー(EA)へと移行した前回のツール「Analytics Master EA」は、主要なメトリックを分析し、チャート上で継続的に情報を更新するために設計されていました。それは基礎的な資産として有用でしたが、分析情報へのアクセスはチャート内のみに限定されていました。より高度な分析ツールの開発に進む前に、ブロードキャスト機能をTelegramと統合することで、

分析情報へのアクセスを広げることが重要だと考えています。Telegramを選んだ理由は、トレーダーの間での人気と使いやすいインターフェイスによるものです。MetaTrader 5のチャート更新をTelegramと連携させることで、アクティブなトレーダーにとって大きなメリットが得られます。この構成により、重要な市場情報へ即座にアクセスできるようになり、ユーザー体験が向上し、情報伝達がスムーズになります。その結果、より効果的な戦略の構築と、急速に変化する市場に対する迅速な対応が可能となります。この統合により、成功の可能性が高まり、より多くの情報に基づいた、タイムリーで的確な意思決定ができるようになります。


前の記事の振り返り

ここで、以前のツールである Analytics Master EAを振り返ってみましょう。このツールで使用していた分析情報を、そのままTelegramに統合しています。詳細については、https://www.mql5.com/ja/articles/16434を参照してください。 Analytics Master EAは、次の主要な市場指標を分析および計算するように設計されています。

  • 前日の始値と終値
  • 前日の取引量
  • 今日の取引量
  • 前日の高値と安値
  • 主要な支持と抵抗のレベル
  • 口座残高
  • 口座エクイティ
  • 市場スプレッド
  • 最小および最大ロットサイズ
  • 市場のボラティリティ

これらのメトリック値を理解することは、トレーダーにとって非常に重要です。市場の動向や傾向に関する洞察を提供してくれるからです。前日のメトリックは現在の市場状況の文脈を把握するのに役立ち、現在のメトリックは市場のパフォーマンスを測る指標となります。支持や抵抗のレベルを特定することで、エントリーやエグジットの判断をより的確におこなうことができます。また、口座残高やエクイティを把握しておくことで、リスク管理も効果的におこなえます。市場スプレッド、ロットサイズ、ボラティリティに関する洞察は、トレードの執行を最適化し、リスクを抑えながら利益を最大化するために不可欠です。これらのメトリックを的確に把握することは、情報に基づいた戦略立案と、全体的なトレードパフォーマンスの向上につながります。

EAは主要な支持レベルと抵抗レベルにトレンドラインを描画し、計算されたメトリックに基づいて予測される市場の方向性を提供しました。これらすべての情報は、チャート上に表形式で表示され、2時間ごとに定期的に更新されていました(図I参照)。

Analytics Master結果

図1:分析結果

分析セクションには、直近の情報をすぐに確認できるよう、最終更新時刻も表示されます。 このツールはあくまで市場分析専用に設計されており、自動的に売買を行うことはありません。ユーザーは、分析結果や生成されたシグナルに基づいて、取引を手動で実行する必要があります。最良の結果を得るためには、このデータをユーザー自身のトレード戦略と組み合わせて活用することが重要です。


プロジェクト概要

TelegramとMetaTrader 5の統合では、MetaTrader 5取引プラットフォームをTelegramというメッセージングサービスに接続することで、トレーダーが取引活動に関する即時通知、アラート、分析をTelegramチャットで直接受け取ることができるようになります。この統合にはTelegram Bot APIが使用されており、MetaTrader 5上で稼働する取引アルゴリズムやEAから、指定されたTelegramチャットへの自動送信を実現します。以下の図にその仕組みをまとめています。


図2:統合パスウェイ

統合の主要コンポーネント

  • Telegramボット:Telegram上のBotFatherを使ってTelegramボットを作成します。これにより、Telegram APIにリクエストを送信する際に必要となるアクセストークンが発行されます。
  • チャットID:メッセージを送信するチャットIDを特定します。これは個人チャットまたはグループチャットのいずれかであり、アラートをどこに配信するかを指定するために使用されます。
  • MetaTrader 5MQL5プログラミング言語を使用して、Telegram APIと接続できるEAまたはスクリプトを開発または修正します。通常、メッセージを送信するためにHTTP POSTリクエストが使用されます。


Telegramボットの構築とチャートIDの取得 

Telegramボットは、Telegramメッセージングプラットフォーム上で動作する自動化されたソフトウェアアプリケーションで、ユーザーとのインタラクションを自動化されたタスクを通じて実現します。これらのボットの主な機能の一つは、ユーザーの問い合わせに対して迅速かつ適切な応答を提供し、人的な介入なしでコミュニケーションを効率化することです。この機能によって、企業や開発者は通知の送信やコマンドの処理などさまざまなタスクを自動化でき、ユーザーエクスペリエンスとエンゲージメントを向上させることができます。

さらに、Telegramボットは情報の取得にも優れており、市場データやニュースフィードなどの外部データソースから情報を取得し、それをユーザーに直接提供することができます。取引の文脈では、ボットは特定の市場イベント、価格の変動、または事前に定義された基準に基づくシグナルに関するアラートをユーザーに通知するのに非常に役立ちます。APIや他のサービスと連携する能力により、ボットはデータ分析やレポート作成などの高度な機能も実行でき、さまざまな用途に対応する柔軟なツールとなります。次の手順に従ってTelegramボットを作成します。

手順1:Telegramアプリを開く

デバイスにTelegramアプリがインストールされていることを確認してください。

手順2:BotFatherを検索する

手順2

図3:Botfather

アプリの検索バーに「BotFather」と入力します。

BotFatherは、他のボットを作成および管理できる公式Telegramボットです。

手順3:BotFatherとのチャットを始める

手順3/4

図4:手順3と4

BotFatherの結果をクリックしてチャットを開きます。

会話を開始するには、[Start]ボタンをクリックするか、「/start」と入力します。

手順4:新しいボットを作成する

コマンド「/newbot」を入力して送信します。

BotFatherはボットの名前を選択するように要求します。これはユーザーに表示される表示名です。

名前を入力すると、ボットのユーザー名を入力するよう求められます。ユーザー名は「bot」で終わる必要があります(例:MyCoolBot)。

手順5:ボットトークンを受け取る

手順4/5

図5:手順5

前の手順を完了すると、BotFatherがボットを作成し、一意のAPIトークンを提供します。このトークンはTelegramボットAPIとやり取りするために不可欠なので、安全な場所に保存してください。

Telegramボットを作成したら、次の手順はチャットIDを見つけることです。一方、チャートIDは、取引アプリケーションやチャート作成ツール内で特定のデータ視覚化やチャートに割り当てられた一意の識別子です。これらのIDは、チャートを識別し、取得する上で重要な役割を果たし、ユーザーや開発者が特定の視覚化を簡単に参照できるようにします。チャートIDを使用すると、特定のチャートに関連する現在のデータや過去のデータを抽出することができ、データ分析を個別のニーズに合わせてカスタマイズできます。この機能は、取引において特に有益で、ユーザーが迅速に関連情報にアクセスし、情報に基づいた意思決定をおこなえるようになります。

さらに、チャートIDはカスタマイズを可能にし、開発者が個々のユーザーの好みや取引戦略に合わせてパラメータや設定を変更できるようにします。チャートIDをTelegramボットと統合すると、その機能は大幅に強化され、ボットはチャットインターフェース内で特定のデータ視覚化を直接ユーザーに提供することができ、取引の決定を下すプロセスが効率化されます。以下は、Telegramボットを使用して取得する2つの方法です。

方法1:Get IDボットの使用

これは直接的なアプローチです。@get_id_botや@userinfobotなどのボットを検索して開きます。[Start]ボタンをクリックするか、「/start」と入力してボットを起動すると、チャットIDが表示されるので、それを書き留めておきます。

Get Idボット

図6:IDを取得

方法2:Webブラウザの使用

まず、Telegramでボットにメッセージを送信します。次に、Webブラウザを開き、次のURLを入力します(<YourBotToken>を実際のボットトークンに置き換えます)。 

https://api.telegram.org/bot<YourBotToken>/getUpdates

Enterキーを押した後、APIから返された応答を調べます。チャットIDは応答の「result」セクションに表示されます。


EAへのTelegram統合の実装

EAへのTelegram統合の実装は、MetaTrader上で動作する取引EAにTelegramのメッセージ機能を組み込むことを意味します。この統合により、EAはTelegramアカウントに即時通知やアラートを送信できるようになり、市場の状況や重要な指標、その他の取引に関する情報をユーザーに提供します。TelegramのAPIを活用することで、EAの機能が強化され、ユーザーは取引プラットフォームを頻繁にチェックしなくても重要な更新を受け取ることができます。これにより、市場の変動に迅速に対応できるようになり、取引体験全体がより効率的になります。

Analytics Master EAのコードは、分析されたメトリックをTelegramアプリに転送できるようにするためのコマンドを組み込むことで改善されました。統合されたMQL5コードを提供し、統合プロセスをステップごとにガイドします。

Analytics Forecaster (EA)コード

//+-------------------------------------------------------------------+
//|                                        Analytics Forecaster EA.mq5|
//|                                 Copyright 2024, Christian Benjamin|
//|                                               https://www.mql5.com|
//+-------------------------------------------------------------------+
#property copyright   "2024, MetaQuotes Software Corp."
#property link        "https://www.mql5.com/ja/users/lynnchris"
#property description "EA for market analysis,commenting and Telegram Integeration"
#property version     "1.1"
#property strict

// Inputs for risk management
input double RiskPercentage = 1.0;        // Percentage of account balance to risk per trade
input double StopLossMultiplier = 1.0;    // Multiplier for determining the stop loss distance
input int ATR_Period = 14;                // Period for ATR calculation

// Telegram configuration
input string TelegramToken = "YOUR BOT TOKEN"; // Your Telegram bot token
input string ChatID = "YOUR CHART ID"; // Your chat ID
input bool SendTelegramAlerts = true; // Option to enable/disable Telegram notifications

// Global variables for storing values
datetime lastUpdateTime = 0;
double previousDayOpen, previousDayClose, previousDayHigh, previousDayLow;
double previousDayVolume;
double currentDayVolume;
double support, resistance;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   lastUpdateTime = 0; // Set the initial update time
   return INIT_SUCCEEDED;
  }

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0); // Clean up any drawn objects on the current chart
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   UpdateMetrics(); // Call to the function that fetches and displays the metrics
  }

//+------------------------------------------------------------------+
//| Update metrics and display them                                  |
//+------------------------------------------------------------------+
void UpdateMetrics()
  {
// Check if 2 hours have passed since the last update
   if(TimeCurrent() - lastUpdateTime >= 2 * 3600)
     {
      // Fetch previous day's data
      datetime prevDay = iTime(NULL, PERIOD_D1, 1);
      previousDayOpen = iOpen(NULL, PERIOD_D1, 1);
      previousDayClose = iClose(NULL, PERIOD_D1, 1);
      previousDayHigh = iHigh(NULL, PERIOD_D1, 1);
      previousDayLow = iLow(NULL, PERIOD_D1, 1);
      previousDayVolume = iVolume(NULL, PERIOD_D1, 1);

      // Fetch current day's volume
      currentDayVolume = iVolume(NULL, PERIOD_D1, 0); // Volume for today

      // Calculate support and resistance
      support = previousDayLow - (previousDayHigh - previousDayLow) * 0.382; // Fibonacci level
      resistance = previousDayHigh + (previousDayHigh - previousDayLow) * 0.382; // Fibonacci level

      // Determine market direction
      string marketDirection = AnalyzeMarketDirection(previousDayOpen, previousDayClose, previousDayHigh, previousDayLow);

      // Calculate possible lot size based on risk management
      double lotSize = CalculateLotSize(support, resistance);

      // Retrieve account metrics
      double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
      double accountEquity = AccountInfoDouble(ACCOUNT_EQUITY);

      // Calculate market spread manually
      double marketBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
      double marketAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      double marketSpread = marketAsk - marketBid; // Calculate spread

      double minLotSize = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
      double maxLotSize = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);

      // Calculate market volatility using ATR
      int atrHandle = iATR(NULL, PERIOD_H1, ATR_Period); // Get the ATR handle
      double atrValue = 0.0;

      if(atrHandle != INVALID_HANDLE)   // Check if the handle is valid
        {
         double atrBuffer[]; // Array to hold the ATR values
         if(CopyBuffer(atrHandle, 0, 0, 1, atrBuffer) > 0)   // Copy the latest ATR value
           {
            atrValue = atrBuffer[0]; // Retrieve the ATR value from the buffer
           }
         IndicatorRelease(atrHandle); // Release the indicator handle
        }

      // Create the output string, including pair name and last update time
      string pairName = Symbol(); // Get the current symbol name
      string lastUpdateStr = TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES);
      string infoStr = StringFormat("Pair: %s\nPrev Day Open: %.2f\nPrev Day Close: %.2f\nPrev Day High: %.2f\nPrev Day Low: %.2f\n"
                                    "Prev Day Volume: %.0f\nCurrent Day Volume: %.0f\nMarket Direction: %s\n"
                                    "Support: %.2f\nResistance: %.2f\nAccount Balance: %.2f\nAccount Equity: %.2f\n"
                                    "Market Spread: %.2f\nMin Lot Size: %.2f, Max Lot Size: %.2f\n"
                                    "Market Volatility (ATR): %.2f\nLast Update Time: %s\nPossible Lot Size: %.2f",
                                    pairName, previousDayOpen, previousDayClose, previousDayHigh, previousDayLow,
                                    previousDayVolume, currentDayVolume, marketDirection,
                                    support, resistance, accountBalance, accountEquity, marketSpread,
                                    minLotSize, maxLotSize, atrValue, lastUpdateStr, lotSize);

      // Log the information
      Print(infoStr);

      // Display information on the chart
      Comment(infoStr);

      // Send Telegram notification
      if(SendTelegramAlerts)
         SendTelegramMessage(infoStr);

      // Remove old trend lines and create new ones for previous day's high/low
      ObjectsDeleteAll(0);

      // Draw continuous trend lines
      DrawContinuousTrendLine("PrevDayHigh", previousDayHigh);
      DrawContinuousTrendLine("PrevDayLow", previousDayLow);

      // Update last update time
      lastUpdateTime = TimeCurrent();
     }
  }

//+------------------------------------------------------------------+
//| Analyze market direction                                         |
//+------------------------------------------------------------------+
string AnalyzeMarketDirection(double open, double close, double high, double low)
  {
   string direction;

   if(close > open)
     {
      direction = "Bullish";
     }
   else
      if(close < open)
        {
         direction = "Bearish";
        }
      else
        {
         direction = "Neutral";
        }

// Include current trends or patterns based on high and low for further analysis
   if(high > open && high > close)
     {
      direction += " with bullish pressure"; // Example addition for context
     }
   else
      if(low < open && low < close)
        {
         direction += " with bearish pressure"; // Example addition for context
        }

   return direction;
  }

//+------------------------------------------------------------------+
//| Draw a continuous trend line to the left on the chart            |
//+------------------------------------------------------------------+
void DrawContinuousTrendLine(string name, double price)
  {
   datetime startTime = TimeCurrent() - 720 * 3600; // Extend 24 hours into the past
   ObjectCreate(0, name, OBJ_TREND, 0, startTime, price, TimeCurrent(), price);
   ObjectSetInteger(0, name, OBJPROP_COLOR, (StringFind(name, "High") >= 0) ? clrRed : clrBlue);
   ObjectSetInteger(0, name, OBJPROP_WIDTH, 2); // Set thickness of the line
   ObjectSetInteger(0, name, OBJPROP_XSIZE, 0); // Set this property to extend the line infinitely to the left
  }

//+------------------------------------------------------------------+
//| Calculate the lot size based on risk management                  |
//+------------------------------------------------------------------+
double CalculateLotSize(double support, double resistance)
  {
   double stopLossDistance = MathAbs((support - resistance) * StopLossMultiplier);
   double riskAmount = AccountInfoDouble(ACCOUNT_BALANCE) * (RiskPercentage / 100.0);

// Get the tick size for the current symbol
   double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);

// Calculate the lot size based on the stop loss and tick size
   double lotSize = riskAmount / (stopLossDistance / tickSize); // Adjusted for the correct pip size
   lotSize = NormalizeDouble(lotSize, 2); // Normalize the lot size to two decimal places

// Ensure lot size is above minimum lot size allowed by broker
   double minLotSize = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
   if(lotSize < minLotSize)
      lotSize = minLotSize;

   return lotSize;
  }

//+------------------------------------------------------------------+
//| Send message to Telegram API                                     |
//+------------------------------------------------------------------+
void SendTelegramMessage(string message)
  {
   string url = StringFormat("https://api.telegram.org/bot%s/sendMessage", TelegramToken);
   string headers = "Content-Type: application/json\r\n"; // Content type for JSON
   int timeout = 1000; // Timeout in milliseconds

// Format the data as JSON
   string postData = StringFormat("{\"chat_id\":\"%s\",\"text\":\"%s\"}", ChatID, message);

// Convert the string to a char array
   char dataArray[];
   StringToCharArray(postData, dataArray);

// Prepare the result buffer and response headers
   char result[];
   string responseHeaders;

// Perform the web request
   int responseCode = WebRequest("POST", url, headers, timeout, dataArray, result, responseHeaders);
   if(responseCode == 200)   // HTTP 200 OK
     {
      Print("Message sent successfully!");
     }
   else
     {
      PrintFormat("Error sending message. HTTP Response Code: %d. Error: %s", responseCode, GetLastError());
     }
  }

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

1.入力変数の宣言

EAの開始時に、必要な入力変数を宣言する必要があります。MQL5の入力変数を使用すると、トレーダーはコードを変更することなくEAの動作をカスタマイズできます。これにより、取引戦略を迅速に適応させることが容易になります。変数名は直感的にすることが重要です。例えば、TelegramTokenはその目的を明確に示しています。テスト時の設定の複雑さを減らすために、取引戦略に合わせた一般的な設定やデフォルト値を使用することを検討してください。

input string TelegramToken = "YOUR_BOT_API_TOKEN"; // Replace with your actual bot token
input string ChatID = "YOUR_CHAT_ID"; // Replace with your actual chat ID
input bool SendTelegramAlerts = true; // Control whether alerts are sent

 「YOUR_BOT_API_TOKEN」と「YOUR_CHAT_ID」を実際の値に置き換えることを忘れないでください。

2.メッセージ送信関数の作成

SendTelegramMessage関数は、Telegram APIへの構造化されたHTTP POSTリクエストを効果的に構築し、指定したチャットに通知を送信します。API URLの準備、ヘッダーの設定、メッセージデータのJSON形式でのフォーマット、リクエストの実行、レスポンスの処理をおこなうことで、この関数はEAがTelegramを介してユーザーに即時の更新を伝えられるようにします。この効率的なロジックにより、取引やアラートの迅速な通知が可能となり、ユーザーに手間をかけることなく情報提供することにより、EAの機能が向上します。

  • 関数の目的:この関数は、TelegramAPIとの通信を処理します。Telegramボットにメッセージを送信するために必要なロジックをカプセル化します。再利用可能な関数を作成することで、コードの可読性を確保し、重複を減らすことができます。
  • エラー処理:エラー処理を組み込むことは重要です。メッセージを送信する際には、送信成功だけでなく、発生したエラーもログに記録するべきです。この慣習はデバッグを助け、フィードバックを提供します。
void SendTelegramMessage(string message)
{
    string url = StringFormat("https://api.telegram.org/bot%s/sendMessage", TelegramToken);
    string headers = "Content-Type: application/json\r\n";
    int timeout = 1000;

    string postData = StringFormat("{\"chat_id\":\"%s\",\"text\":\"%s\"}", ChatID, message);

    char dataArray[];
    StringToCharArray(postData, dataArray);

    char result[];
    string responseHeaders;

    int responseCode = WebRequest("POST", url, headers, timeout, dataArray, result, responseHeaders);
    if (responseCode == 200)
    {
        Print("Message sent successfully! Response: ", CharArrayToString(result));
    }
    else
    {
        PrintFormat("Error sending message. HTTP Response Code: %d. Error: %s", responseCode, GetLastError());
    }
}

  • WebRequestについてWebRequest関数は、EAがAPIにHTTPリクエストを送信できるようにするため、非常に重要です。適切に機能させるには、EAプロパティで[自動取引を許可]オプションが有効になっていることを確認してください。

3. Telegramメッセージのトリガー

  • 時間チェックとデータの取得

コードの最初の部分では、市場メトリックの最後の更新から2時間が経過したかどうかを確認するための時間チェックがおこなわれます。TimeCurrent()関数を使用して現在の時刻を取得し、それをlastUpdateTime変数と比較します。2時間以上が経過している場合、EAは市場状況に関連する最新のデータを収集し始めます。このチェックは、EAがTelegramチャットに過剰にメッセージを送信してユーザーにスパムと見なされるのを防ぐために重要です。

// Check if 2 hours have passed since the last update
if (TimeCurrent() - lastUpdateTime >= 2 * 3600)
{
    // ... [Code that fetches data and calculates support/resistance, etc.]
}

  • 出力文字列の作成

2番目の部分では、EAの操作から収集された市場メトリックを統合するために、infoStrと呼ばれる詳細な出力文字列が生成されます。コードは、取引銘柄のペア名を取得し、さらにlastUpdateStrを使用してメッセージに表示する現在の時刻をフォーマットします。次に、StringFormat関数を使用してメッセージを構築し、前日の高値、安値、始値、終値、当日の取引量、市場の方向性、その他の口座詳細など、特定のメトリックに置き換えられるさまざまなプレースホルダーを組み込みます。このフォーマットされた文字列は、現在の市場状況を明確かつ構造的にまとめたもので、後にTelegramを通じて送信されるため、操作に不可欠です。

// Create the output string, including pair name and last update time
string pairName = Symbol(); // Get the current symbol name
string lastUpdateStr = TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES);
string infoStr = StringFormat("Pair: %s\nPrev Day Open: %.2f\nPrev Day Close: %.2f\n"
                               "Prev Day High: %.2f\nPrev Day Low: %.2f\n"
                               "Prev Day Volume: %.0f\nCurrent Day Volume: %.0f\n"
                               "Market Direction: %s\nSupport: %.2f\nResistance: %.2f\n"
                               "Account Balance: %.2f\nAccount Equity: %.2f\n"
                               "Market Spread: %.2f\nMin Lot Size: %.2f, Max Lot Size: %.2f\n"
                               "Market Volatility (ATR): %.2f\nLast Update Time: %s\nPossible Lot Size: %.2f",
                               pairName, previousDayOpen, previousDayClose, previousDayHigh,
                               previousDayLow, previousDayVolume, currentDayVolume,
                               marketDirection, support, resistance, accountBalance,
                               accountEquity, marketSpread, minLotSize, maxLotSize,
                               atrValue, lastUpdateStr, lotSize);

  •  情報の記録と表示

3番目の部分は、構築された情報のログ記録と表示に重点が置かれます。関数呼び出し「Print(infoStr);」は、MetaTraderプラットフォームの[エキスパート]タブにメッセージを記録し、Telegram経由で送信される情報を可視化できるようにします。これにより、メトリックが正しく作成されていることを確認するための便利なデバッグツールが提供されます。さらに、「Comment(infoStr);」は同じ情報を取引チャートに直接表示し、トレーダーがログを参照することなくメトリックを視覚的に確認できるようにします。これらの手順により、報告されたメトリックに関する情報がユーザーに提供され、データがTelegramに送信される前にその正確性が検証されます。

// Log the information
Print(infoStr); // Here the information is logged for debugging

// Display information on the chart
Comment(infoStr); // Display the same information on the chart

  • Telegram通知の送信

最後の部分では、コードはTelegram通知の実際の送信を管理します。(SendTelegramAlerts)文は、アラートを送信するオプションが有効になっているかどうかを確認し、ユーザーがコードを変更せずに簡単に通知を無効にできるようにします。アラートが有効になっている場合、関数呼び出し「SendTelegramMessage(infoStr)」によって、慎重に作成されたメッセージが指定されたTelegramチャットに送信されます。この手順は、市場指標がユーザーに効果的に伝達されるポイントであるため、非常に重要です。これに続いて、コードは「lastUpdateTime=TimeCurrent();」を使用してlastUpdateTime変数を現在の時刻に更新します。これにより、今回の更新サイクルが終了したことが記録され、次回の更新が先に設定された2時間の間隔に従って行われるようになります。

// Send Telegram notification
if (SendTelegramAlerts) // Check if sending alerts is enabled
    SendTelegramMessage(infoStr); // Send the constructed message

// Update last update time
lastUpdateTime = TimeCurrent();

  • 現在のペア名

また、分析されたメトリックの横に現在のペア名を表示する機能も追加しました。これにより、どのペアが分析されているかを簡単に識別できるようになります。

// Create the output string, including pair name and last update time
      string pairName = Symbol(); // Get the current symbol name

以下に、Telegramに表示される情報を示します。

ペア名

図7:ペアの結果


テスト 

テストの前に、情報がTelegramにスムーズに中継されるように、MetaTrader 5でいくつかの調整をおこなう必要があります。

Webリクエストを許可する

  • MetaTrader 5を開き、[ツール]>[オプション]>[エキスパートアドバイザ]に移動します。

Webリクエストを許可する

図8:Webリクエストの設定

  • [WebRequestを許可するURLリスト]のボックスをオンにし、https://api.telegram.orgをリストに追加します。この設定により、EAはTelegramのAPIにリクエストを送信できるようになります。

Webリクエストの設定

図9:Webリクエストの設定

テスト目的で、更新タイミングをより低い頻度に調整することもできます。この場合は、2時間から15秒に短縮します。

//+------------------------------------------------------------------+
//| Update metrics and display them                                  |
//+------------------------------------------------------------------+
void UpdateMetrics()
  {
// Check if 15 seconds have passed since the last update
   if(TimeCurrent() - lastUpdateTime >= 15)

次に、MetaEditorでMQL5コードをコンパイルし、EAまたはスクリプトをMetaTrader 5のチャートに添付します。コンパイルが成功したら、EAをチャートにドラッグします。そこから、EAから送信された更新に関する通知をTelegramで受信し始めるはずです。以下に、私のTelegramからのテスト結果を示します。

Telegramの結果

図10:Telegramの結果

下の図は、MetaTrader 5チャートで提供される情報がTelegramに関連する情報と同じであることも示しています。

結果

図11:テスト結果



結論

結論として、上記の図が示すように、Analytics Forecaster EAの成功は、高度な市場分析手法と、Telegramとの統合によるタイムリーな通知機能にあります。前日のデータ、当日の出来高比較、市場の方向性、リスク管理の原則といった複数の取引指標を活用することで、EAはトレーダーにとって有益な洞察を提供します。自動的に計算されたサポートラインとレジスタンスライン、さらにロットサイズの自動決定機能により、初心者から経験豊富なトレーダーまで、より精度の高い取引判断が可能になり、市場状況に応じた戦略の柔軟な調整とリスクの適切な管理が実現します。

また、Telegramとのシームレスな連携により、迅速なアップデートが可能となり、ユーザーとのインタラクションが強化されます。重要な取引情報をモバイル端末で即座に受け取れることで、取引状況の監視がより便利になり、スピーディな意思決定を後押しする環境が整います。総じて、Analytics Forecaster EAは、市場分析とリスク管理の自動化において高い機能性を示しており、ダイナミックに変化する相場の中でトレーダーがパフォーマンスを最大限に引き出すことを可能にします。正確なデータとユーザーフレンドリーな設計に重点を置いた本EAは、トレーダーの強力な武器となり、将来的な自動売買ソリューションの進化にもつながる可能性を秘めています。

日付 ツール名  詳細 バージョン  アップデート  備考
01/10/24 ChartProjector 前日のプライスアクションをゴースト効果でオーバーレイするスクリプト 1.0 初回リリース LynnchrisToolChestの最初のツール
18/11/24 Analytical Comment 前日の情報を表形式で提供し、市場の将来の方向性を予測する 1.0 初回リリース LynnchrisToolChestの2番目のツール
27/11/24 AnalyticsMaster 2時間ごとに市場指標を定期的に更新  1.01 v.2 LynnchrisToolChestの3番目のツール
02/12/2024 Analytics Forecaster  Telegram統合により、2時間ごとに市場指標を定期的に更新 1.1 第3版 ツール番号5

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

添付されたファイル |
出来高による取引の洞察:トレンドの確認 出来高による取引の洞察:トレンドの確認
強化型トレンド確認手法は、プライスアクション、出来高分析、そして機械学習を組み合わせることで、真の市場動向を見極めることを目的としています。この手法では、取引を検証するために、価格のブレイクアウトと平均比50%以上の出来高急増という2つの条件を満たす必要があります。さらに、追加の確認手段としてLSTMニューラルネットワークを活用します。システムはATR (Average True Range)に基づいたポジションサイズ設定と動的リスク管理を採用しており、誤ったシグナルを排除しつつ、多様な市場環境に柔軟に対応できる設計となっています。
Candlestick Trend Constraintモデルの構築(第9回):マルチ戦略エキスパートアドバイザー(III) Candlestick Trend Constraintモデルの構築(第9回):マルチ戦略エキスパートアドバイザー(III)
連載第3回へようこそ。今回は、日足のトレンドに沿った最適なエントリーポイントを特定する戦略として、ダイバージェンスの活用について詳しく解説します。また、トレーリングストップロスに似た、しかし独自の機能を備えたカスタム利益ロック機構もご紹介します。さらに、Trend Constraint EAを高度化し、既存の取引条件を補完する形で新たなエントリー条件を追加します。今後も、MQL5を活用したアルゴリズム開発の実践的な応用方法を深掘りし、実際に使えるテクニックや洞察を継続的にお届けしていきます。
古典的な戦略を再構築する(第12回):EURUSDブレイクアウト戦略 古典的な戦略を再構築する(第12回):EURUSDブレイクアウト戦略
MQL5で収益性の高いブレイクアウト取引戦略を構築する挑戦に、ぜひご参加ください。EURUSDペアを選択し、時間枠で価格ブレイクアウトを取引しましたが、私たちのシステムでは偽のブレイクアウトと真のトレンドの始まりを区別するのが難しかったです。そこで、損失を最小限に抑えながら利益を増やすことを目的としたフィルターをシステムに組み込みました。最終的にはシステムを収益性の高いものにし、誤ったブレイクアウトに対する耐性を高めることに成功しました。
MQL5取引ツールキット(第4回):履歴管理EX5ライブラリの開発 MQL5取引ツールキット(第4回):履歴管理EX5ライブラリの開発
詳細なステップバイステップのアプローチで拡張履歴管理EX5ライブラリを作成し、MQL5を使用してクローズされたポジション、注文、取引履歴を取得、処理、分類、並べ替え、分析、管理する方法を学びます。