Escolar Documentos
Profissional Documentos
Cultura Documentos
Introducción
Cuando creamos sistemas de trading automatizados es necesario escribir algoritmos para analizar la situación
del mercado y generar señales de trading, algoritmos de arrastre de nuestras posiciones abiertas y sistemas
para gestionar el dinero y el riesgo.
Una vez que se ha escrito el código de los módulos, la tarea más difícil es ensamblar todas las partes y
depurar el código fuente del robot de trading. Aquí, el papel principal lo juega la arquitectura de la
interacción de los módulos: si su construcción es deficiente, la mayor parte del tiempo se empleará en
encontrar y corregir errores, y si sustituimos el algoritmo de cualquier módulo nos llevará a reescribir todo el
código fuente.
El uso del enfoque orientado a objeto en MQL5 elimina considerablemente la tarea de escribir y probar los
sistemas de trading automatizados.
MetaQuotes Software Corp. ha desarrollado clases para implementar estrategias de trading. Ahora puede
generar código de asesores expertos de forma automática directamente en MetaEditor seleccionando las
señales de trading necesarias (actualmente hay 20 de ellas), los módulos Trailing (4) y Money Management (5).
Combinando estos módulos podemos obtener muchas variantes de sistemas de trading listos para ser usados.
Puede usar también sus propias clases con la implementación de estos módulos. Créelos por sí mismos o
pídalos a través del servicio Trabajos.
En este artículo vamos a ver la generación automática de código fuente de asesores expertos usando el MQL5
Wizard. ¡Y no habrá que programar nada!
Para ejecutar el MQL5 Wizard necesita hacer clic en el botón "Nuevo" en la barra de herramientas o
seleccionar "Nuevo" en el menú "Archivo" (o simplemente pulsar Ctrl+N):
A continuación seleccione el tipo de programa que quiere crear. En nuestro caso seleccionamos la opción
(generar) "Asesor experto":
Fig. 2. Seleccionar el tipo de programa
Especificamos el nombre de nuestro asesor experto, el nombre del autor y el enlace a nuestro sitio web en los
campos "Nombre", "Autor" y "Enlace" (respectivamente).
En el siguiente paso seleccionamos el tipo de señales de trading sobre las que operará el experto.
1. CSignalAC - el módulo de señales basado en los modelos de mercado del indicador oscilador acelerador.
2. CSignalAMA - el módulo de señales basado en los modelos de mercado del indicador media móvil
adaptativa.
3. CSignalAO - el módulo de señales basado en los modelos de mercado del indicador oscilador
impresionante.
4. CSignalBearsPower - el módulo de señales basado en los modelos de mercado del oscilador poder de
osos.
5. CSignalBullsPower - el módulo de señales basado en los modelos de mercado del oscilador poder de
toros.
6. CSignalCCI - el módulo de señales basado en los modelos de mercado del oscilador índice de canal de
producto.
7. CSignalDeM - el módulo de señales basado en los modelos de mercado del oscilador DeMarker.
8. CSignalDEMA - el módulo de señales basado en los modelos de mercado del indicador media móvil doble
exponencial.
9. CSignalEnvelopes - el módulo de señales basado en los modelos de mercado del indicador Envelopes.
10. CSignalFrAMA - el módulo de señales basado en los modelos de mercado del indicador media móvil
adaptativa fractal.
11. CSignalITF - módulo de filtración de señales por tiempo.
12. CSignalMACD - el módulo de señales basado en los modelos de mercado del oscilador MACD.
13. CSignalMA - el módulo de señales basado en los modelos de mercado del indicador media móvil.
14. CSignalSAR - el módulo de señales basado en los modelos de mercado del indicador SAR parabólico.
15. CSignalRSI - el módulo de señales basado en los modelos de mercado del oscilador índice de resistencia
relativa.
16. CSignalRVI - el módulo de señales basado en los modelos de mercado del oscilador índice de vigor
relativo.
17. CSignalStoch - el módulo de señales basado en los modelos de mercado del oscilador estocástico.
18. CSignalTRIX - el módulo de señales basado en los modelos de mercado del oscilador media exponencial
triple.
19. CSignalTEMA - el módulo de señales basado en los modelos de mercado del indicador media móvil
exponencial triple.
20. CSignalWPR - el módulo de señales basado en los modelos de mercado del oscilador rango porcentual de
Williams.
Cada módulo de señales de trading tiene sus propios parámetros. Puede usar los valores por defecto.
Hay dos formas de crear los parámetros. Puede cambiar entre ellas haciendo doble clic con el botón
izquierdo del ratón en el icono del parámetro. Si el parámetro tiene el icono resaltado éste estará
disponible como la variable de entrada del asesor experto. Dichos parámetros pueden usarse
posteriormente para la optimización del experto en el probador de estrategias. Si el parámetro tiene el
icono gris tendrá un valor fijo que no podrá modificarse en las propiedades del asesor experto.
Este tipo de arrastre tiene dos parámetros: StopLevel y ProfitLevel (en puntos para cotizaciones con 2 y 4
dígitos después de la coma) que serán usados para rastrear posiciones abiertas:
Fig. 9. Establecer los parámetros del algoritmo seleccionado de rastreo de posiciones abiertas
//+------------------------------------------------------------------+
//| TestExpert.mq5 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Include |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalMA.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingFixedPips.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Inputs |
//+------------------------------------------------------------------+
//--- inputs for expert
input string Expert_Title ="TestExpert"; // Document name
ulong Expert_MagicNumber =23689; //
bool Expert_EveryTick =false; //
//--- inputs for main signal
input int Signal_ThresholdOpen =10; // Signal thresho
input int Signal_ThresholdClose =10; // Signal thresho
input double Signal_PriceLevel =0.0; // Price level to
input double Signal_StopLevel =50.0; // Stop Loss leve
input double Signal_TakeLevel =50.0; // Take Profit le
input int Signal_Expiration =4; // Expiration of
input int Signal_MA_PeriodMA =85; // Moving Average
input int Signal_MA_Shift =0; // Moving Average
input ENUM_MA_METHOD Signal_MA_Method =MODE_SMA; // Moving Avera
input ENUM_APPLIED_PRICE Signal_MA_Applied =PRICE_CLOSE; // Moving Aver
input double Signal_MA_Weight =1.0; // Moving Average
//--- inputs for trailing
input int Trailing_FixedPips_StopLevel =30; // Stop Loss trai
input int Trailing_FixedPips_ProfitLevel=50; // Take Profit tr
//--- inputs for money
input double Money_FixLot_Percent =10.0; // Percent
input double Money_FixLot_Lots =0.1; // Fixed volume
//+------------------------------------------------------------------+
//| Global expert object |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Initializing expert
if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
{
//--- failed
printf(__FUNCTION__+": error initializing expert");
ExtExpert.Deinit();
return(-1);
}
//--- Creating signal
CExpertSignal *signal=new CExpertSignal;
if(signal==NULL)
{
//--- failed
printf(__FUNCTION__+": error creating signal");
ExtExpert.Deinit();
return(-2);
}
//---
ExtExpert.InitSignal(signal);
signal.ThresholdOpen(Signal_ThresholdOpen);
signal.ThresholdClose(Signal_ThresholdClose);
signal.PriceLevel(Signal_PriceLevel);
signal.StopLevel(Signal_StopLevel);
signal.TakeLevel(Signal_TakeLevel);
signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalMA
CSignalMA *filter0=new CSignalMA;
if(filter0==NULL)
{
//--- failed
printf(__FUNCTION__+": error creating filter0");
ExtExpert.Deinit();
return(-3);
}
signal.AddFilter(filter0);
//--- Set filter parameters
filter0.PeriodMA(Signal_MA_PeriodMA);
filter0.Shift(Signal_MA_Shift);
filter0.Method(Signal_MA_Method);
filter0.Applied(Signal_MA_Applied);
filter0.Weight(Signal_MA_Weight);
//--- Creation of trailing object
CTrailingFixedPips *trailing=new CTrailingFixedPips;
if(trailing==NULL)
{
//--- failed
printf(__FUNCTION__+": error creating trailing");
ExtExpert.Deinit();
return(-4);
}
//--- Add trailing to expert (will be deleted automatically))
if(!ExtExpert.InitTrailing(trailing))
{
//--- failed
printf(__FUNCTION__+": error initializing trailing");
ExtExpert.Deinit();
return(-5);
}
//--- Set trailing parameters
trailing.StopLevel(Trailing_FixedPips_StopLevel);
trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);
//--- Creation of money object
CMoneyFixedLot *money=new CMoneyFixedLot;
if(money==NULL)
{
//--- failed
printf(__FUNCTION__+": error creating money");
ExtExpert.Deinit();
return(-6);
}
//--- Add money to expert (will be deleted automatically))
if(!ExtExpert.InitMoney(money))
{
//--- failed
printf(__FUNCTION__+": error initializing money");
ExtExpert.Deinit();
return(-7);
}
//--- Set money parameters
money.Percent(Money_FixLot_Percent);
money.Lots(Money_FixLot_Lots);
//--- Check all trading objects parameters
if(!ExtExpert.ValidationSettings())
{
//--- failed
ExtExpert.Deinit();
return(-8);
}
//--- Tuning of all necessary indicators
if(!ExtExpert.InitIndicators())
{
//--- failed
printf(__FUNCTION__+": error initializing indicators");
ExtExpert.Deinit();
return(-9);
}
//--- ok
return(0);
}
//+------------------------------------------------------------------+
//| Deinitialization function of the expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+
//| "Tick" event handler function |
//+------------------------------------------------------------------+
void OnTick()
{
ExtExpert.OnTick();
}
//+------------------------------------------------------------------+
//| "Trade" event handler function |
//+------------------------------------------------------------------+
void OnTrade()
{
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| "Timer" event handler function |
//+------------------------------------------------------------------+
void OnTimer()
{
ExtExpert.OnTimer();
}
//+------------------------------------------------------------------+
Archivos incluidos:
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalMA.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingFixedPips.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedLot.mqh>
El código de la clase CExpert (su instancia se usa en el asesor experto) se encuentra en el archivo Expert.mqh.
El archivo SignalMA.mqh contiene el código fuente de la clase de señales de trading seleccionada -
CSignalMA. El archivo TrailingFixedPips.mqh contiene el código fuente de la clase del algoritmo del rastreo de
posiciones abiertas - CTrailingFixedPips. La gestión de dinero y riesgo será implementada por la clase
CMoneyFixedLot contenida en el archivo MoneyFixedLot.mqh.
A continuación vienen los parámetros de entrada del asesor experto:
CExpert ExtExpert;
El objeto ExtExpert es inicializado usando el método Init. Aquí establecemos el símbolo, el periodo de tiempo,
el flag del método que llama en cada tick, el ID del asesor experto y también creamos e inicializamos los
objetos privados de las clases (en esta etapa las clases CExpertSignal, CExpertMoney y CExpertTrailing como
las señales, rastreo y objetos de gestión de dinero).
Si el objeto ExtExpert no se inicializa con éxito, el asesor experto finalizará devolviendo el código -1.
2. Crear y configurar las propiedades del objeto Señal
Si el objeto ExtExpert no se inicializa con éxito, el asesor experto finalizará devolviendo un código (entre -2 y
-3) que depende del paso en el que haya ocurrido el error.
Dependiendo de la forma en que se especifiquen los parámetros en el MQL5 Wizard, se genera el código
apropiado.
Si el parámetro es fijo y su valor no difiere del valor por defecto, no se escribirá en el código generado. En
tal caso se usará el valor por defecto del parámetro (especificado en la clase correspondiente).
Si el objeto de rastreo no se inicializa con éxito, el asesor experto finalizará devolviendo un código (entre -4 y
-5) que depende del paso en el que haya ocurrido el error.
La configuración del objeto de gestión de dinero y riesgo también comprende varias etapas:
Si el objeto de dinero no se inicializa con éxito, el asesor experto finalizará devolviendo un código (entre -6 y
-7) que depende del paso en el que haya ocurrido el error.
Después de crear e inicializar objetos de señales de trading, rastreo y gestión de dinero, se llama al método
ValidationSettings() del objeto ExtExpert. Después de esto, se llama al método InitIndicators() del objeto
ExtExpert. Esto inicializa los indicadores usados en los objetos de la señal, rastreo y dinero.
El control de los eventos OnDeinit, OnTick, OnTrade y OnTimer se realiza llamando a los métodos adecuados
de la clase ExtExpert.
Si quiere conocer los detalles de la implementación de los métodos CExpert, puede ver el código fuente del
indicador que se encuentra en '\<client_terminal_directory>\MQL5\Include\Expert\expert.mqh'.
El asesor experto resultante operará de acuerdo con los algoritmos elegidos de las señales de trading, rastreo
de posiciones abiertas y gestión de dinero y riesgo.
Puede comprobar el funcionamiento de su sistema de trading recién creado usando el probador de estrategias
del terminal de cliente de MetaTrader 5. En la figura 11 puede ver los resultados de la prueba sobre los datos
históricos con los ajustes por defecto (EURUSD, H1, 2010.01.01-2011.06.01):
Figura 11. Resultados de la prueba del Expert Advisor sobre los datos históricos (EURUSD, H1)
El mejor conjunto de parámetros del asesor experto puede obtenerse después de la optimización en el
probador de estrategias de MetaTrader 5.
Conclusión
El uso de las clases de estrategias de trading facilita considerablemente la creación y la prueba de sus ideas
de trading. Ahora puede construirse todo el código fuente del asesor experto directamente en MetaEditor
usando su MQL5 Wizard en base a los módulos de la librería estándar lista para ser usada, empleándolos en sus
propios módulos.
Si no quiere o no puede escribir sus propios módulos de señales de trading, siempre puede beneficiarse del
servicio trabajos y encargar todo un robot de trading o solo los módulos que necesite. Este enfoque
proporciona beneficios adicionales:
Los costes de desarrollo de módulos separados deben ser inferiores al coste del asesor experto al
completo.
El módulo resultante puede reutilizarse para crear tanto un asesor experto autónomo como una familia
completa de robots de trading (basados en este módulo) usando el MQL5 Wizard.
El módulo adquirido debe cumplir estrictamente los requisitos del MQL5 Wizard, y esto proporciona un
control adicional sobre la calidad del código.