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

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

MetaTrader 5 | 4 4月 2025, 07:56
126 0
Christian Benjamin
Christian Benjamin

内容

はじめに

前回のエピソードで分析コメントスクリプトを開発しましたが、そのプロパティに関する制限があることがわかりました。以下にその概要を説明します。Analytical Commentスクリプトが取引コミュニティに与えた大きな影響を認識しつつ、Analytics Masterと呼ばれるエキスパートアドバイザー(EA)を開発しました。 このEAは同じ分析を提供するだけでなく、より優れた取引洞察のための追加のメトリックも提供します。この新しいツールには、スクリプトのようにメトリック情報を一度しか書き込めない制限がなく、2時間ごとに継続的にメトリックを更新できる機能 など、いくつかの利点があります。 EAは分析の精度を向上させ、ユーザーに最新の情報を提供します。

場合によっては、EAにスクリプトのような機能を統合し、さらなる性能向上を図ることも可能です。つまり、通常スタンドアロンスクリプトが実行するアクションに似た特定のタスクを、EAのコード内で直接実装できるということです。EAは、プログラムコード、カスタマイズ可能な設定、取引ロジック、リスク管理を組み合わせることで、取引戦略をより効率的に自動化 します。以下に、スクリプトとEAの比較を表にまとめました。

スクリプト EA
特定のタスクを実行し、ほぼ瞬時に実行を完了するように設計されています。タスクが完了すると終了し、継続して実行することはできません。 バックグラウンドで継続的に実行され、市場の状況を監視し、事前に定義された条件に基づいて取引を実行します。 
ティックやタイマーなどのイベントを処理できません。手動で起動した場合にのみコードを実行できます。 市場のイベントや変化に対応できるため(OnTick、OnTimer、OnTradeなど)、取引戦略の応答性が向上します。 
通常、スクリプトは取引(開始、変更、または終了)を実行できますが、進行中の取引は管理できません。一度実行されると、取引の状態を監視したり、それに反応したりすることはできません。  ポジションを動的に管理し、取引条件を追跡し、トレーリングストップを適用し、市場状況に基づいて戦略を動的に調整できます。 
通常、1回の実行用に設計されており、ユーザーが手動で実行するたびに特定の構成(入力パラメータなど)が必要になる場合があります。  セッション間でユーザー定義のパラメータを維持し、起動後はユーザーの介入なしに実行できます。 
単純なアクションベースのタスク(例:注文の一括クローズやインジケーターの適用)に最適です。 継続的な意思決定と市場状況への適応を必要とする複雑なロジック、アルゴリズム、システムを組み込むことができます。 
履歴データを分析できますが、再実行せずに新しい受信データに継続的に適応したり学習したりすることはできません。 履歴データを分析し、リアルタイムの受信データに基づいて意思決定をおこなうことで、適応型戦略が可能になります。 
実行と終了が速いため、継続的に実行されるEAと比較して、実行時のパフォーマンスへの影響も限られています。 継続的に実行されるため、特に多くの取引を管理したり複雑なアルゴリズムを使用したりする場合は、CPUとメモリの消費量が増加する可能性があります。


以前のツール(Analytical Commentツール)のレビュー

弊社の以前のツールであるAnalytical Commentスクリプトは、次のような前取引日の主要な指標を分析するように設計されていました。

  1. 前日の始値
  2. 前日の終値
  3. 前日の取引量
  4. 当日の取引量
  5. 支持と抵抗のレベル

この情報は、垂直に整理された表形式で表示されます。さらに、図1に示すように、過去の始値と終値、および取引量に基づいて、潜在的な市場動向の予測が計算されています。

データプレゼンテーション       

図2:データプレゼンテーション

私たちのスクリプトはチャート上にトレンドラインをうまく描画し、主要な支持レベルと抵抗レベルを強調表示しました。市場の方向性の予測も良好だったようです。図2では、Analytical Commentツールの結果をまとめています。

Analytical Commentの結果

図2:Analytical Commentの結果 

Analytical Commentスクリプトの詳細については、次のリンクをクリックしてください:https://www.mql5.com/ja/articles/15927


Analytics Master (EA)の概要

スクリプトからEAに移行すると、以前のツールのレビューで述べたように、以前はスクリプトによって提供されていた一部の情報は、EAを通じて引き続きアクセスできるようになります。ただし、EAは追加の洞察も提供し、元のスクリプトの機能を超えるタスクを実行します。

さらに、EAは、口座残高に基づいて、市場のボラティリティ、市場スプレッド、エクイティ、残高、および可能な最小および最大のロットサイズを計算できるようになりました。この情報を知ることがなぜ重要なのか、さらに詳しく説明します。

  • 市場のボラティリティ

ボラティリティは、指定された期間におけるデータの平均値付近の分散を統計的に測定したものです。市場のボラティリティを計算することは、金融市場における効果的なリスク管理、取引実行、戦略的計画にとって非常に重要です。このEAは市場のボラティリティの計算を自動化し、プロセスを合理化してユーザーフレンドリーにします。市場のボラティリティは通常、以下の式を使用して測定されますが、EAでは使いやすさを考慮してこの関数を簡素化しています。

ボラティリティの計算式

図3:ボラティリティの計算式

ボラティリティを計算するには、まず上記のように標準偏差を決定します。年間ボラティリティを取得するには、標準偏差に年間の総取引日数の平方根(約252)を掛けます。詳細はhttps://quantra.quantinsti.com/glossary/Volatilityでご覧ください。 

  • 市場スプレッド

市場スプレッドは、単に「スプレッド」と呼ばれることが多く、金融市場における特定の資産の売り値と買い値の差のことです。市場スプレッドの値を知ることが重要な理由の一つは、取引コストを正確に評価することです。スプレッドを理解することで、トレーダーや投資家はポジションのエントリーおよびエグジット時にかかるコストを把握しやすくなります。

スプレッドが狭い場合、通常は取引コストが低く、より有利な価格での約定が可能であることを意味します。これは、高頻度取引(HFT)を行うトレーダーや、日々多数の取引を実行するトレーダーにとって特に重要です。逆に、スプレッドが広いと取引コストが高くなり、戦略の見直しや、よりコスト効率の良い別の資産を選択する必要性が生じる可能性があります。したがって、市場スプレッドを把握することは、取引の収益性や全体的な投資パフォーマンスに直接影響を与える重要な要素となります。 

市場スプレッドの計算式     

図4:市場スプレッドの計算式

  • 可能なロットサイズ
可能なロットサイズを正確に計算することは、効果的なリスク管理、規律ある取引、そして全体的なパフォーマンス向上に不可欠です。これにより、トレーダーは情報に基づいた意思決定をおこない、投資を適切に管理し、市場の変動に柔軟に対応できるようになります。提供されたコードにおけるロットサイズの計算は、リスク管理の原則に基づいています。具体的には、口座残高、取引ごとの許容リスク、ストップロスまでの距離 を考慮し、最適なロットサイズを決定することを目的としています。 この関数は、支持レベルと抵抗レベル(または計算されたストップロスポイントとエントリーポイント)間の距離を計算します。StopLossMultiplier を使用することで、この距離を調整できます。

トレーダーの利便性を向上させるために、私たちのEAは市場情報の計算を簡素化し、2時間ごとにデータを更新します。これにより、トレーダーは常に最新の市場情報を把握し、より正確で戦略的な意思決定をおこなうことができます。


EAコードの調査(主な機能と特徴)

コードにはいくつかの機能が含まれています。

  • 前日と当日の取引データを取得して表示
  • 価格変動に基づいて市場の方向性を分析
  • チャート上にトレンドラインを描画
  • リスク管理の原則に基づいてポジションサイズを計算

以下はEAのコードです。

//+------------------------------------------------------------------+
//|                                           Analytics Master 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 and commenting"
#property version     "1.0"
#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

// 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 the last update time
      string lastUpdateStr = TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES);
      string infoStr = StringFormat("Prev 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",
                                    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);

      // 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;
  }

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


コードの内訳

1. 初期化とプロパティ

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

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

入力パラメータを使用すると、ユーザーは取引の好みに応じてEAの動作をカスタマイズできます。グローバル変数は、前日の始値、終値、高値、安値、取引量、支持/抵抗レベルなどの履歴データを格納するために宣言されます。

2. OnInitおよびOnDeinit関数

int OnInit()
{
    lastUpdateTime = 0; // Set the initial update time
    return INIT_SUCCEEDED;
}

OnInit:この関数は、EAが初期化されるときに実行されます。最終更新時刻をゼロに設定します。

void OnDeinit(const int reason)
{
    ObjectsDeleteAll(0); // Clean up any drawn objects on the current chart
}

OnDeinit:この関数は、EAが削除または停止されたときに呼び出され、すべてのチャートオブジェクトを削除してクリーンアップします。

3. OnTickのメインロジック

void OnTick()
{
    UpdateMetrics(); // Call to the function that fetches and displays the metrics
}

この関数はティック(価格変更)ごとにトリガーされます。UpdateMetrics関数を呼び出してデータを収集し、分析します。

4. UpdateMetrics関数

void UpdateMetrics()
{
    if (TimeCurrent() - lastUpdateTime >= 2 * 3600) // Check if 2 hours have passed since last update
    {
        // 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;
        resistance = previousDayHigh + (previousDayHigh - previousDayLow) * 0.382;
        
        // 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 market volatility using ATR
        int atrHandle = iATR(NULL, PERIOD_H1, ATR_Period);
        double atrValue = 0.0;
        
        if (atrHandle != INVALID_HANDLE) // Check if the handle is valid
        {
            double atrBuffer[];
            if (CopyBuffer(atrHandle, 0, 0, 1, atrBuffer) > 0)
            {
                atrValue = atrBuffer[0];
            }
            IndicatorRelease(atrHandle); // Release the indicator handle
        }
        
        // Create the output string including the last update time
        string lastUpdateStr = TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES);
        string infoStr = StringFormat("Prev 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",
                                       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);
        
        // 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();
    }
}

  • 時間の確認:この関数は、最後の更新から2時間が経過した場合にのみ実行されるため、過剰な計算が最小限に抑えられます。
  • データ取得:iTime、iOpen、iClose、iHigh、iLow、iVolumeは、前日と当日のデータを収集するために使用されます。
  • 支持と抵抗:このスクリプトは、前日の安値と高値に基づいてフィボナッチレベルを計算します。
  • 市場動向分析:AnalyzeMarketDirection関数を呼び出して市場の状況を評価します。
  • ロットサイズの計算:リスク管理の原則に基づいて取引する金額を決定するために、CalculateLotSize関数を呼び出します。
  • 口座と市場のメトリック:より良い取引決定のために、口座残高、エクイティ、市場スプレッドを取得します。
  • ATR計算:市場のボラティリティを測定するためにAverage True Range (ATR)を取得します。
  • 出力情報:関連するメトリックをinfoStr文字列にフォーマットして表示し、Printを使用してログに記録します。
  • トレンドラインの作成:古いトレンドラインを消去し、前日の高値と安値に基づいて新しいトレンドラインを作成します。

5. 市場動向分析

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;
}

  • 市場の方向性を決定する:この関数は、前日の始値、終値、高値、安値を取得して、市場が強気、弱気、または中立であるかを判断します。
  • 追加の洞察:高値と安値に基づいてプレッシャー指標をチェックし、市場状況のより文脈的な分析を提供します。

6. トレンドライン描画

void DrawContinuousTrendLine(string name, double price)
{
    datetime startTime = TimeCurrent() - 24 * 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
}

  • トレンドラインを描く:この関数は、チャート上に前日の高値または安値のトレンドラインを作成し、それを24時間遡って延長します。
  • カスタマイズ:各線には色(高い場合は赤、低い場合は青)と指定された幅があります。

7. ロットサイズの計算

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);
    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;
}

  • リスク管理:この関数は、ユーザーの口座残高に対する定義されたリスク率と計算されたストップロス距離に基づいてロットサイズを計算します。
  • 正規化:ロットサイズがブローカーによって設定された許容範囲内であることを確認します。


コードの実装とテスト

MetaTrader5でのEAの実装:ステップごとのガイド
  • MetaTrader5を開く:コンピュータでMetaTrader 5取引プラットフォームを起動します。
  • MetaEditorにアクセスする:MetaEditorを開くには、メニューバーで[ツール]>[MetaQuotes言語エディタ]をクリックするか、F4キーを押します。あるいは、MetaEditorを別途インストールしている場合は、直接実行することもできます。
  • EAを挿入する:MetaEditorで、[ファイル]>[新規作成]>[エキスパートアドバイザー]を選択するか、既存のEAファイル(.mq5)を開きます。新しいEAを作成する場合は、プロンプトに従って名前を付けて定義します。
  • EAをコンパイルする:EAコードを編集したら、[コンパイル]ボタンをクリックします(またはF7キーを押します)。エラーがないことを確認してください。コンパイルが成功すると実行可能ファイルが生成されます。
  • EAをMetaTrader5にロードする:MetaTrader 5プラットフォームに戻り、ナビゲーターパネルを開きます(Ctrl+N)。コンパイルされたEAは、EAセクションで見つかります。
  • EAをチャートに添付する:EAを目的のチャートにドラッグアンドドロップするか、EAを右クリックして[チャートに追加]を選択します。パラメータのカスタマイズのための設定ウィンドウが表示されます。
  • 自動取引を有効にする:MetaTrader5ツールバーの[アルゴリズム取引]ボタンが緑色で、自動売買が有効になっていることを確認します(赤色の場合はクリックして有効にします)。プロンプトが表示されたら、EA設定の[自動取引を許可]オプションをオンにします。
  • パフォーマンスを監視する:チャート上のEAのパフォーマンスに注目してください。必要に応じて、バックテストに戦略テスターを使用します。
  • 必要に応じて設定を調整する:チャート上で右クリックすると、EA設定ウィンドウから直接パラメータや設定を変更できます。

Analytics Master

図5:分析結果  

図5は、EAをチャートに追加した場合、表示される結果を示しています。

分析結果

図6:分析結果 

上の図6は、主要な市場指標を自動的に計算し、それをチャート形式で表示できるEAの全体的なパフォーマンスを示しています。EAは前日の支持抵抗レベルに基づいてトレンドラインを描画します。最後の2つの図に示されているように、市場情報は2時間ごとに定期的に更新され、最新の更新タイムスタンプも表示されます。                    

                                                                             

結論

要約すると、Analytics Master EAの導入が成功したことは、自動取引における大きな前進を意味します。このEAは、主要な市場指標の分析を自動化するだけでなく、支持と抵抗のレベルに関する貴重な洞察も提供し、トレーダーがより賢明な意思決定をおこなうのに役立ちます。効果的なリスク管理を統合し、リアルタイムの更新を提供することで、トレーダーが市場の複雑さを自信を持って乗り越えられるようサポートします。全体として、このツールは取引の効率を高め、ユーザーが取引戦略について情報を入手し、積極的に行動できるようにします。

時間をかけてEAを過去のデータでバックテストし、さまざまな市場状況でのパフォーマンスを理解してください。これにより、取引スタイルに合わせて設定を微調整できるようになります。EAによって提供される指標と洞察を定期的に確認します。市場の状況は急速に変化する可能性があるため、タイムリーな意思決定をおこなうには最新情報を把握しておくことが重要です。常にリスク管理戦略を遵守してください。個人のリスク許容度とアカウントサイズに合わせてリスクパーセンテージ設定を調整します。EAからの洞察を補完するために、取引戦略、市場行動、テクニカル分析に関する教育リソースを活用します。問題が発生した場合や改善の提案がある場合は、開発者にフィードバックを提供することを検討してください。ユーザーの入力は、将来の機能強化をおこなう上で非常に貴重です。

これらの推奨事項に従うことで、Analytics Master EAの効果を最大限に高め、全体的な取引エクスペリエンスを向上させることができます。

日付 ツール名  詳細 バージョン  アップデート  備考
01/10/24 Chart Projector 前日のプライスアクションをゴースト効果でオーバーレイするスクリプト 1.0 初回リリース Lynnchris Tool Chestの最初のツール
18/11/24 Analytical Comment 前日の情報を表形式で提供し、市場の将来の方向性を予測する 1.0 初回リリース Lynnchris Tool Chestの2番目のツール
27/11/24 Analytics Master 2時間ごとに市場指標を定期的に更新  1.01 v.2 Lynnchris Tool Chestの3番目のツール

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

添付されたファイル |
MQL5で取引管理者パネルを作成する(第6回):取引管理パネル(II) MQL5で取引管理者パネルを作成する(第6回):取引管理パネル(II)
この記事では、多機能管理パネルの取引管理パネル(Trade Management Panel)を強化します。コードを簡素化し、読みやすさ、保守性、効率性を向上させる強力なヘルパー関数を導入します。また、追加のボタンをシームレスに統合し、インターフェイスを強化して、より幅広い取引タスクを処理する方法も紹介します。ポジションの管理、注文の調整、ユーザーとのやり取りの簡素化など、このガイドは、堅牢でユーザーフレンドリーな取引管理パネルの開発に役立ちます。
段階的特徴量選択の基準としての相互情報量 段階的特徴量選択の基準としての相互情報量
この記事では、最適な予測変数セットと目的変数との相互情報量に基づく段階的特徴量選択のMQL5実装を紹介します。
取引量による取引の洞察:OHLCチャートを超えて 取引量による取引の洞察:OHLCチャートを超えて
取引量分析と機械学習技術、特にLSTMニューラルネットワークを組み合わせたアルゴリズム取引システムです。価格変動を中心に据えた従来の取引アプローチとは異なり、このシステムは市場の動きを予測するために取引量パターンとその導関数を重視します。この方法論には、取引量導関数分析(一次導関数および二次導関数)、取引量パターンのLSTM予測、および従来のテクニカル指標という3つの主要コンポーネントが組み込まれています。
データサイエンスとML(第32回):AIモデルを最新の状態に保つ、オンライン学習 データサイエンスとML(第32回):AIモデルを最新の状態に保つ、オンライン学習
常に変化する取引の世界では、市場の変動に適応することは選択肢ではなく、必要不可欠です。新たなパターンやトレンドが日々生まれる中で、最先端の機械学習モデルでさえ、進化する環境に対応し続けることが困難になっています。本記事では、モデルを自動的に再訓練することで、その有効性を維持し、新しい市場データに柔軟に適応させる方法を解説します。