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

Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 24): Herramienta de cuantificación de la acción del precio

MetaTrader 5Sistemas comerciales |
118 0
Christian Benjamin
Christian Benjamin

Contenido



Introducción

La mayoría de los operadores que se basan en la evolución de los precios se guían por formaciones de velas específicas, como las pin bars, los dojis, las velas envolventes y las velas marubozu. Estas velas se utilizan para identificar cambios en la tendencia del mercado y detectar posibles reversiones o movimientos de continuación. Buscar manualmente estas señales entre docenas de gráficos puede llevar mucho tiempo y dar lugar a omisiones.

Hemos desarrollado el EA «Price Action Quantification Analysis» para MetaTrader 5 con el fin de hacer frente a este reto. Este asesor técnico:

  1. Analiza automáticamente un número configurable de barras recientes en busca de cuatro patrones de acción del precio ampliamente reconocidos.
  2. Marca cada patrón detectado en el gráfico con flechas y etiquetas, ofreciendo claras indicaciones visuales.
  3. Emite alertas y registra el movimiento posterior en pips de la siguiente barra para ayudarte a evaluar la fuerza de la señal.
  4. Proporciona estadísticas de backtesting integradas al tratar cada patrón como una "operación" y calcular una tasa de éxito general.

En las siguientes secciones, profundizaremos en la estructura del EA, repasaremos sus ajustes personalizables y mostraremos cómo sus métricas de rendimiento pueden perfeccionar su enfoque de negociación basado en la acción del precio. Comencemos por explorar los patrones específicos de velas japonesas que este Asesor Experto (EA) monitorea, examinando la anatomía de cada vela y los cálculos utilizados para identificarlas.

Patrones de velas japonesas

  • Pin Bars

Una vela pin bar es una vela simple con un cuerpo pequeño y una cola o sombra larga. Cuando vea una, significa que el precio intentó moverse mucho en una dirección, pero fue repelido hacia atrás.

En una barra pin bajista, la larga sombra superior indica que los compradores no pudieron sostener la subida y que los vendedores tomaron el control.

Figura 1: Pin barra bajista

Una barra pin alcista tiene una sombra inferior larga, lo que indica que los compradores entraron en escena e impulsaron un giro al alza.

Figura 2: Pin bar alcista

El color de la vela también puede reforzar la señal. En una vela pin bar bajista, un cuerpo rojo (o negro) resulta más convincente porque cierra por debajo del precio de apertura, lo que demuestra el dominio de los vendedores. En una vela pin bar alcista, un cuerpo verde (o blanco) refuerza la señal al cerrar por encima del precio de apertura, lo que refleja la presión compradora. Sin embargo, la forma y la longitud de la cola de la pin bar son más importantes que el color por sí solo. Para confiar en la señal, busque una cola que sea al menos dos o tres veces mayor que el tamaño del cuerpo, observe cualquier pico de volumen durante el rechazo y compruebe que la barra de pin aparezca cerca de niveles conocidos de soporte o resistencia. Estos pasos adicionales le ayudan a identificar verdaderos giros del mercado en lugar de confundirlos con mechas ordinarias.

Pasos lógicos

  • Calcula candleBody, topShadow y bottomShadow.
  • Se requiere que candleBody sea mayor que minBodyPoints * _Point.

Barra de pin bajista:

topShadow >= wickToBodyRatio * candleBody

bottomShadow < smallWickCap * candleBody

Barra de pin alcista:

bottomShadow >=  wickToBodyRatio * candleBody

topShadow < smallWickCap * candleBody

// 1. Calculate parts
double candleBody   = MathAbs(closePrice - openPrice);
double topShadow    = highPrice - MathMax(openPrice, closePrice);
double bottomShadow = MathMin(openPrice, closePrice) - lowPrice;

// 2. Minimum body check
if(candleBody > minBodyPoints * _Point)
{
   // Bearish pin bar
   if(topShadow >= wickToBodyRatio * candleBody
      && bottomShadow < smallWickCap * candleBody)
      Print("Bearish Pin Bar detected");

   // Bullish pin bar
   else if(bottomShadow >= wickToBodyRatio * candleBody
           && topShadow < smallWickCap * candleBody)
      Print("Bullish Pin Bar detected");
}

  • Doji

Un «doji» aparece cuando el precio de apertura y el de cierre de una vela son prácticamente idénticos. Indica indecisión en el mercado y su sesgo depende de la tendencia previa. Las variaciones en la longitud de las sombras superior e inferior crean formaciones que se asemejan a un signo más, una cruz o una cruz invertida.

Figura 3: Doji

Pasos lógicos

  1. Calcula candleBody, fullRange, topShadow y bottomShadow.
  2. Se requiere que candleBody sea menor o igual que maxDojiRatio * fullRange.
  3. Se debe cumplir que topShadow > candleBody y bottomShadow > candleBody.
// 1. Calculate body and range
double candleBody   = MathAbs(closePrice - openPrice);
double fullRange    = highPrice - lowPrice;
double topShadow    = highPrice - MathMax(openPrice, closePrice);
double bottomShadow = MathMin(openPrice, closePrice) - lowPrice;

// 2. Tiny body test
if(candleBody <= fullRange * maxDojiRatio)
{
   // 3. Both shadows must extend beyond the body
   if(topShadow > candleBody && bottomShadow > candleBody)
      Print("Doji detected");
}
  • Patrones envolventes de velas japonesas

Hay dos tipos de velas envolventes: la envolvente alcista y la envolvente bajista.

Envolvente alcista

Este patrón de reversión de dos velas aparece cuando finaliza una tendencia bajista o una consolidación. Una vela bajista más pequeña es seguida inmediatamente por una vela alcista más grande que cubre por completo el cuerpo anterior. El tamaño de la segunda vela muestra que los compradores superan con creces a los vendedores y, a menudo, marca el inicio de un fuerte movimiento alcista.

Figura 4: Envolvente alcista

Envolvente bajista

Esta es la configuración inversa. Una vela alcista más pequeña es seguida por una vela bajista más grande que envuelve por completo el cuerpo anterior. Este patrón indica que los vendedores han tomado el control y puede ser una señal del comienzo de una fuerte caída.

Envolvente bajista

Figura 5: Envolvente bajista

Pasos lógicos

Calcula prevBody = |prevClose – prevOpen|, currBody = |close – open|.

Se requiere que currBody sea mayor que prevBody.

Patrón envolvente alcista:

  • prevClose < prevOpen
  • openPriceprevClose
  • closePriceprevOpen

Patrón envolvente bajista:

  • prevClose > prevOpen
  • openPrice ≥ prevClose
  • closePrice ≤ prevOpen
// 1. Compute body sizes
double prevBody = MathAbs(prevClose - prevOpen);
double currBody = MathAbs(closePrice - openPrice);

// 2. Must be larger than previous
if(currBody > prevBody)
{
   // Bullish engulfing
   if(prevClose < prevOpen
      && openPrice <= prevClose
      && closePrice >= prevOpen)
      Print("Bullish Engulfing detected");

   // Bearish engulfing
   else if(prevClose > prevOpen
           && openPrice >= prevClose
           && closePrice <= prevOpen)
      Print("Bearish Engulfing detected");
}

  • Vela Marubozu


Figura 6: Marubozu

Las velas Marubozu se distinguen por su cuerpo alargado y la ausencia casi total de mechas. Sus precios de apertura y cierre abarcan prácticamente todo el rango, lo que indica una acción decisiva del mercado. Existen tres variantes de Marubozu, cada una con versiones alcistas y bajistas:

Marubozu completo

Versión alcista: Apertura en el mínimo, cierre en el máximo. Los compradores determinan el precio de principio a fin.

Versión bajista: Apertura en el máximo, cierre en el mínimo. Los vendedores dominan durante toda la sesión.

Marubozu de apertura

Versión alcista: Apertura en el mínimo, cierre ligeramente por debajo del máximo (una pequeña mecha superior). Los compradores toman el control de inmediato.

Versión bajista: Apertura en el máximo, cierre ligeramente por encima del mínimo (una pequeña cola inferior). Los vendedores marcan el ritmo de la sesión desde el principio.

Marubozu de cierre

Versión alcista: Cierre en el máximo, apertura ligeramente por encima del mínimo (una pequeña mecha inferior). La presión compradora va en aumento a medida que se acerca el cierre.

Versión bajista: Cierre en el mínimo, apertura ligeramente por debajo del máximo (una pequeña mecha superior). La presión vendedora se intensifica al cierre.

Pasos lógicos

  • Calcula candleBody, fullRange, topShadow y bottomShadow.
  • Se requiere que candleBody sea igual o mayor que marubozuRatio * fullRange.
  • Se debe cumplir que topShadow ≤ (1 – marubozuRatio) * fullRange y bottomShadow ≤ (1 – marubozuRatio) * fullRange.
  • Si el precio de cierre es mayor que el precio de apertura, la tendencia es alcista; en caso contrario, es bajista.

// 1. Calculate parts
double candleBody   = MathAbs(closePrice - openPrice);
double fullRange    = highPrice - lowPrice;
double topShadow    = highPrice - MathMax(openPrice, closePrice);
double bottomShadow = MathMin(openPrice, closePrice) - lowPrice;

// 2. Body covers most of the range
if(candleBody >= marubozuRatio * fullRange)
{
   // 3. Shadows must be small
   double maxWick = (1 - marubozuRatio) * fullRange;
   if(topShadow <= maxWick && bottomShadow <= maxWick)
   {
      // 4. Bullish or bearish
      if(closePrice > openPrice)
         Print("Bullish Marubozu detected");
      else
         Print("Bearish Marubozu detected");
   }
}



Análisis detallado del EA de MQL5

Arriba se muestra el diagrama que ilustra el comportamiento del EA una vez aplicado al gráfico de MetaTrader 5. A continuación, hemos presentado los resultados en formato tabular; cada valor representa una variación porcentual. Cuando nos propusimos crear este asesor experto, nuestro objetivo principal era automatizar la detección de patrones clave de velas japonesas en los que los operadores suelen basarse para tomar decisiones de trading, como Pin Bars, Doji, Engulfing y Marubozu. Queríamos que el EA analizara de forma objetiva la evolución reciente de los precios, identificara estos patrones con precisión y ofreciera indicaciones visuales claras en el gráfico, junto con datos estadísticos sobre la eficacia del patrón.

Para lograrlo, empezamos por definir unos parámetros de entrada que permiten cierta flexibilidad en el análisis. Entre ellos se incluyen el número de barras hacia atrás que se analizarán (InpLookbackBars), el tamaño mínimo del cuerpo en puntos (InpMinBodySizePts) para descartar las velas insignificantes, y la relación entre la mecha y el cuerpo (InpWickBodyRatio) para la detección de barras pin. También hemos incluido un parámetro de período ATR para medir la volatilidad del mercado, que puede influir en las reglas de reconocimiento de patrones.

// Input parameters for customization
input int    InpLookbackBars   = 200;   // Bars to scan
input int    InpMinBodySizePts = 10;    // Min body size (points)
input double InpWickBodyRatio  = 2.0;   // Min wick-to-body ratio
input int    InpATRPeriod      = 14;    // ATR period

En la fase de inicialización (OnInit()), configuramos las matrices para almacenar los datos calculados de cada barra, como el tamaño del cuerpo, las mechas superior e inferior, el rango total y los valores de ATR. Nos hemos asegurado de que estas matrices estén organizadas en serie para poder procesar las barras recientes de forma eficiente. Además, hemos creado un pequeño búfer para registrar las señales recientes, lo que resulta útil a la hora de analizar posteriormente las tasas de éxito de los patrones.

int OnInit()
  {
   ArraySetAsSeries(Body,true);
   ArraySetAsSeries(UpperWick,true);
   ArraySetAsSeries(LowerWick,true);
   ArraySetAsSeries(TotalRange,true);
   ArraySetAsSeries(ATR,true);
   ArrayResize(Body, InpLookbackBars+2);
   ArrayResize(UpperWick, InpLookbackBars+2);
   ArrayResize(LowerWick, InpLookbackBars+2);
   ArrayResize(TotalRange, InpLookbackBars+2);
   ArrayResize(ATR, InpLookbackBars+2);

   for(int i=0;i<5;i++)
      g_history[i]="";

   return(INIT_SUCCEEDED);
  }
La lógica principal se encuentra en la función OnTick, que se ejecuta con cada nuevo tick del mercado. Para evitar cálculos innecesarios, hemos añadido un control que garantiza que el proceso solo se realice una vez por cada nueva barra, comparando las marcas de tiempo. Cuando se detecta una nueva barra, llamamos a AnalyzeAndDraw, que lleva a cabo el análisis principal.
void OnTick()
  {
   static datetime lastTime=0;
   datetime current = iTime(_Symbol, _Period, 0);
   if(current == lastTime)
      return; // Only process once per new bar
   lastTime = current;
   AnalyzeAndDraw();
  }

En AnalyzeAndDraw, lo primero que hacemos es borrar cualquier dibujo anterior para que el gráfico quede despejado. A continuación, recorremos las barras más recientes para calcular las métricas clave de las velas japonesas: el tamaño del cuerpo (diferencia absoluta entre la apertura y el cierre), la mecha superior (máximo menos el mayor valor entre la apertura y el cierre), la mecha inferior (mínimo entre la apertura y el cierre menos el mínimo) y el rango total (máximo menos mínimo). También copiamos los valores de ATR para incorporar aspectos relacionados con la volatilidad en la detección de patrones.

void AnalyzeAndDraw()
  {
   int bars = MathMin(InpLookbackBars, (int)SeriesInfoInteger(_Symbol,_Period,SERIES_BARS_COUNT));

   ObjectsDeleteAll(0,0,OBJ_ARROW);
   ObjectsDeleteAll(0,0,OBJ_LABEL);

   for(int i=0; i<bars; i++)
     {
      double op = iOpen(_Symbol,_Period,i);
      double cl = iClose(_Symbol,_Period,i);
      double hi = iHigh(_Symbol,_Period,i);
      double lo = iLow(_Symbol,_Period,i);

      // Calculate candlestick components
      Body[i]       = MathAbs(cl-op);
      UpperWick[i]  = hi - MathMax(op,cl);
      LowerWick[i]  = MathMin(op,cl) - lo;
      TotalRange[i] = hi - lo;
     }

   // Copy ATR buffer
   if(CopyBuffer(iATR(_Symbol,_Period,InpATRPeriod),0,0,bars,ATR)<=0)
      return; // Exit if ATR data not available

A continuación, aplicamos nuestras reglas de reconocimiento de patrones. Por ejemplo, para identificar una «pin bar», comprobamos si la vela tiene un cuerpo pequeño y una mecha larga, y si la relación entre la mecha y el cuerpo supera nuestro umbral.

  • Barra pin bajista: mecha superior larga >= ratio × cuerpo, mecha inferior pequeña
  • Barra pin alcista: mecha inferior larga >= ratio × cuerpo, mecha superior pequeña

En primer lugar, descartamos los cuerpos más pequeños (Body > minPts). A continuación, nos aseguramos de que una de las mechas tenga una longitud de, como mínimo, InpWickBodyRatio veces la del cuerpo, y de que la mecha opuesta no supere el 50 % del cuerpo.

// assume Body[i], UpperWick[i], LowerWick[i] already computed
if(InpShowPinBar && Body[i] > InpMinBodySizePts*_Point)
{
   // Bearish: towering upper wick, stubby lower wick
   if( UpperWick[i] > Body[i]*InpWickBodyRatio
       && LowerWick[i] < Body[i]*0.5 )
      type = "Bearish Pin Bar";

   // Bullish: towering lower wick, stubby upper wick
   else if( LowerWick[i] > Body[i]*InpWickBodyRatio
            && UpperWick[i] < Body[i]*0.5 )
      type = "Bullish Pin Bar";
}

En el caso del Doji, buscamos velas con cuerpos mínimos en relación con un umbral basado en puntos, y con mechas que indiquen una posible indecisión.

  • Body <= DojiBodyRatio × totalRange
  • Ambas mechas > cuerpo (para confirmar que hay sombras)

Limitamos el cuerpo a, digamos, el 10 % del rango total (InpDojiBodyRatio). El hecho de exigir que cada mecha sobrepasen el cuerpo permite descartar los «peonzas» que apenas tienen sombras.

// TotalRange[i] = high – low
if(InpShowDoji
   && Body[i] <= TotalRange[i] * InpDojiBodyRatio    // body tiny vs full range
   && UpperWick[i] > Body[i]                         // upper shadow present
   && LowerWick[i] > Body[i])                        // lower shadow present
   type = "Doji";

Los patrones envolvente consisten en comparar la vela actual con la anterior, comprobando si la apertura y el cierre de la vela anterior se encuentran en lados opuestos y si la vela actual envuelve por completo a la anterior.

  • Patrón envolvente alcista: la barra anterior fue bajista, la apertura actual es ≤ al cierre anterior, el cierre actual es ≥ a la apertura anterior y currBody > prevBody
  • Patrón envolvente bajista: la barra anterior era alcista, la apertura actual es ≥ al cierre anterior, el cierre actual es ≤ a la apertura anterior y currBody > prevBody

double po = iOpen(_Symbol,_Period,i+1),
       pc = iClose(_Symbol,_Period,i+1);
double prevBody = MathAbs(pc - po),
       currBody = Body[i];

if(InpShowEngulfing && currBody > prevBody)
{
   // Bullish: current body engulfs prior’s
   if(pc < po && op <= pc && cl >= po)
      type = "Bullish Engulfing";
   // Bearish: current body engulfs prior’s
   else if(pc > po && op >= pc && cl <= po)
      type = "Bearish Engulfing";
}

En el caso de las velas Marubozu, comprobamos si el cuerpo abarca la mayor parte del rango total, lo que indica un fuerte impulso.

  • Body >=  MarubozuBodyRatio × totalRange (p. ej., ≥ 90 %)
  • Ambas mechas <= (1 – MarubozuBodyRatio) × totalRange

if(InpShowMarubozu
   && Body[i] >= TotalRange[i] * InpMarubozuBodyRatio
   && UpperWick[i] <= TotalRange[i] * (1 - InpMarubozuBodyRatio)
   && LowerWick[i] <= TotalRange[i] * (1 - InpMarubozuBodyRatio))
{
   type = (cl > op) ? "Bullish Marubozu" : "Bearish Marubozu";
}

Cada vez que se detecta un patrón, incrementamos los contadores de señales totales y de ganancias. Definimos las «ganancias» en función de si la vela siguiente se mueve en la dirección esperada, lo que nos proporciona una medida de la fiabilidad del patrón.

if(type!="")
{
    lastIdx = i;
    lastCl = cl;
    lastIsBuy = (StringFind(type,"Bullish")>=0);
    latestSignal = type;

    g_totalSignals++;
    double nextC = iClose(_Symbol,_Period,i-1);
    if(lastIsBuy && nextC>cl)
        g_totalWins++;
    if(!lastIsBuy && nextC<cl)
        g_totalWins++;

    DrawPattern(i, type, lastIsBuy);
    break;
}

Para que estas señales sean fácilmente identificables, dibujamos flechas que apuntan hacia arriba o hacia abajo en el gráfico, junto con etiquetas que indican el tipo de patrón, utilizando la función DrawPattern. También generamos alertas para que se nos avise de inmediato cuando aparezca un patrón.

void DrawPattern(int idx, const string type, bool isBuy)
  {
   datetime t = iTime(_Symbol,_Period,idx);
   double y = iHigh(_Symbol,_Period,idx) + 15*_Point;
   string an = StringFormat("PAQ_%s_%d",type,idx);
   ObjectCreate(0,an,OBJ_ARROW,0,t,y);
   ObjectSetInteger(0,an,OBJPROP_ARROWCODE,isBuy?233:234);
   ObjectSetInteger(0,an,OBJPROP_COLOR,isBuy?clrLime:clrRed);
   string lbl = an+"_lbl";
   ObjectCreate(0,lbl,OBJ_LABEL,0,t,y-25*_Point);
   ObjectSetString(0,lbl,OBJPROP_TEXT,type);
   ObjectSetInteger(0,lbl,OBJPROP_COLOR,isBuy?clrLime:clrRed);
  }
A lo largo del proceso de desarrollo, nuestro objetivo ha sido conseguir que la EA sea flexible e informativa. Por eso, hemos incluido un búfer de historial de patrones para conservar las señales recientes y, al final del backtest o cuando desactivamos el EA, mostramos estadísticas de rendimiento como el número total de señales, las ganancias y la tasa de acierto. Esto nos ayuda a evaluar la eficacia de nuestra lógica de detección de patrones a lo largo del tiempo.
void OnDeinit(const int reason)
  {
   double rate = g_totalSignals>0 ? 100.0*g_totalWins/g_totalSignals : 0.0;
   PrintFormat("[PAQ] Backtest completed: Signals=%I64d Wins=%I64d WinRate=%.1f%%",
               g_totalSignals, g_totalWins, rate);
  }

En conclusión, este EA se ha desarrollado integrando la lógica de detección de patrones de velas japonesas con indicadores visuales y funciones de seguimiento del rendimiento. Nuestro objetivo era crear un sistema automatizado que simplificara la tarea, a menudo laboriosa, de identificar patrones, al tiempo que ofreciera señales visuales claras y estadísticas de rendimiento para facilitar la toma de decisiones de inversión más fundamentadas.


Resultados

Veamos cómo ha funcionado nuestro EA tanto en tiempo real como en backtesting. En primer lugar, observamos en el siguiente diagrama el patrón que el EA detectó en el mercado real: se trata del patrón de una envolvente bajista. Se ve claramente que es la auténtica, ya que la vela bajista envuelve por completo a la vela alcista anterior.

Figura 7: Envolvente bajista

A continuación, tenemos una vela pin bar bajista que se ha detectado correctamente. Se trata de una vela pin bar válida, lo que demuestra la precisión de la herramienta para identificar patrones de velas japonesas.

Figura 8: Pin barra bajista

Finalmente, aquí tenemos los resultados de nuestras pruebas retrospectivas. El EA identifica correctamente los patrones y registra el nombre de cada patrón detectado en el registro.

Figura 9: Backtesting


Conclusión

A partir de los resultados expuestos en la sección anterior, queda claro que nuestro EA detecta de forma fiable los cuatro patrones clave de velas japonesas. Este hito ayudará tanto a los operadores novatos como a los experimentados a identificar formaciones que pueden ser difíciles de detectar a simple vista. En mis pruebas retrospectivas y en los ensayos en el mercado real, el Asesor Experto identificó correctamente cada patrón. Si bien ningún sistema es perfecto, algunas señales pueden no materializarse; el EA no está diseñado para filtrar todas las señales falsas. En cambio, ofrece una capa adicional y precisa de análisis de la evolución de los precios. Los operadores pueden entonces aplicar sus propias técnicas de confirmación antes de comprometerse con una posición larga o corta.

En general, el EA destaca en su tarea principal: el reconocimiento de patrones. Lo recomiendo encarecidamente por su precisión a la hora de detectar las cuatro formaciones a las que se dirige. No dudes en ajustar los parámetros de entrada para adaptarlos a tu estrategia. Agradezco tus comentarios sobre cualquier aspecto que consideres que se podría mejorar aún más.

Fecha Nombre de la herramienta  Descripción Versión  Actualizaciones  Notas
01/10/24 Chart Projector Script para superponer un efecto fantasma a la evolución del precio del día anterior 1.0 Versión inicial Herramienta número 1
18/11/24 Analytical Comment Proporciona la información del día anterior en formato tabular, además de anticipar la dirección futura del mercado 1.0 Versión inicial Herramienta número 2
27/11/24 Analytics Master Actualización periódica de las métricas del mercado cada dos horas  1.01 Segundo lanzamiento Herramienta número 3
02/12/24 Analytics Forecaster  Actualización periódica de las métricas del mercado cada dos horas con integración de Telegram 1.1 Tercera edición Herramienta número 4
09/12/24 Volatility Navigator El EA analiza las condiciones del mercado utilizando los indicadores Bandas de Bollinger, RSI y ATR 1.0 Versión inicial Herramienta número 5
19/12/24 Mean Reversion Signal Reaper  Analiza el mercado utilizando una estrategia de reversión a la media y proporciona una señal  1.0  Versión inicial  Herramienta número 6 
09/01/25  Signal Pulse  Analizador de múltiples marcos temporales 1.0  Versión inicial  Herramienta número 7 
17/01/25  Metrics Board  Panel con botón para análisis  1.0  Versión inicial Herramienta número 8 
21/01/25 External Flow Análisis a través de bibliotecas externas 1.0  Versión inicial Herramienta número 9 
27/01/25 VWAP Volume Weighted Average Price   1.3  Versión inicial  Herramienta número 10 
02/02/25  Heikin Ashi  Suavizado de tendencias e identificación de señales de reversión  1.0  Versión inicial  Herramienta número 11
04/02/25  FibVWAP  Generación de señales mediante análisis con Python  1.0  Versión inicial  Herramienta número 12
14/02/25  RSI DIVERGENCE  Divergencias entre la acción del precio y el RSI  1.0  Versión inicial  Herramienta número 13 
17/02/25  Parabolic Stop and Reverse (PSAR)  Automatización de la estrategia PSAR 1.0 Versión inicial  Herramienta número 14
20/02/25  Quarters Drawer Script  Trazar los niveles de los cuartos en el gráfico  1.0  Versión inicial  Herramienta número 15 
27/02/25  Intrusion Detector Detecta y alerta cuando el precio alcanza niveles de cuartos 1.0   Versión inicial Herramienta número 16 
27/02/25  TrendLoom Tool Panel de análisis de múltiples marcos temporales 1.0 Versión inicial Herramienta número 17
11/03/25  Quarters Board  Panel con botones para activar o desactivar los niveles de cuartos  1.0  Versión inicial Herramienta número 18
26/03/25  ZigZag Analyzer  Trazado de líneas de tendencia con el indicador ZigZag  1.0  Versión inicial  Herramienta número 19 
10/04/25  Correlation Pathfinder Representación gráfica de correlaciones monetarias mediante bibliotecas de Python 1.0 Versión inicial  Herramienta número 20 
23/04/25 Market Structure Flip Detector Tool Detección de cambios en la estructura del mercado 1.0  Versión inicial  Herramienta número 21
08/05/25  Correlation Dashboard  Relación entre diferentes pares 1.0 Versión inicial Herramienta número 22 
13/05/25 Currency Strength Meter  Medir la fortaleza de cada divisa en diferentes pares 1.0 Versión inicial Herramienta número 23 
21/05/25 PAQ Analysis Tool  Detector de formación de velas 1.0  Versión inicial Herramienta número 24 

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

Del básico al intermedio: Sobrecarga de operadores (III) Del básico al intermedio: Sobrecarga de operadores (III)
En este artículo veremos cómo implementar la sobrecarga tanto de operadores lógicos como de operadores relacionales. Hacerlo requiere cierto cuidado y una buena dosis de atención. Un simple descuido al implementar la sobrecarga de estos operadores puede hacer que todo el código termine siendo completamente inservible. Si la sobrecarga presenta algún problema, toda una base de datos creada a partir de los resultados generados por el código deberá descartarse por completo o, como mínimo, revisarse íntegramente.
Simulación de mercado: La unión hace la fuerza (I) Simulación de mercado: La unión hace la fuerza (I)
Estamos llegando a la recta final. El desarrollo del sistema de repetición/simulador está casi terminado. Es cierto que aún tendremos que completar algunas cosas, pero, en comparación con todo lo que ya hemos hecho, implementar lo que falta será sencillo. Sin embargo, todo lo que se mostrará en este artículo deberá asimilarse y comprenderse adecuadamente. Quiero que tú, estimado lector y entusiasta...
Simulación de mercado: La unión hace la fuerza (II) Simulación de mercado: La unión hace la fuerza (II)
Hasta ahora, la aplicación desarrollada a lo largo de esta serie de artículos se centraba exclusivamente en simular la parte gráfica. Sin embargo, para disponer de un sistema más completo, en el que podamos probar un Asesor Experto dentro del servicio de repetición/simulador, también debemos simular el servidor de trading. Observarás que esta simulación incluirá únicamente los elementos imprescindibles. No obstante, tú, estimado lector, podrás completar las partes que falten. Como esos componentes adicionales no influyen en lo que pretendo mostrar, ya contamos con más que suficiente para desarrollar lo que hemos planificado.
Del básico al intermedio: Sobrecarga de operadores (II) Del básico al intermedio: Sobrecarga de operadores (II)
Este artículo puede parecer bastante confuso al principio por el contenido que presentaré. Sin embargo, he intentado presentar todo de la forma más sencilla y didáctica posible. Espero que comprendas lo que voy a mostrar aquí y que te resulte útil en algún momento.