English Русский 中文 Deutsch 日本語
preview
Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 3): Asesor Experto Analytics Master

Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 3): Asesor Experto Analytics Master

MetaTrader 5Ejemplos |
38 7
Christian Benjamin
Christian Benjamin

Contenido

Introducción

Tras desarrollar el script de comentarios analíticos en el episodio anterior, he identificado sus limitaciones en cuanto a las propiedades del script, que describiré a continuación. Aunque reconozco el considerable impacto que ha tenido el script de comentarios analíticos dentro de la comunidad de traders, he desarrollado un Asesor Experto llamado Analytics Master. Este EA (Expert Advisor) ofrece el mismo análisis, al tiempo que proporciona métricas adicionales para obtener una mejor perspectiva del trading. Esta nueva herramienta ofrece varias ventajas, entre ellas la capacidad de actualizar continuamente las métricas cada dos horas, a diferencia del script, que solo podía escribir la información métrica una vez. El EA mejora el análisis y mantiene a los usuarios actualizados.

En algunos casos, un Asesor Experto puede integrar funciones similares a scripts para mejorar su funcionalidad. Esto significa que puede implementar tareas específicas dentro del código del EA que se asemejan a las acciones que suelen ejecutar los scripts independientes. Un EA combina eficazmente la codificación, la configuración personalizable, la lógica de negociación y la gestión de riesgos para automatizar las estrategias de negociación de manera eficiente. A continuación, he tabulado una comparación entre el script y el Asesor Experto.

Script Asesor Experto
Están diseñados para realizar una tarea específica y completarla casi al instante. Se terminan una vez que se completa la tarea y no pueden ejecutarse de forma continua. Funcionan continuamente en segundo plano, supervisando las condiciones del mercado y ejecutando operaciones basadas en condiciones predefinidas. 
No pueden gestionar eventos como ticks o temporizadores. Un script solo puede ejecutar su código cuando se inicia manualmente. Pueden responder a los acontecimientos y cambios del mercado (por ejemplo, OnTick, OnTimer, OnTrade), lo que permite una mayor capacidad de respuesta en las estrategias de negociación. 
Por lo general, un script puede ejecutar operaciones (abrir, modificar o cerrar), pero no gestiona las operaciones en curso. Una vez ejecutado, no puede supervisar ni reaccionar ante el estado de las operaciones.  Los Asesores Expertos pueden gestionar posiciones abiertas de forma dinámica, realizar un seguimiento de las condiciones comerciales, aplicar trailing stops y ajustar dinámicamente sus estrategias en función de las condiciones del mercado. 
Por lo general, están diseñados para ejecutarse una sola vez y pueden requerir configuraciones específicas (como parámetros de entrada) cada vez que el usuario los ejecuta manualmente.  Pueden mantener los parámetros definidos por el usuario entre sesiones y ejecutarse sin interacción del usuario una vez que se han iniciado. 
Más adecuado para tareas sencillas basadas en acciones (por ejemplo, órdenes de cierre por lotes o aplicación de indicadores). Pueden incorporar lógica compleja, algoritmos y sistemas que requieren una toma de decisiones continua y una adaptación a las condiciones del mercado. 
Aunque los scripts pueden analizar datos históricos, no pueden adaptarse continuamente ni aprender de los nuevos datos entrantes sin volver a ejecutarse. Pueden analizar datos históricos y tomar decisiones basadas en datos entrantes en tiempo real, lo que permite estrategias adaptativas. 
Debido a que se ejecutan y terminan rápidamente, también tienen un impacto limitado en el rendimiento cuando se ejecutan, en comparación con los Asesores Expertos que se ejecutan de forma continua. Dado que los Asesores Expertos funcionan constantemente, pueden provocar un aumento del consumo de CPU y memoria, especialmente si gestionan muchas operaciones o utilizan algoritmos complejos.


Revisión de la herramienta anterior (Herramienta de comentarios analíticos)

Nuestra herramienta anterior, el script de comentarios analíticos, estaba diseñada para analizar métricas clave del día de negociación anterior, incluyendo:

  1. Apertura del día anterior
  2. Cierre del día anterior
  3. Volumen del día anterior
  4. Volumen diario actual
  5. Niveles de soporte y resistencia

Esta información se presenta en una tabla organizada verticalmente. Además, se ha calculado una predicción de los posibles movimientos del mercado basándose en los precios de apertura y cierre anteriores, así como en los volúmenes de negociación, tal y como se muestra en la figura 1 a continuación.

Presentación de datos       

Figura 1. Presentación de datos

Nuestro script dibujó con éxito líneas de tendencia en el gráfico, resaltando los niveles clave de soporte y resistencia. La predicción de la dirección del mercado también pareció positiva. En la Figura 2, resumimos los resultados de nuestra herramienta de comentarios analíticos.

Resultado del comentario analítico

Figura 2. Resultado del comentario analítico 

Para obtener más información sobre el script de comentarios analíticos, haga clic en el siguiente enlace: https://www.mql5.com/es/articles/15927


Resumen general de Analytic Master (EA)

A medida que pasamos de un script a un Asesor Experto, parte de la información que antes proporcionaba el script seguirá estando accesible a través del EA, tal y como se menciona en la reseña de la herramienta anterior. Sin embargo, el EA también proporcionará información adicional y realizará tareas que superan las capacidades del script original.

Además, nuestro EA ahora puede calcular la volatilidad del mercado, el spread del mercado, el capital, el saldo y los tamaños mínimos y máximos posibles de los lotes en función del saldo de la cuenta. Proporcionaré más explicaciones sobre por qué es esencial conocer esta información.

  • Volatilidad del mercado

La volatilidad es una medida estadística de la dispersión de datos alrededor de su media durante un período específico. El cálculo de la volatilidad del mercado es crucial para una gestión eficaz de riesgos, la ejecución de operaciones y la planificación estratégica en los mercados financieros. Este EA automatiza el cálculo de la volatilidad del mercado, lo que hace que el proceso sea simplificado y fácil de usar. Si bien la volatilidad del mercado generalmente se mide utilizando la fórmula a continuación, nuestro EA simplifica esta función para facilitar su uso.

Fórmula de volatilidad

Figura 3. Fórmula de volatilidad

Para calcular la volatilidad, comenzamos determinando la desviación estándar como se describió anteriormente. Para obtener la volatilidad anualizada, se puede multiplicar la desviación estándar por la raíz cuadrada del número total de días de negociación en un año, que es aproximadamente 252. Más información: https://quantra.quantinsti.com/glossary/Volatility 

  • Spread del mercado

El diferencial de mercado, a menudo denominado simplemente «spread», es la diferencia entre el precio de compra y el precio de venta de un activo concreto en un mercado financiero. Una razón importante para conocer el valor del spread del mercado es evaluar los costos de negociación. Comprender el spread ayuda a los comerciantes e inversores a evaluar los costos asociados con la entrada y salida de posiciones.

Un spread más estrecho generalmente indica menores costos de transacción y una mejor ejecución comercial, lo que es particularmente crucial para los traders de alta frecuencia o aquellos que ejecutan numerosas operaciones diariamente. Por el contrario, un spread más amplio puede indicar costos más altos y podría informar a los traders a reconsiderar sus estrategias o elegir activos diferentes para operar para minimizar los gastos. Por lo tanto, conocer el valor del spread del mercado impacta directamente en la rentabilidad de las operaciones y en el rendimiento general de la inversión.  

Fórmula del diferencial (spread) en el mercado     

Figura 4. Fórmula del diferencial (spread) en el mercado

  • Posibles tamaños de lotes
Calcular con precisión los tamaños de lotes posibles es esencial para una gestión de riesgos eficaz, un trading disciplinado y un mejor rendimiento general. Permite a los traders tomar decisiones informadas, mantener el control sobre sus inversiones y adaptarse a la naturaleza dinámica de los mercados. El cálculo de los posibles tamaños de lote en el código proporcionado se basa en principios de gestión de riesgos. Específicamente, su objetivo es determinar el tamaño de lote adecuado para una operación según el saldo de la cuenta, el riesgo deseado por operación y la distancia al stop loss. La función calcula la distancia entre los niveles de soporte y resistencia (o el punto de stop loss calculado y el punto de entrada). El StopLossMultiplier proporciona una forma de ajustar esta distancia.

Para mejorar la experiencia del trader, nuestro Asesor Experto simplificará los cálculos de la información del mercado y actualizará estos datos cada dos horas. Esto garantiza que los comerciantes se mantengan informados con la información más actualizada del mercado, lo que permite una toma de decisiones más informada.


Explorando el código del Asesor Experto (Funciones y características clave)

El código incluye varias funcionalidades:

  • Recuperar y visualizar datos comerciales de los días anteriores y actuales.
  • Analizar la dirección del mercado en función de los movimientos de precios.
  • Dibujar líneas de tendencia en el gráfico.
  • Cálculo del tamaño de la posición según los principios de gestión de riesgos.

A continuación se muestra el código de nuestro Asesor Experto

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

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


Desglose del código

1. Inicialización y propiedades

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;

Los parámetros de entrada permiten a los usuarios personalizar el comportamiento del EA según sus preferencias comerciales. Se declaran variables globales para almacenar datos históricos, incluidos precios de apertura, cierre, máximos y mínimos del día anterior, así como volúmenes y niveles de soporte/resistencia.

2. Funciones OnInit y OnDeinit

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

OnInit: Esta función se ejecuta cuando se inicializa el EA. Establece la última hora de actualización a cero.

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

OnDeinit: Esta función se llama cuando se elimina o se detiene el EA y se limpia eliminando todos los objetos del gráfico.

3. Lógica principal en OnTick

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

Esta función se activa en cada tick (cambio de precio). Llama a la función UpdateMetrics para recopilar y analizar datos.

4. Función 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();
    }
}

  • Comprobación de tiempo: La función solo se ejecuta si han pasado 2 horas desde la última actualización, lo que minimiza los cálculos excesivos.
  • Recuperación de datos: iTime, iOpen, iClose, iHigh, iLow e iVolume se utilizan para recopilar datos del último día y del día actual.
  • Soporte y resistencia: El script calcula los niveles de Fibonacci basándose en los precios mínimos y máximos del día anterior.
  • Análisis de la dirección del mercado: Llama a la función AnalyzeMarketDirection para evaluar las condiciones del mercado.
  • Cálculo del tamaño del lote: Llama a la función CalculateLotSize para determinar cuánto operar basándose en los principios de gestión de riesgos.
  • Métricas de cuenta y mercado: Recupera el saldo de la cuenta, el capital y el diferencial de mercado para tomar mejores decisiones de negociación.
  • Cálculo del ATR: Recupera el rango verdadero promedio (ATR) para medir la volatilidad del mercado.
  • Información de salida: Formatea y muestra métricas relevantes en la cadena infoStr y las registra con Print.
  • Creación de líneas de tendencia: Limpia las líneas de tendencia antiguas y crea otras nuevas basadas en los precios máximos y mínimos del día anterior.

5. Análisis de la dirección del mercado

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

  • Determinar la dirección del mercado: Esta función toma los precios de apertura, cierre, máximo y mínimo del día anterior para determinar si el mercado es alcista, bajista o neutral.
  • Información adicional: Comprueba los indicadores de presión basándose en los máximos y mínimos, lo que proporciona un análisis más contextual de las condiciones del mercado.

6. Dibujo de líneas de tendencia

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
}

  • Dibujar líneas de tendencia: Esta función crea una línea de tendencia en el gráfico para el máximo o mínimo del día anterior, extendiéndola 24 horas atrás.
  • Personalización: Cada línea tiene un color (rojo para alto, azul para bajo) y un ancho específico.

7. Cálculo del tamaño del lote

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

  • Gestión de riesgos: Esta función calcula el tamaño del lote basándose en el porcentaje de riesgo definido en relación con el saldo de la cuenta del usuario y la distancia de stop loss calculada.
  • Normalización: Garantiza que el tamaño del lote se encuentre dentro de los límites aceptables establecidos por el corredor.


Implementación y pruebas del código

Implementación de un Asesor Experto en MetaTrader 5: Guía paso a paso
  • Abrir MetaTrader 5: Inicie la plataforma de trading MetaTrader 5 en su ordenador.
  • Acceder a MetaEditor: Para abrir MetaEditor, vaya a la barra de menú y haga clic en Herramientas > Editor del lenguaje MetaQuotes, o simplemente pulse F4. Alternativamente, si tiene MetaEditor instalado por separado, puede ejecutarlo directamente.
  • Insertar el EA: En MetaEditor, seleccione Archivo > Nuevo > Asesor experto o abra un archivo EA existente (.mq5). Si crea un nuevo EA, siga las instrucciones para asignarle un nombre y definirlo.
  • Compilar el EA: Después de editar el código del EA, haga clic en el botón Compilar (o pulse F7). Asegúrate de que no haya errores; una compilación exitosa generará un archivo ejecutable.
  • Cargar el EA en MetaTrader 5: Vuelva a la plataforma MetaTrader 5 y abra el panel Navegador (Ctrl + N). Encuentre su EA compilado en la sección Asesores expertos.
  • Adjuntar el EA a un gráfico: Arrastre y suelte el EA en el gráfico deseado, o haga clic con el botón derecho del ratón sobre el EA y seleccione Adjuntar a un gráfico. Aparecerá una ventana de configuración para personalizar los parámetros.
  • Habilitar el trading automático: Asegúrese de que el trading automático esté habilitado haciendo clic en el botón verde «AutoTrading» en la barra de herramientas de MetaTrader 5. Si se le solicita, marque la opción Permitir operaciones automáticas en la configuración del EA.
  • Supervisar el rendimiento: Vigile el rendimiento del EA en el gráfico. Utilice el Probador de estrategias para realizar pruebas retrospectivas, si es necesario.
  • Ajuste la configuración según sea necesario: Puede modificar los parámetros o la configuración directamente desde la ventana de configuración del EA haciendo clic con el botón derecho del ratón en el gráfico.

Analytics Master

Figura 5. Resultado del análisis  

La figura 5 ilustra la conexión del EA al gráfico, dando como resultado los resultados mostrados.

Resultado de análisis

Figura 6. Resultado del análisis 

La Figura 6 anterior ilustra el rendimiento general de nuestro Asesor Experto, que es capaz de calcular automáticamente métricas clave del mercado y presentarlas en formato de gráfico. El EA dibuja líneas de tendencia basadas en los niveles de soporte y resistencia del día anterior. Realiza actualizaciones periódicas de la información del mercado cada dos horas, como se indica en los dos últimos diagramas, que muestran también las marcas de tiempo de actualización más recientes.                    

                                                                             

Conclusión

En resumen, la implementación exitosa de Analytics Master EA marca un avance significativo en el trading automatizado. Este EA no solo automatiza el análisis de métricas clave del mercado, sino que también proporciona información valiosa sobre los niveles de soporte y resistencia, lo que ayuda a los operadores a tomar decisiones más inteligentes. Al integrar una gestión de riesgos eficaz y ofrecer actualizaciones en tiempo real, ayuda a los operadores a navegar por las complejidades del mercado con confianza. En general, esta herramienta mejora la eficiencia comercial y permite a los usuarios mantenerse informados y proactivos en sus estrategias comerciales.

Tómese el tiempo para realizar pruebas retrospectivas del EA con datos históricos para comprender su desempeño en diferentes condiciones del mercado. Esto le ayudará a ajustar su configuración para adaptarla a su estilo comercial. Revise periódicamente las métricas y los conocimientos proporcionados por el EA. Las condiciones del mercado pueden cambiar rápidamente, por lo que mantenerse actualizado es crucial para tomar decisiones oportunas. Adhiérase siempre a su estrategia de gestión de riesgos. Ajuste la configuración del porcentaje de riesgo para alinearla con su tolerancia al riesgo personal y el tamaño de su cuenta. Interactúe con recursos educativos sobre estrategias comerciales, comportamiento del mercado y análisis técnico para complementar los conocimientos del EA. Si encuentra problemas o tiene sugerencias para mejorar, considere brindar comentarios al desarrollador. La aportación del usuario es invaluable para realizar mejoras futuras.

Si sigue estas recomendaciones, podrá maximizar la eficacia de Analytics Master EA y mejorar su experiencia comercial general.

Fecha Nombre de la herramienta  Descripción Versión  Actualizaciones  Notas
01/10/24 Chart Projector Script para superponer la acción del precio del día anterior con efecto fantasma. 1.0 Lanzamiento inicial Primera herramienta en Lynnchris Tool Chest
18/11/24 Analytical Comment Proporciona información del día anterior en formato tabular y anticipa la dirección futura del mercado. 1.0 Lanzamiento inicial Segunda herramienta del Lynnchris Tool Chest
27/11/24 Analytics Master Actualización periódica de las métricas del mercado cada dos horas  1.01 Segundo lanzamiento Tercera herramienta del Lynnchris Tool Chest

Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/16434

Archivos adjuntos |
Christian Benjamin
Christian Benjamin | 1 dic 2024 en 16:00
Qhumanani ejecutar operaciones, lo siento por ser este tonto, pero ya he mencionado a mí mismo ser un viejo novato, Estoy tratando de aprender a utilizar la acción del precio en mi día de negociación. Gracias por leer esto,

Hola Qhumanani

Pido disculpas por el retraso en la respuesta, y muchas gracias por llegar a cabo. Estoy muy contento de saber que estás siguiendo mi trabajo sobre las herramientas de análisis de acción de precios.

Por favor, no te sientas tonto porque todo el mundo empieza en alguna parte, y es totalmente normal sentirse un poco abrumado con toda la nueva información. Sólo para aclarar, la versión actual de nuestra herramienta no ejecuta automáticamente las operaciones; está diseñado principalmente para el análisis y para proporcionar actualizaciones continuas basadas en la acción del precio. Aprecio sinceramente su interés en el comercio automatizado, y definitivamente vamos a considerar la incorporación de esa característica en futuras actualizaciones.

Gracias de nuevo por su compromiso.

Christian Benjamin
Christian Benjamin | 1 dic 2024 en 17:12
Ifeanyichukwu Ikwecheghe información de mercado a través del lapso de la sesión es decir, comentario de un estado bajista cambiar a alcista en tiempo real basado en el análisis de comercio de la EA?
Thank you
Hola Ifeanyichukwu Ikwecheghe,

¡Gracias por su comentario positivo! Me alegra saber que considera que la herramienta es valiosa.

Para responder a sus preguntas:

1. La herramienta no abre operaciones por usted; en su lugar, proporciona análisis y señales que puede utilizar para tomar decisiones de trading informadas. Usted ejecutará manualmente las operaciones basándose en sus predicciones.

2.Las señales se actualizan periódicamente, aproximadamente cada dos horas, lo que le permite adaptarse a las condiciones cambiantes del mercado. Aunque no reflejan los cambios en tiempo real a lo largo de la sesión, las actualizaciones le ayudarán a comprender los cambios de sentimiento del mercado, ya sea un estado bajista que cambia a alcista o viceversa.

Sus opiniones y sugerencias adicionales son bienvenidas para debatirlas.
Ifeanyichukwu Ikwecheghe
Ifeanyichukwu Ikwecheghe | 1 dic 2024 en 20:01
Christian Benjamin #:
Hola Ifeanyichukwu Ikwecheghe,

¡Gracias por su comentario positivo! Me alegra saber que la herramienta le resulta valiosa.

Para responder a sus preguntas:

1. La herramienta no abre operaciones por usted; en su lugar, proporciona análisis y señales que puede utilizar para tomar decisiones de trading informadas. Usted ejecutará manualmente las operaciones basándose en sus predicciones.

2.Las señales se actualizan periódicamente, aproximadamente cada dos horas, lo que le permite adaptarse a las condiciones cambiantes del mercado. Aunque no reflejan los cambios en tiempo real a lo largo de la sesión, las actualizaciones le ayudarán a comprender los cambios en el sentimiento del mercado, ya sea un estado bajista que cambia a alcista o viceversa.

Sus opiniones y sugerencias adicionales son bienvenidas para debatirlas.
Gracias Christian por tu respuesta. También he leído tu respuesta a Qhumanani sobre la posibilidad de incluir la capacidad de la herramienta para abrir posiciones. Le aseguro que le daré sugerencias útiles a medida que la idea se me pase por la cabeza. Además, ¿la herramienta emite alertas sonoras cuando cambia el sentimiento del mercado? Eso también sería una buena característica.
veveza4
veveza4 | 28 dic 2024 en 16:39
Hola Christian

Esta es una herramienta muy interesante.
Lo siento, estoy trabajando con MT4. ¿Tiene desarrollo para MT4?

Gracias.
Dong Zheng
Dong Zheng | 15 ago 2025 en 00:55
¡Hola! Me alegro de poder leer su artículo. Tengo una pregunta para ti: la primera herramienta de la caja de herramientas Lynnchris, la segunda herramienta de la caja de herramientas Lynnchris, de estas dos herramientas, ¿la segunda es una versión actualizada de la primera? Me parece pensar que las dos herramientas son independientes y no tienen nada que ver la una con la otra.
Utilizando redes neuronales en MetaTrader Utilizando redes neuronales en MetaTrader
En el artículo se muestra la aplicación de las redes neuronales en los programas de MQL, usando la biblioteca de libre difusión FANN. Usando como ejemplo una estrategia que utiliza el indicador MACD se ha construido un experto que usa el filtrado con red neuronal de las operaciones. Dicho filtrado ha mejorado las características del sistema comercial.
Características del Wizard MQL5 que debe conocer (Parte 50): Awesome Oscillator Características del Wizard MQL5 que debe conocer (Parte 50): Awesome Oscillator
El Awesome Oscillator es otro indicador de Bill Williams que se utiliza para medir el impulso. Puede generar múltiples señales, por lo que las revisamos según un patrón, como en artículos anteriores, aprovechando las clases y el ensamblaje del Asistente MQL5 (Wizard MQL5).
Particularidades del trabajo con números del tipo double en MQL4 Particularidades del trabajo con números del tipo double en MQL4
En estos apuntes hemos reunido consejos para resolver los errores más frecuentes al trabajar con números del tipo double en los programas en MQL4.
Operar con el Calendario Económico MQL5 (Parte 3): Añadiendo filtros de divisa, importancia y tiempo Operar con el Calendario Económico MQL5 (Parte 3): Añadiendo filtros de divisa, importancia y tiempo
En este artículo, implementamos filtros en el panel del calendario económico MQL5 para refinar la visualización de eventos de noticias por divisa, importancia y hora. Primero establecemos criterios de filtrado para cada categoría y luego los integramos en el panel de control para mostrar solo los eventos relevantes. Por último, nos aseguramos de que cada filtro se actualice dinámicamente para proporcionar a los operadores información económica específica y en tiempo real.