Aprendiendo a diseñar un sistema de trading con el indicador de Acumulación/Distribución

Mohamed Abdelmaaboud | 5 agosto, 2022

Introducción

Esta serie de artículos está dedicada al estudio profundo de los indicadores técnicos más populares y su aplicación como estrategias sencillas. Los sistemas comerciales basados en estas estrategias se han desarrollado usando el lenguaje de programación MQL5 para su ejecución en la plataforma comercial MetaTrader 5. En este artículo, nos familiarizaremos con el indicador de Acumulación/Distribución (AD). Este indicador técnico se basa en el volumen, y nos ayuda a observar un instrumento financiero desde una perspectiva diferente. Una vez más, el trabajo sobre el indicador se dividirá en varios temas:

  1. Definición del indicador AD
  2. Estrategia del indicador AD
  3. Esquema de la estrategia del indicador AD
  4. Sistema comercial del indicador AD
  5. Conclusión

En primer lugar, estudiaremos con detalle la teoría sobre este indicador técnico, lo que mide y cómo se puede calcular manualmente (para entender su concepto básico). A continuación, desarrollaremos un sistema comercial basado en él. Asimismo, analizaremos el cálculo del indicador con un ejemplo concreto para entenderlo mejor. Una vez estudiados en profundidad los fundamentos del indicador AD, veremos cómo puede usarse en estrategias sencillas. Después, desarrollaremos un esquema para cada estrategia analizada que nos servirá de ayuda a la hora de escribir un código para el sistema comercial basado en cada estrategia. Tras desarrollar los esquemas para escribir el código, abordaremos lo más interesante del artículo: la programación de diferentes sistemas comerciales basados en las estrategias analizadas en MQL5. El programa resultante se ejecutará en la plataforma comercial.

A estas alturas, ya habremos analizado en profundidad el indicador AD y habremos aprendido a utilizarlo. Acto seguido, crearemos un sistema comercial basado en las sencillas estrategias que hemos comentado. Recomendamos al lector que aplique todo lo aprendido por su cuenta: intente reproducir el código, esto le ayudará a comprender mejor el material. El objetivo principal de este artículo (así como de los demás de esta serie) es enseñar a los programadores principiantes a desarrollar sistemas comerciales basados en los indicadores más populares. Para escribir los códigos, usaremos el MetaQuotes Language (MQL5) y el MetaEditor, el editor de código incorporado en la plataforma MetaTrader 5. Si quiere saber más sobre la plataforma y el editor, le recomiendo que lea "Cómo escribir código MQL5 en el MetaEditor" en uno de mis artículos anteriores. Ahí se describe con detalle cómo instalar el terminal y dónde encontrar el editor de código.

¡Atención! Toda la información del presente artículo se ofrece «tal cual», únicamente con fines ilustrativos, y no supone ningún tipo de recomendación. El artículo no garantiza ningún resultado en absoluto. Todo lo que ponga en práctica usando este artículo como base, lo hará bajo su propia cuenta y riesgo; el autor no garantiza resultado alguno.

Bien, ahora vamos a profundizar en un nuevo bloque de conocimientos que nos ayudará a mejorar.

Definición del indicador AD

Aquí hablaremos con todo detalle del indicador de Acumulación/Distribución (AD), veremos su definición, qué mide y cómo se puede calcular manualmente. El indicador AD fue desarrollado por Mark Chaikin. Es un indicador basado en el volumen, es decir, se calcula usando los volúmenes. En general, el concepto de volumen es un componente importante del trading en su conjunto, ya que mide el flujo total de dinero que entra y sale de un instrumento. El volumen también se usa para confirmar una tendencia o advertir de un retroceso. Si quiere saber más sobre las tendencias, le recomendamos que lea la sección "Definición de la tendencia" de mi artículo publicado anteriormente.

Como cualquier indicador acumulativo, la línea AD supone la suma intermedia del volumen de flujo de dinero de cada periodo. Esto resulta especialmente visible en la forma de calcular el indicador. La línea de Acumulación/Distribución se calcula en varios pasos.

Bien, estos tres pasos son los siguientes:

  1. Cálculo del multiplicador del flujo de dinero = ((cierre - mínimo) - (máximo - cierre))/(máximo - mínimo)
  2. Cálculo del volumen de flujo de dinero = Multiplicador de flujo de dinero * volumen por periodo
  3. Línea AD = valor AD anterior + volumen actual de flujo de dinero

Veamos ahora el cálculo de todos estos pasos partiendo de un ejemplo. Supongamos que tenemos los siguientes datos para un instrumento:

Día Máximo Mínimo Cerrar Volumen
1 55 53 54 12000
2 56 54 55 10000
3 61 59 60 15000
4 67 64 65 20000
5 63 58 60 10000
6 58 52 55 5000
7 64 58 60 7000
8 52 47 50 7500
9 52 48 48 8000
10 50 48 49 5000
11 49 47 48 6000
12 48 47 47 7500
13 50 46 48 9000
14 52 45 47 10000
15 55 46 49 7000
16 53 45 47 7500
17 51 43 46 6000
18 50 42 44 5000
19 50 43 45 15000

Calcularemos los valores del indicador AD a partir de este recuadro de datos. Bien, repasemos todos los pasos:

En primer lugar, calculamos el multiplicador de flujos de dinero = ((Close - Low) - (High-Close))/(High-Low). Obtendremos un recuadro de datos como este:

Cálculo de AD

A continuación, calculamos el volumen del flujo de dinero = multiplicador de flujo de dinero * volumen por periodo. Obtenemos los siguientes datos:

Cálculo de AD 1

El tercer paso consiste en calcular la línea AD = valor anterior de la línea AD + volumen actual del flujo de dinero. Obtenemos los datos siguientes:

Cálculo de AD 2

Hemos calculado el indicador AD de forma manual, pero en realidad no tenemos que hacerlo, ya que existe un indicador ya preparado para ello. Todos estos pasos los hemos estudiado para entender mejor el funcionamiento del indicador. Ahora, si queremos usar este indicador, todo lo que tenemos que hacer es seleccionarlo de la lista de otros indicadores disponibles en el terminal MetaTrader 5.

Para ello, en la ventana del terminal MetaTrader 5, seleccionamos el menú "Insertar" --> Indicadores --> Indicadores de volumen --> Acumulación/Distribución

Iniciando AD en la plataforma

Una vez seleccionado el indicador, se abrirá una ventana para configurar los parámetros:

Ventana de parámetros del indicador AD

1. Tipos de volúmenes: de tics o real.

2. Color de la línea AD.

3. Tipo de línea AD.

4. Grosor de la línea AD.

Ajuste los parámetros necesarios, pulse OK y el indicador aparecerá en el gráfico como mostramos a continuación:

Indicador AD en el gráfico

Veamos ahora cómo podemos utilizar el indicador AD.


Estrategia del indicador AD

En esta sección hablaremos sobre cómo podemos utilizar el indicador AD con algunas estrategias sencillas. Esperamos que esta parte le sea útil y le ayude a encontrar nuevas ideas comerciales.

Para las estrategias analizadas, podría ser necesario realizar una optimización. Esto es normal, porque el propósito principal aquí es compartir estrategias simples que deben ayudar a entender el concepto básico del indicador AD y mostrar un ejemplo sobre cómo podemos crear un sistema comercial basado en este indicador usado el lenguaje de programación MQL5. Así que asegúrese de poner a prueba cada estrategia antes de usarla en una cuenta real, y no dude en optimizarla si fuera necesario. Seleccione el periodo que mejor se adapte a sus necesidades comerciales concretas.

Veamos ahora algunas estrategias simples basadas en el indicador AD.

Según esta estrategia, determinaremos si la línea AD es ascendente o descendente. Para ello, solo tendremos que comparar el valor AD actual con el valor anterior. Si el valor AD actual es mayor que el valor anterior, la línea AD crece. Por el contrario, si el valor actual es inferior al anterior, el AD disminuye.

Resumiendo:

AD actual > AD anterior --> la línea AD sube

AD actual < AD anterior --> la línea AD baja

Esta estrategia nos ayudará a determinar si el movimiento actual de la línea AD es fuerte o débil. Para ello, solo tendremos que comparar el valor AD actual con el valor máximo o mínimo de los últimos diez valores AD. Si el valor actual es mayor que el valor máximo de los diez AD anteriores, el AD actual se considerará fuerte. Por el contrario, si el valor actual resulta menor que el valor mínimo de los diez AD anteriores, el valor actual de AD se considerará débil.

Es decir:

AD actual > valor máximo de los 10 anteriores --> el valor AD actual es fuerte

AD actual < valor mínimo de los 10 anteriores --> el valor AD actual es débil

Según esta estrategia, determinaremos el movimiento alcista actual durante una tendencia alcista: es decir, si el movimiento es fuerte o se ha formado una divergencia bajista (en forma simple). Hablamos de divergencia bajista cuando el precio forma un nuevo máximo, pero el indicador no confirma este movimiento, porque se está moviendo hacia abajo. Utilizaremos los dos últimos valores AD y los dos últimos valores máximos para determinar los indicadores: elegiremos este cálculo para mayor simplicidad, pero usted podrá editar esta parte para obtener los datos que desee. Este es un ejemplo del concepto en funcionamiento que establece que es mejor cuando el volumen se mueve con la tendencia: durante una tendencia alcista, el volumen aumentará cuando haya un movimiento alcista y disminuirá cuando haya una corrección.

Vamos a comparar el valor AD actual con el valor anterior, y también compararemos el máximo actual con el máximo anterior. Cuando el valor AD actual es mayor que el valor AD anterior y el máximo actual es mayor que el máximo anterior, el movimiento alcista será fuerte. Y si el AD actual es menor que el AD anterior y el máximo actual es mayor que el máximo anterior, se formará una divergencia bajista.

Es decir:

AD actual > AD anterior y máximo actual > máximo anterior --> Movimiento fuerte durante la tendencia alcista

AD actual < AD anterior y máximo actual > máximo anterior --> Movimiento fuerte durante la tendencia alcista

Se trata de lo contrario a la estrategia AD simple: tendencia alcista. Determinaremos si el movimiento bajista actual es fuerte o si se ha formado una divergencia alcista. Hablamos de divergencia alcista cuando el precio forma un nuevo mínimo, pero el indicador no confirma este movimiento, porque se está moviendo hacia arriba. Para determinar el movimiento, compararemos los dos últimos valores del indicador AD y los dos últimos valores del mínimo. Cuando el AD actual es inferior al AD anterior y el mínimo actual es inferior al mínimo anterior, el movimiento bajista será fuerte. Y si el AD actual es mayor que el AD anterior y el mínimo actual es menor que el mínimo anterior, se formará una divergencia alcista.

No es nada complicado:

AD actual < AD anterior y mínimo actual < mínimo anterior --> Movimiento fuerte durante la tendencia bajista

AD actual > AD anterior y mínimo actual < mínimo anterior --> Divergencia alcista 


Esquema de la estrategia del indicador AD

Ha llegado el momento de ver la creación de un sistema comercial paso a paso. En esta parte, crearemos un esquema paso a paso de cada estrategia que nos ayudará a desarrollar un sistema comercial. A nuestro juicio, este es un paso muy importante en el proceso de creación de cualquier sistema comercial. Esto nos ayudará a definir de forma clara y detallada lo que queremos del futuro programa, lo que debería hacer.

Empezaremos desarrollando un sencillo programa para el indicador AD que mostrará un comentario en el gráfico con el valor AD actual. Esta será la base de todas las estrategias futuras. Lo llamaremos AD simple (porque la estrategia es realmente lo más simple posible: la muestra de un comentario). El esquema para crear esta estrategia sería el siguiente:

Esquema de la estrategia AD simple

 

A continuación, desarrollaremos los esquemas para cada una de las estrategias analizadas.

El sistema tendrá que comprobar continuamente el valor AD actual y el anterior en cada tick. A continuación, el sistema deberá determinar si el valor actual del asesor es mayor que el valor anterior o no. El programa deberá mostrar un comentario sobre el gráfico: línea AD ascendente, valor AD actual y valor AD anterior. Cada valor se mostrará en una línea aparte. En la situación inversa, si el valor actual es menor que el valor anterior, deberá aparecer el siguiente comentario en el gráfico: línea AD descendente, valor AD actual y valor AD anterior. Los valores se mostrarán de nuevo en una línea aparte. El esquema para crear este sistema de comercio será el siguiente:

Esquema de AD - Movimiento simple

Ahora desarrollaremos un sistema comercial que podrá comprobar continuamente tres valores en cada tick. Estos tres valores serán: el AD actual, el valor máximo y el valor mínimo de los diez valores AD anteriores. Si el valor AD actual es mayor que el valor AD máximo, el sistema retornará la notificación correspondiente, el valor AD actual, el valor AD máximo y el valor AD mínimo. Cada valor se muestra en una línea aparte. Si el valor AD actual es inferior al mínimo, el sistema deberá retornar la notificación correspondiente, el valor AD actual, el máximo y el mínimo. Cada valor se muestra en una línea aparte.

El esquema de desarrollo será el que sigue:

Esquema de AD - Fuerza simple

Vamos a crear un sistema comercial para esta estrategia que se base en cuatro valores: el AD actual, el AD anterior, el máximo actual y el máximo anterior. Volvemos a comprobar los valores en cada tick. A continuación, los sistemas deberán determinar si el AD actual es mayor que el AD anterior y si el máximo actual del AD anterior es mayor. Basándose en la comparación, el sistema deberá mostrar en el gráfico un comentario sobre un movimiento alcista durante la tendencia alcista, el AD actual, el AD anterior, los máximos actuales y los anteriores. Cada valor se muestra en una línea aparte. Otro posible caso a considerar es si el AD actual es menor que el anterior y el máximo actual es mayor que el anterior. El sistema debe informar de una divergencia bajista, el valor AD actual, el valor AD anterior, el máximo actual y el máximo anterior. Todos los valores se muestran en líneas distintas.

Este esquema paso a paso le ayudará a desarrollar un sistema comercial para esta estrategia:

Esquema de AD - tendencia alcista - plan

Vamos a crear un sistema comercial para esta estrategia basado en cuatro valores: el AD actual, el AD anterior, el mínimo actual y el mínimo anterior. Volvemos a comprobar los valores en cada tick. A continuación, los sistemas deberán determinar si el AD actual es mayor que el AD anterior y si el máximo actual del AD anterior es mayor. Basándose en la comparación, el sistema deberá mostrar en el gráfico un comentario sobre un fuerte movimiento bajista durante la tendencia bajista, el AD actual, el AD anterior, el mínimo actual y el mínimo anterior. Otro caso posible es si el AD actual es mayor que el AD anterior y el mínimo actual es menor que el mínimo anterior. El sistema deberá informar de la divergencia alcista, el AD actual, el AD anterior, el mínimo actual y el mínimo anterior. Todos los valores se muestran en líneas distintas.

Este esquema paso a paso le ayudará a desarrollar un sistema comercial para esta estrategia:

Esquema de AD - tendencia bajista - plan


Sistema comercial del indicador AD

En la siguiente parte, ya procedemos a desarrollar sistemas comerciales basados en dichas estrategias. Comenzaremos creando un sistema sencillo que solo retornará el valor AD actual, que será la base de nuestras estrategias. El código de la estrategia será el que sigue:

double ADArray[];
ArraySetAsSeries(ADArray,true);
int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
CopyBuffer(ADDef,0,0,3,ADArray);
int ADValue=NormalizeDouble(ADArray[0],5);
Comment("AD Value is: ",ADValue);

A continuación, podemos ver el código completo de este asesor:

//+------------------------------------------------------------------+
//|                                                    Simple AD.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //Create array for AD
   double ADArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(ADArray,true);
   
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //calculating current AD value
   int ADValue=NormalizeDouble(ADArray[0],5);
   
   //creating a comment with AD value
   Comment("AD Value is: ",ADValue);  
  }
//+------------------------------------------------------------------+

Después compilaremos el código del asesor experto, y este aparecerá en la ventana del Navegador, en el terminal de MetaTrader 5:

AD en el Navegador

El programa podrá iniciarse arrastrándolo y soltándolo en el gráfico. Se abrirá la ventana siguiente:

Ventana de la estrategia de AD simple

Pulsamos OK y el programa (asesor) se iniciará en el gráfico como se muestra en la figura siguiente:

Estrategia de AD simple en el gráfico

A continuación podemos ver ejemplos de señales generadas por el asesor que hemos creado:

Señal de prueba de la estrategia AD simple

Si quiere asegurarse de que el asesor generará exactamente el mismo valor que el indicador original de MetaTrader 5, podrá ejecutar el indicador y el asesor simultáneamente. Podemos ver que son lo mismo:

AD simple - las mismas señales

A continuación, le mostraremos el código completo para crear dicha estrategia: El programa resultante podrá ejecutarse en el gráfico, donde generará las señales:

//+------------------------------------------------------------------+
//|                                           Simple AD movement.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //Create array for AD
   double ADArray[];
   
   //sorting array from the current data
   ArraySetAsSeries(ADArray,true);
   
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //calculating current AD and previous values
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
   int ADPrevValue=NormalizeDouble(ADArray[1],5);
   
   //Comparing two values and giving signal
   //Rising AD
   if(ADCurrrentValue>ADPrevValue)
   {
      Comment("AD line is rising","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue);
   }
   
   //Declining AD
   if(ADCurrrentValue<ADPrevValue)
   {
      Comment("AD line is declining","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue);
   }  
  }
//+------------------------------------------------------------------+

El código anterior difiere del código básico en los siguientes puntos:

int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
int ADPrevValue=NormalizeDouble(ADArray[1],5);

if(ADCurrrentValue>ADPrevValue)
{
 Comment("AD line is rising","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue);
}

if(ADCurrrentValue<ADPrevValue)
{
 Comment("AD line is declining","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue);
} 

Después de realizar la compilación, el asesor experto aparecerá en la ventana del Navegador en MetaTrader 5:

AD en el Navegador 2

Clicamos dos veces y se abrirá una ventana como ésta:

Ventana del programa AD - Movimiento simple

El programa aparecerá ahora en el gráfico después de pulsar "OK":

AD - Movimiento simple - en el gráfico

A continuación, se representa un ejemplo de las señales generadas mostrando la ventana de datos: actuales y anteriores

La línea AD ascendente

Datos actuales: 

Movimiento simple de AD - Crecimiento de AD - datos actuales

 

Datos anteriores:

Movimiento simple de AD - Crecimiento de AD - datos anteriores

AD descendente

Datos actuales:

Movimiento simple de AD - disminución de AD - datos actuales

Datos anteriores:

 Movimiento simple de AD - disminución de AD - datos anteriores

A continuación, le mostramos el código completo de un asesor que realiza todas estas acciones:

//+------------------------------------------------------------------+
//|                                           Simple AD strength.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
void OnTick()
  {
   //Create array for AD
   double ADArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(ADArray,true);
  
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,10,ADArray);
 
   //calculating current AD and previous values
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
  
   //Defining Max and Min values from the last 10 AD values
   int ADMax =ArrayMaximum(ADArray,1,10);
   int ADMin =ArrayMinimum(ADArray,1,10);
   
   //Calculating Max and Min values
   int ADMaxValue=ADArray[ADMax];
   int ADMinValue=ADArray[ADMin];

   //Comparing two values and giving signal
   //AD current is strong
   if(ADCurrrentValue>ADMaxValue)
   {
      Comment("AD Current value is strong","\n","AD current value is: ,",ADCurrrentValue,
   "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
   }
   
   //AD current is weak
   if(ADCurrrentValue<ADMinValue)
   {
      Comment("AD Current value is weak","\n","AD current value is: ,",ADCurrrentValue,
   "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
   }
  }
//+------------------------------------------------------------------+

Aquí hay muchas diferencias respecto al código anterior. Vamos a verlas:

int ADMax =ArrayMaximum(ADArray,1,10);
int ADMin =ArrayMinimum(ADArray,1,10);

int ADMaxValue=ADArray[ADMax];
int ADMinValue=ADArray[ADMin];

if(ADCurrrentValue>ADMaxValue)
{
 Comment("AD Current value is strong","\n","AD current value is: ,",ADCurrrentValue,
 "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
}

if(ADCurrrentValue<ADMinValue)
{
 Comment("AD Current value is weak","\n","AD current value is: ,",ADCurrrentValue,
 "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
}

Después de realizar la compilación, el asesor experto aparecerá en la ventana del Navegador en MetaTrader 5:

AD en el Navegador 3

 

Arrastramos nuestro programa desde el Navegador al gráfico y lo soltamos. Se abrirá una ventana como esta:

Ventana del programa AD Strength

El programa aparecerá ahora en el gráfico después de pulsar "OK":

Programa AD Strength en el gráfico

Los siguientes son ejemplos de señales de este programa:

AD fuerte:

Simple AD Strength - señal de fuerza

AD débil:

Simple AD Strength - débil

A continuación, le mostramos el código completo para crear dicha estrategia:

//+------------------------------------------------------------------+
//|                                          Simple AD - uptrend.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //Create two arrays for AD and price
   double ADArray[];
   MqlRates PriceArray[];
   
   //sorting the two arrays
   ArraySetAsSeries(ADArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
   
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //calculating current AD and previous values
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
   int ADPrevValue=NormalizeDouble(ADArray[1],5);
   
   //calculating current and previous highs
   double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);         
   double PrevHighValue=NormalizeDouble(PriceArray[1].high,5); 
   
   //Comparing two values and giving signal
   //Strong Up move
   if(ADCurrrentValue > ADPrevValue && CurrentHighValue>PrevHighValue)
   {
      Comment("Strong Up Move During The Uptrend","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current high value is: ",CurrentHighValue,
      "\n","Previous high value is: ",PrevHighValue);    
   }   
   
   //in case of divergence
   if(ADCurrrentValue < ADPrevValue && CurrentHighValue>PrevHighValue)
   {
      Comment("Bearish Divergence","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current low value is: ",CurrentHighValue,
      "\n","Previous low value is: ",PrevHighValue);      
   }   
  }
//+------------------------------------------------------------------+

Diferencias en este código:

double ADArray[];
MqlRates PriceArray[];


ArraySetAsSeries(ADArray,true);
int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);

int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);

CopyBuffer(ADDef,0,0,3,ADArray);

int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
int ADPrevValue=NormalizeDouble(ADArray[1],5);

double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);         
double PrevHighValue=NormalizeDouble(PriceArray[1].high,5); 

if(ADCurrrentValue > ADPrevValue && CurrentHighValue>PrevHighValue)
{
 Comment("Strong Up Move During The Uptrend","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current high value is: ",CurrentHighValue,
 "\n","Previous high value is: ",PrevHighValue);    
} 

if(ADCurrrentValue < ADPrevValue && CurrentHighValue>PrevHighValue)
{
 Comment("Bearish Divergence","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current low value is: ",CurrentHighValue,
 "\n","Previous low value is: ",PrevHighValue);      
} 

Después compilaremos el código del asesor experto, y este aparecerá en la ventana del Navegador, en el terminal de MetaTrader 5:

AD en el Navigator 4

Clicamos dos veces para iniciar, y aparecerá la siguiente ventana:

Ventana de AD - tendencia alcista

El programa aparecerá ahora en el gráfico después de pulsar "OK":

AD - tendencia alcista - en el gráfico

Aquí tenemos un ejemplo de las señales generadas que muestra la ventana de datos con los datos actuales y anteriores:

Movimiento alcista fuerte

Datos actuales:

 Estrategia de tendencia alcista de AD - señal ascendente fuerte, datos actuales

Datos anteriores:

Estrategia de tendencia alcista de AD - señal ascendente fuerte, datos anteriores

Divergencia bajista

Datos actuales:

Estrategia de tendencia alcista de AD - señal bajista, datos actuales

Datos anteriores:

Estrategia de tendencia alcista de AD - señal bajista, datos anteriores

A continuación, le mostramos el código completo para crear dicha estrategia:

//+------------------------------------------------------------------+
//|                                        Simple AD - downtrend.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //create a string variable for signal
   string signal="";
   
   //Create two arrays for AD and price
   double ADArray[];
   MqlRates PriceArray[];
   
   //sorting the two arrays
   ArraySetAsSeries(ADArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
   
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //calculating current AD and previous values
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
   int ADPrevValue=NormalizeDouble(ADArray[1],5);
   
   double CurrentLowValue=NormalizeDouble(PriceArray[2].low,5);         
   double PrevLowValue=NormalizeDouble(PriceArray[1].low,5); 
   
   //Comparing two values and giving signal
   //Strong down move
   if(ADCurrrentValue < ADPrevValue && CurrentLowValue<PrevLowValue)
   {
      Comment("Strong Down Move During The Downtrend","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current low value is: ",CurrentLowValue,
      "\n","Previous low value is: ",PrevLowValue);      
   }
   
   //in case of divergence
   if(ADCurrrentValue > ADPrevValue && CurrentLowValue<PrevLowValue)
   {
      Comment("Bullish Divergence","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current low value is: ",CurrentLowValue,
      "\n","Previous low value is: ",PrevLowValue);      
   }  
  }
//+------------------------------------------------------------------+

Diferencias en este código:

if(ADCurrrentValue < ADPrevValue && CurrentLowValue<PrevLowValue)
{
 Comment("Strong Down Move During The Downtrend","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current low value is: ",CurrentLowValue,
 "\n","Previous low value is: ",PrevLowValue);      
}

if(ADCurrrentValue > ADPrevValue && CurrentLowValue<PrevLowValue)
{
 Comment("Bullish Divergence","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current low value is: ",CurrentLowValue,
 "\n","Previous low value is: ",PrevLowValue);      
} 

Después de realizar la compilación, el asesor experto aparecerá en la ventana del Navegador en MetaTrader 5:

 AD en el Navegador 5

Arrastramos nuestro programa desde el Navegador al gráfico y lo soltamos. Se abrirá una ventana como esta:

AD - Ventana del programa AD downtrend

El programa aparecerá ahora en el gráfico después de pulsar "OK":

Sistema AD - tendencia bajista - en el gráfico

Aquí tenemos un ejemplo de las señales generadas que muestra la ventana de datos y representa los valores actuales y anteriores:

Movimiento bajista fuerte

Datos actuales:

Estrategia AD downtrend - señal de movimiento bajista fuerte, datos actuales

Datos anteriores:

Estrategia AD downtrend - señal de movimiento bajista fuerte, datos anteriores

Divergencia alcista

Datos actuales:

Estrategia AD downtrend - señal de divergencia alcista, datos actuales

Datos anteriores:

Estrategia AD downtrend - señal de divergencia alcista, datos anteriores

\


Conclusión

En este artículo, hemos hablado del indicador de Acumulación/Distribución (AD), uno de los indicadores basados en el volumen. Hemos aprendido qué es el indicador AD, qué mide y cómo se puede calcular manualmente. También hemos visto cómo se puede utilizar este indicador con la ayuda de estrategias sencillas. Dichas estrategias se basan en el movimiento de AD, la fuerza del mismo y el rendimiento durante una tendencia alcista o bajista. Además, hemos desarrollado un esquema para cada estrategia analizada que nos ayudará a escribir un código para el sistema comercial basado en cada estrategia. Después de eso, hemos visto el desarrollo de varios sistemas comerciales: hemos creado un asesor experto en MQL5 para cada estrategia, hemos obtenido un programa que puede trabajar en la plataforma comercial MetaTrader 5, y también hemos visto ejemplos de las señales generadas. El terminal permite automatizar estas estrategias para generar señales. Esta es una gran característica, ya que la computadora trabaja para nosotros, o al menos nos ofrece información clara, precisa y rápida que nos ayuda a mejorar las decisiones comerciales y nos ahorra emociones que a veces pueden resultar perjudiciales.

Una vez más, será esencial que ponga a prueba cuidadosamente cualquier nuevo conocimiento antes de aplicarlo a su cuenta real, para asegurarse así de que se adapte a su estilo y comprensión del comercio. Al fin y al cabo, lo que funciona para otros no tiene por qué funcionar para usted. El objetivo principal de este y otros artículos de esta serie es aprender a programar estrategias simples en MQL5 usando los indicadores técnicos más populares. Esperamos que pueda aplicar lo aprendido e intentar programar por su cuenta, ya que la práctica es un factor importante en cualquier proceso de aprendizaje.

También esperamos que el artículo le resulte útil en un sentido práctico y le ayude a encontrar nuevas ideas. Si le ha gustado este artículo y lo ha encontrado útil, lea los artículos anteriores de la misma serie para aprender a desarrollar un sistema comercial basado en los indicadores técnicos más populares.