English Русский Deutsch 日本語
preview
价格行为分析工具箱开发(第三部分):分析大师 —EA

价格行为分析工具箱开发(第三部分):分析大师 —EA

MetaTrader 5示例 |
92 6
Christian Benjamin
Christian Benjamin

内容

引言

在先前的文章中开发了分析评论脚本后,我发现它在脚本属性方面存在一些局限性,我将在下面概述这些局限。尽管我承认分析评论脚本在交易社区中产生了相当大的影响,但我还是开发了一款名为“分析大师”的EA。这款EA不仅提供相同的分析功能,还提供了额外的指标,以便获得更深入的交易信息。这款新工具具有多项优势,包括能够每两小时持续更新指标,而脚本只能写入一次指标信息。该EA增强了分析能力,并让用户保持信息更新。

在某些情况下,EA可以集成类似脚本的功能,以增强其功能性。这意味着你可以在EA的代码中实现一些特定任务,这些任务类似于独立脚本通常执行的操作。EA有效地结合了编码、可自定义设置、交易逻辑和风险管理,从而高效地自动化交易策略。下面,我用表格对比了脚本与EA之间的区别。

脚本 EA
它们旨在执行特定任务,并几乎瞬间完成执行。任务完成后即终止,无法持续运行。 它们在后台持续运行,监控市场状况并根据预设条件执行交易。 
它们无法处理像报价或计时器这样的事件。脚本只能在手动启动时执行其代码。 它们可以响应市场事件和变化(例如 OnTick、OnTimer、OnTrade),使交易策略更具响应性。 
通常,脚本可以执行交易(开仓、修改或平仓),但不管理正在进行的交易。一旦执行完毕,它便无法监控或响应交易状态。  EA可以动态管理未平仓位,跟踪交易条件,应用移动止损,并根据市场情况动态调整策略。 
通常设计为一次性执行,每次用户手动运行时可能需要特定配置(如输入参数)。  它们可以在会话之间保留用户定义的参数,一旦启动便无需用户交互即可运行。 
最适合用于简单的、基于操作的任务(例如批量平仓或应用指标)。 它们可以整合复杂的逻辑、算法和系统,这些系统需要持续决策和适应市场条件。 
虽然脚本可以分析历史数据,但如果没有重新运行,就无法持续适应或学习新传入的数据。 它们可以分析历史数据并根据实时传入的数据做出决策,从而实现自适应策略。 
由于它们执行并终止得很快,与持续运行的EA相比,运行时对性能的影响也较小。 由于EA持续运行,可能会导致CPU和内存消耗增加,尤其是在管理大量交易或使用复杂算法时。


对上一工具(分析评论工具)的回顾

我们之前的工具——分析评论脚本,旨在分析前一交易日的关键指标,包括:

  1. 前一日开盘价
  2. 前一日收盘价
  3. 前一日成交量
  4. 当日成交量
  5. 支撑位与阻力位

这些信息以垂直排列的表格形式呈现。此外,还根据前几日的开盘价、收盘价以及交易量计算了潜在的市场走势预测,如下图1所示。

数据展示       

图例 1. 数据展示

我们的脚本成功地在图表上绘制了趋势线,并标出了关键的支撑和阻力位。市场方向预测也呈现为积极态势。在图2中,我们总结了分析评论工具的结果。

分析评论工具的效果

图例 2. 分析评论工具的效果 

要了解更多关于分析评论脚本的信息,请点击以下链接:https://www.mql5.com/zh/articles/15927


分析大师(EA)概述

当我们从脚本过渡到EA时,之前脚本提供的部分信息仍将通过EA继续提供,如前面对上一工具的回顾中所述。然而,EA还将提供额外的信息,并执行超出原始脚本能力的任务。

此外,我们的EA现在可以计算市场波动率、点差、账户净值、余额,以及基于账户余额的最小和最大可能手数。我将进一步解释为什么了解这些信息至关重要。

  • 市场波动率

波动率是衡量数据在特定时期内围绕其均值离散程度的统计指标。计算市场波动率对于金融市场中的有效风险管理、交易执行和战略规划至关重要。这款EA自动化了市场波动率的计算,使流程更加精简和用户友好。虽然市场波动率通常使用以下公式计算,但我们为便于使用该EA,简化了该功能。

波动率公式

图例 3. 波动率公式

要计算波动率,我们首先按上述方法确定标准差。要获得年化波动率,可以将标准差乘以一年中交易总天数的平方根,约为252天。了解更多:https://quantra.quantinsti.com/glossary/Volatility 

  • 市场点差

市场点差,通常简称为“点差”,是金融市场中特定资产的买价与卖价之间的差额。了解市场点差值的一个重要原因是评估交易成本。理解点差有助于交易者和投资者评估进出仓位的成本。

较窄的点差通常意味着较低的交易成本和更好的交易执行,这对高频交易者或每日执行大量交易的交易者尤为重要。相反,较宽的点差可能意味着更高的成本,并可能提示交易者重新考虑其策略或选择其他资产进行交易以降低费用。因此,了解市场点差值直接影响交易的盈利能力和整体投资表现。  

市场点差公式     

图例 4. 市场点差公式

  • 交易量
准确计算交易量对于有效的风险管理、纪律性交易和提升整体表现至关重要。它使交易者能够做出明智决策,保持对投资的掌控,并适应市场的动态变化。所提供代码中,潜在交易量的计算基于风险管理原则。具体来说,它旨在根据账户余额、每笔交易期望的风险以及止损距离来确定合适的交易手数。该函数计算支撑位与阻力位之间(或计算出的止损点与入场点之间)的距离。StopLossMultiplier函数提供了一种调整该距离的方法。

为提升交易者的体验,我们的EA将简化市场信息的计算,并每两小时更新一次这些数据。这确保交易者能够掌握最新的市场洞察,从而做出更明智的决策。


分析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/en/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 计算:获取平均真实波幅(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;
}

  • 风险管理:该函数根据用户设定的风险百分比相对于账户余额以及计算出的止损距离,来计算交易手数。
  • 标准化处理:确保计算出的交易手数在经纪商设定的可接受范围内。


代码实现和测试

在 MetaTrader 5 上实现EA:分步指南
  • 打开 MetaTrader 5:在您的计算机上启动 MetaTrader 5 交易平台。
  • 访问 MetaEditor:要打开 MetaEditor,请前往菜单栏,点击“工具” > “MetaQuotes 语言编辑器”,或直接按 F4 键。或者,如果您单独安装了 MetaEditor,也可以直接运行它。
  • 插入 EA:在 MetaEditor 中,选择“文件” > “新建” > “EA”,或打开一个现有的 EA 文件(.mq5)。如果创建新的 EA,请按照提示为其命名并进行定义。
  • 编译 EA:编辑完 EA 代码后,点击“编译”按钮(或按 F7 键)。确保没有错误;成功编译后将生成一个可执行文件。
  • 将 EA 加载到 MetaTrader 5:返回 MetaTrader 5 平台,打开“导航器”面板(Ctrl + N)。在“智能交易系统”部分找到您编译好的 EA。
  • 将 EA 附加到图表:将 EA 拖放到所需的图表上,或右键点击 EA 并选择“附加到图表”。将弹出一个设置窗口,供您自定义参数。
  • 启用自动交易:通过点击 MetaTrader 5 工具栏上的绿色“自动交易”按钮,确保已启用自动交易功能。如果出现系统提示,请在 EA 设置中勾选“允许自动交易”选项。
  • 监控性能:密切关注 EA 在图表上的表现。如有需要,可使用“策略测试器”进行回测。
  • 根据需要调整设置:您可以通过右键点击图表,直接在 EA 设置窗口中修改参数或设置。

分析大师(Analytics Master)

图 5. 分析结果  

图5展示了将EA附加到图表上的过程及其产生的结果。

分析结果

图 6. 分析结果 

上图6展示了我们EA的整体性能,该系统能够自动计算关键市场指标,并以图表形式呈现。该EA根据前一日的支撑位和阻力位绘制趋势线。它每两小时定期更新一次市场信息,如最后两张图所示,图中也显示了最新的更新时间戳。                    

                                                                             

结论

总而言之,本EA的成功部署,标志着我们向自动化交易领域迈出了重要一步。该EA不仅实现了对关键市场指标的自动化分析,还提供了关于支撑位和阻力位的宝贵信息,帮助交易者做出更明智的决策。通过整合有效的风险管理并提供实时更新,它支持交易者自信地应对复杂的市场环境。总体而言,该工具提升了交易效率,并赋能用户在其交易策略中保持信息灵通和积极主动。

请花时间在历史数据上对该EA进行回测,以了解其在不同市场条件下的表现。这将帮助您微调其设置,以适应您的交易风格。定期审查EA提供的信息。市场状况可能瞬息万变,因此保持信息更新对于做出及时决策至关重要。始终坚持您的风险管理策略。调整风险百分比设置,使其与您的个人风险承受能力和账户规模相匹配。积极学习有关交易策略、市场行为和技术分析的方法,作为对EA提供信息的补充。如果您遇到问题或有改进建议,请随时向开发者反馈。用户的意见对于未来的改进工作至关重要。

遵循这些建议,您将能最大化“交易大师”EA的有效性,并改善您的整体交易体验。

日期 工具名称  说明 版本  更新  提示
01/10/24 图表投影仪(Chart Projector) 用于叠加前一天价格走势(带“幽灵”效果)的脚本。 1.0 首次发布 Lynnchris工具箱中的第一款工具
18/11/24 分析评论(Analytical Comment) 它以表格形式提供前一日的市场信息,并预测市场的未来走向。 1.0 首次发布 Lynnchris工具箱中的第二款工具
27/11/24 分析大师(Analytics Master) 市场指标每两小时定期更新  1.01 第二版 Lynnchris工具箱中的第三款工具

本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/16434

附加的文件 |
最近评论 | 前往讨论 (6)
Ifeanyichukwu Ikwecheghe
Ifeanyichukwu Ikwecheghe | 1 12月 2024 在 07:16

您好!



我可以问两个问题吗?

  1. 它是开盘交易还是您根据它的预测手动开盘?
  2. 它适用于当天的开盘,还是信号会根据整个交易时段的市场信息 发生变化,即根据 EA 的交易分析,从看跌状态实时转为看涨状态?
谢谢。
Christian Benjamin
Christian Benjamin | 1 12月 2024 在 16:00
Qhumanani 执行交易的?感谢您阅读此文、

您好,Qhumanani

很抱歉延迟回复,非常感谢您的联系。我真的很高兴听到您关注我在价格行动分析工具方面的工作。

请不要觉得自己很笨,因为每个人都有起步的地方,对所有新信息感到有点不知所措是完全正常的。需要说明的是,我们当前版本的工具不会自动执行交易;它主要用于分析,并根据价格走势提供持续更新。我真心感谢您对自动交易的兴趣,我们一定会考虑在未来的更新中加入该功能。

再次感谢您的参与

Christian Benjamin
Christian Benjamin | 1 12月 2024 在 17:12
Ifeanyichukwu Ikwecheghe 市场信息 发生变化,即根据 EA 的交易分析,从看跌状态实时转为看涨状态?
谢谢。
您好Ifeanyichukwu Ikwecheghe,

感谢您的积极反馈!我很高兴听到您认为该工具很有价值。

回答您的问题:

1. 该工具不会为您开启交易;相反,它提供分析和信号,您可以利用这些分析和信号做出明智的交易决策。您将根据其预测手动执行交易。

2. 信号定期更新,大约每两小时更新一次,使您能够适应不断变化的市场条件。虽然它们并不反映整个交易时段的实时变化,但这些更新将帮助您了解市场情绪的变化,无论是看跌转为看涨,还是反之亦然。

欢迎讨论您的观点和进一步建议。
Ifeanyichukwu Ikwecheghe
Ifeanyichukwu Ikwecheghe | 1 12月 2024 在 20:01
Christian Benjamin #:
您好Ifeanyichukwu Ikwecheghe,

感谢您的积极反馈!我很高兴听到您认为该工具很有价值。

回答您的问题:

1. 该工具不会为您开启交易;相反,它提供分析和信号,您可以利用这些分析和信号做出明智的交易决策。您将根据其预测手动执行交易。

2. 信号定期更新,大约每两小时更新一次,使您能够适应不断变化的市场条件。虽然它们不能反映整个交易时段的实时变化,但这些更新将帮助您了解市场情绪的变化,无论是看跌状态转变为看涨状态,还是反之亦然。

欢迎讨论您的观点和进一步建议
感谢克里斯蒂安的回复。我也阅读了你对Qhumanani 的回复,其中提到了该工具开仓功能的可能性。请放心,我会根据自己的想法提出有用的建议。另外,当市场情绪发生变化时,该工具是否会发出声音提示?这也将是一个不错的功能。
veveza4
veveza4 | 28 12月 2024 在 16:39
你好,克里斯蒂安

这是一个非常有趣的工具。
抱歉,我使用的是 MT4。你们有 MT4 的开发工具吗?

谢谢。
交易策略 交易策略
各种交易策略的分类都是任意的,下面这种分类强调从交易的基本概念上分类。
从零开始在MQL5中实现移动平均线:简单明了 从零开始在MQL5中实现移动平均线:简单明了
我们将通过简单的示例,探究移动平均线的计算原理,同时了解优化指标计算(包括移动平均线计算)的方法。
新手在交易中的10个基本错误 新手在交易中的10个基本错误
新手在交易中会犯的10个基本错误: 在市场刚开始时交易, 获利时不适当地仓促, 在损失的时候追加投资, 从最好的仓位开始平仓, 翻本心理, 最优越的仓位, 用永远买进的规则进行交易, 在第一天就平掉获利的仓位,当发出建一个相反的仓位警示时平仓, 犹豫。
基于交易量的神经网络分析:未来趋势的关键 基于交易量的神经网络分析:未来趋势的关键
本文探讨了通过将技术分析原理与 LSTM 神经网络架构相结合,基于交易量分析来改进价格预测准确性的可能性。文章特别关注异常交易量的检测与解读、聚类方法的使用,以及基于交易量的特征创建及其在机器学习背景下的定义。