Aprendiendo a diseñar un sistema de trading con el indicador de Acumulación/Distribución
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:
- Definición del indicador AD
- Estrategia del indicador AD
- Esquema de la estrategia del indicador AD
- Sistema comercial del indicador AD
- 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:
- Cálculo del multiplicador del flujo de dinero = ((cierre - mínimo) - (máximo - cierre))/(máximo - mínimo)
- Cálculo del volumen de flujo de dinero = Multiplicador de flujo de dinero * volumen por periodo
- 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:
A continuación, calculamos el volumen del flujo de dinero = multiplicador de flujo de dinero * volumen por periodo. Obtenemos los siguientes datos:
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:
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
Una vez seleccionado el indicador, se abrirá una ventana para configurar los parámetros:
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:
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.
- Estrategia uno: movimiento simple de 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
- Segunda estrategia: fuerza de AD
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
- Estrategia tres: estrategia AD simple - tendencia alcista
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
- Estrategia cuatro: estrategia AD simple - tendencia bajista
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:
A continuación, desarrollaremos los esquemas para cada una de las estrategias analizadas.
- Estrategia uno: movimiento simple de AD
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:
- Segunda estrategia: fuerza de AD
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:
- Estrategia tres: estrategia AD simple - tendencia alcista
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:
- Estrategia cuatro: estrategia AD simple - tendencia bajista
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:
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:
- Creamos un array para los valores AD utilizando la función double para representar el valor en la parte fraccionaria.
double ADArray[];
- Clasificamos el array de precios a partir de los datos actuales. Para hacer esto, usaremos la función ArraySetAsSeries:
ArraySetAsSeries(ADArray,true);
- Determinamos el AD con la ayuda de la función iAD 1, para ello, crearemos la variable entera ADDef. La función iAD retornará el manejador del indicador de Acumulación/Distribución y sus parámetros (símbolo, periodo y volumen utilizado en los cálculos).
int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
- Rellenamos el array OBVArray con los valores OBVDef usando la función CopyBuffer, que retornará el número de datos copiados. Los parámetros de la función son: el manejador del indicador, el número de búfer, la hora de inicio, la hora de finalización y el búfer:
CopyBuffer(ADDef,0,0,3,ADArray);
- Calculamos el valor AD actual utilizando la función NormalizeDouble, que retornará un valor de tipo double. Para ello, crearemos también una variable entera ADValue.
int ADValue=NormalizeDouble(ADArray[0],5);
- Mostramos la señal generada en el gráfico usando la función Comment:
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:
El programa podrá iniciarse arrastrándolo y soltándolo en el gráfico. Se abrirá la ventana siguiente:
Pulsamos OK y el programa (asesor) se iniciará en el gráfico como se muestra en la figura siguiente:
A continuación podemos ver ejemplos de señales generadas por el asesor que hemos creado:
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:
- Estrategia uno: movimiento simple de AD
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:
- Hemos calculado los dos valores del AD actual y el anterior:
int ADCurrrentValue=NormalizeDouble(ADArray[0],5); int ADPrevValue=NormalizeDouble(ADArray[1],5);
- Hemos establecido las condiciones y los comentarios generados sobre esta estrategia:
- La línea AD ascendente:
if(ADCurrrentValue>ADPrevValue) { Comment("AD line is rising","\n","AD current value is: ",ADCurrrentValue, "\n","AD previous value is: ",ADPrevValue); }
- La línea AD descendente:
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:
Clicamos dos veces y se abrirá una ventana como ésta:
El programa aparecerá ahora en el gráfico después de pulsar "OK":
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:
Datos anteriores:
AD descendente
Datos actuales:
Datos anteriores:
- Segunda estrategia: fuerza de AD
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:
- Hemos determinado los valores AD máximos y mínimos utilizando las funciones ArrayMaximum y ArrayMinimum. Para ello, hemos creado las variables enteras ADMaxValue y ADMinValue. ArrayMaximum retornará el índice del elemento del array encontrado y buscará el elemento más grande. Sus parámetros son: un array numérico, el índice de inicio y el número de elementos a buscar. ArrayMinimum es similar a ArrayMaximum, pero buscará el elemento más pequeño.
int ADMax =ArrayMaximum(ADArray,1,10); int ADMin =ArrayMinimum(ADArray,1,10);
- Hemos calculado ADMaxValue y ADMinValue: para ello se crearán variables enteras:
int ADMaxValue=ADArray[ADMax]; int ADMinValue=ADArray[ADMin];
- Configuración de las condiciones de la estrategia y comentarios para cada condición.
- Valor fuerte de AD:
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); }
- Valor débil de AD:
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:
Arrastramos nuestro programa desde el Navegador al gráfico y lo soltamos. Se abrirá una ventana como esta:
El programa aparecerá ahora en el gráfico después de pulsar "OK":
Los siguientes son ejemplos de señales de este programa:
AD fuerte:
AD débil:
- Estrategia tres: estrategia AD simple - tendencia alcista
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:
- Hemos creado dos arrays para los valores AD usando una función double y dos arrays de precios utilizando la función MqlRates para almacenar la información sobre el precio, el volumen y el spread:
double ADArray[]; MqlRates PriceArray[];
- Hemos clasificado dos matrices, una para los valores AD utilizando la función ArraySetAsSeries y otra para los precios utilizando la función CopyRates para obtener los datos históricos de la estructura MqlRates (también hemos creado para ello una variable entera Data).
ArraySetAsSeries(ADArray,true); int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
- Hemos definido AD, y rellenado el array AD:
int ADDef=iAD(_Symbol,_Period,VOLUME_TICK); CopyBuffer(ADDef,0,0,3,ADArray);
- Hemos calculado el AD actual, el AD anterior, el máximo actual y el máximo anterior:
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);
- Hemos establecido las condiciones de la estrategia y los comentarios necesarios:
- Movimiento alcista fuerte
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); }
- Divergencia bajista:
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:
Clicamos dos veces para iniciar, y aparecerá la siguiente ventana:
El programa aparecerá ahora en el gráfico después de pulsar "OK":
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:
Datos anteriores:
Divergencia bajista
Datos actuales:
Datos anteriores:
- Estrategia cuatro: estrategia AD simple - tendencia bajista
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:
- Las condiciones de la estrategia usadas para mostrar los comentarios:
- Un fuerte movimiento bajista:
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); }
- Una divergencia alcista:
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:
Arrastramos nuestro programa desde el Navegador al gráfico y lo soltamos. Se abrirá una ventana como esta:
El programa aparecerá ahora en el gráfico después de pulsar "OK":
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:
Datos anteriores:
Divergencia alcista
Datos actuales:
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.
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/10993
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso