MQL5 Wizard: crear asesores expertos sin programar

MetaQuotes | 23 enero, 2014

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!


1. Crear un robot de trading usando MQL5 Wizard

El código fuente de los asesores expertos se genera usando el MQL5 Wizard en MetaEditor.

Las clases básicas de estrategias de trading se encuentran en la carpeta '\<client_terminal_directory>\MQL5\Include\Expert\'. Los algoritmos de clases de señales de trading listos para su uso, las clases de posiciones abiertas de arrastre y las clases de gestión de dinero y riesgo se encuentran en las subcarpetas Signal, Trailing y Money. El MQL5 Wizard analiza los archivos en estas carpetas y los utiliza para generar código del asesor experto.

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):

Figura 1. Ejecutar el MQL5 Wizard

Fig. 1. Ejecutar el MQL5 Wizard

A continuación seleccione el tipo de programa que quiere crear. En nuestro caso seleccionamos la opción (generar) "Asesor experto":

Figura 2. Seleccionar el tipo de programa

Fig. 2. Seleccionar el tipo de programa


Paso 1. Propiedades generales del asesor experto

A continuación se abre el cuadro de diálogo donde podemos establecer las propiedades generales del asesor experto:

Figura 3. Propiedades generales del Expert Advisor

Fig. 3. Propiedades generales del Expert Advisor

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).

El asesor experto tiene también los siguientes parámetros de entrada.

En el siguiente paso seleccionamos el tipo de señales de trading sobre las que operará el experto.


Paso 2. Seleccionar el módulo de señales de trading

El algoritmo de apertura y cierre de posiciones viene determinado por el módulo de las señales de trading. Los módulos de las señales de trading contienen reglas para la apertura/cierre/inversión de posiciones.

La librería estándar tiene módulos de señales de trading listas para usar:

  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.

    El tipo de señales de trading se selecciona de la lista desplegable "Nombre".

    Después de pulsar el botón "Siguiente" verá una ventana:

    Fig. 4. Selección de señales de trading del Expert Advisor

    Fig. 4. Selección de señales de trading del Expert Advisor

    Para añadir un módulo de señales de trading presione el botón "Añadir".

    Vamos a añadir señales de trading basadas en el indicador de media móvil.


    Fig. 5. Seleccionar el algoritmo de señales de trading

    Fig. 5. Seleccionar el algoritmo de señales de trading

    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.

    El módulo de señales de trading aparecerá en la lista:

    Fig. 6. Se ha añadido el módulo de señales de trading

    Fig. 6. Se ha añadido el módulo de señales de trading


    Paso 3. Seleccionar el módulo de rastreo de posiciones abiertas

    El siguiente paso es seleccionar el algoritmo de rastreo de posiciones abiertas (Trailing Stop). El uso del arrastre nos permite ahorrar el beneficio obtenido.

    La librería estándar proporciona varias formas de rastrear posiciones abiertas:

    1. CTrailingNone - Trailing Stop no se usa.
    2. CTrailingFixedPips - Trailing Stop basada en una Stop Level fija.
    3. CTrailingMA - Trailing Stop basada en la MA.
    4. CTrailingPSAR - Trailing Stop basada en el SAR parabólico.  

    En nuestro asesor experto seleccionamos "Trailing Stop basada en Stop Level":

    Figura 6. Seleccionar el algoritmo de posiciones abiertas de arrastre

    Fig. 7. Seleccionar el algoritmo de posiciones abiertas de arrastre

    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:

    Figura 7. Establecer los parámetros el algoritmo seleccionado de rastreo de posiciones abiertas

    Fig. 9. Establecer los parámetros del algoritmo seleccionado de rastreo de posiciones abiertas


    Paso 4. Seleccionar el módulo de gestión de dinero y riesgo

    En el último paso necesitamos seleccionar el sistema de gestión de dinero y riesgo que será usado en nuestro asesor experto.

    El propósito de este algoritmo es determinar el volumen de transacciones (en lotes) para las operaciones de trading y también la gestión del riesgo. Cuando el valor de pérdida excede el límite permitido (por ejemplo, 10% de las acciones) el módulo de gestión de dinero y riesgo cerrará forzosamente la posición no rentable.

    La librería estándar proporciona varias implementaciones de los algoritmos de gestión de dinero y riesgos listas para ser usadas:

    1. CMoneyFixedLot - Operar con un volumen de transacciones fijo
    2. CMoneyFixedMargin - Operar con un margen fijo.
    3. CMoneyFixedRisk - Operar con un riesgo fijo.
    4. CMoneyNone - Operar con el volumen de transacciones mínimo permitido.
    5. CMoneySizeOptimized - Operar con el volumen de transacción optimizado.

    Figura 8. Seleccionar el algoritmo de gestión de dinero y riesgo

    Fig. 9. Seleccionar el algoritmo de gestión de dinero y riesgo

    Seleccionar el algoritmo "Operar con volumen de transacciones fijo".

    El módulo que hemos seleccionado tiene dos parámetros:

    Figura 9. Establecer los parámetros el algoritmo seleccionado de gestión de dinero y riesgo

    Fig. 10. Establecer los parámetros del algoritmo seleccionado de gestión de dinero y riesgo

    Después de hacer clic en "Finalizar" aparecerá el archivo TestExpert.mq5 en la carpeta \teminal_data_filder\MQL5\Experts\. El nombre del archivo es el nombre del asesor experto especificado.


    2. Estructura del asesor experto creado usando el MQL5 Wizard

    El código fuente generado por el MQL5 Wizard es el siguiente:

    //+------------------------------------------------------------------+
    //|                                                   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 threshold value to open [0...100]
    input int                Signal_ThresholdClose         =10;           // Signal threshold value to close [0...100]
    input double             Signal_PriceLevel             =0.0;          // Price level to execute a deal
    input double             Signal_StopLevel              =50.0;         // Stop Loss level (in points)
    input double             Signal_TakeLevel              =50.0;         // Take Profit level (in points)
    input int                Signal_Expiration             =4;            // Expiration of pending orders (in bars)
    input int                Signal_MA_PeriodMA            =85;           // Moving Average(85,0,...) Period of averaging
    input int                Signal_MA_Shift               =0;            // Moving Average(85,0,...) Time shift
    input ENUM_MA_METHOD      Signal_MA_Method              =MODE_SMA;      // Moving Average(85,0,...) Method of averaging
    input ENUM_APPLIED_PRICE  Signal_MA_Applied             =PRICE_CLOSE;    // Moving Average(85,0,...) Prices series
    input double             Signal_MA_Weight              =1.0;          // Moving Average(85,0,...) Weight [0...1.0]
    //--- inputs for trailing
    input int                Trailing_FixedPips_StopLevel  =30;           // Stop Loss trailing level (in points)
    input int                Trailing_FixedPips_ProfitLevel=50;           // Take Profit trailing level (in points)
    //--- 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();
      }
    //+------------------------------------------------------------------+
    

    El código del asesor experto comprende varias secciones.

    Sección que describe las propiedades del programa:

    #property copyright "Copyright 2012, MetaQuotes Software Corp."
    #property link      "https://www.mql5.com"
    #property version   "1.00"
    

    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:

    //--- 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 threshold value to open [0...100]
    input int                Signal_ThresholdClose         =10;           // Signal threshold value to close [0...100]
    input double             Signal_PriceLevel             =0.0;          // Price level to execute a deal
    input double             Signal_StopLevel              =50.0;         // Stop Loss level (in points)
    input double             Signal_TakeLevel              =50.0;         // Take Profit level (in points)
    input int                Signal_Expiration             =4;            // Expiration of pending orders (in bars)
    input int                Signal_MA_PeriodMA            =85;           // Moving Average(85,0,...) Period of averaging
    input int                Signal_MA_Shift               =0;            // Moving Average(85,0,...) Time shift
    input ENUM_MA_METHOD      Signal_MA_Method              =MODE_SMA;     // Moving Average(85,0,...) Method of averaging
    input ENUM_APPLIED_PRICE   Signal_MA_Applied             =PRICE_CLOSE;  // Moving Average(85,0,...) Prices series
    input double             Signal_MA_Weight              =1.0;          // Moving Average(85,0,...) Weight [0...1.0]
    //--- inputs for trailing
    input int                Trailing_FixedPips_StopLevel  =30;           // Stop Loss trailing level (in points)
    input int                Trailing_FixedPips_ProfitLevel=50;           // Take Profit trailing level (in points)
    //--- inputs for money
    input double             Money_FixLot_Percent          =10.0;         // Percent
    input double             Money_FixLot_Lots             =0.1;          // Fixed volume
    

    Los primeros tres parámetros (Expert_Title, Expert_MagicNumber son Expert_EveryTick) son generales. Están siempre presentes con independencia de los algoritmos trading signals, trailing, y money and risk management seleccionados.

    El parámetro Expert_Title especifica el nombre del asesor experto, Expert_MagicNumber especifica su ID (este valor se usará en los parámetros de las solicitudes de operaciones) y el parámetro Expert_EveryTick se usa para establecer el modo de funcionamiento del asesor experto. Si Expert_EveryTick se establece en el valor verdadero, el asesor experto llamará a las funciones del controlador (comprobar las condiciones de operatividad, comprometer operaciones, rastrear posiciones abiertas) cada vez que llegue un nuevo tick para el símbolo en funcionamiento.

    Después de los parámetros generales del asesor experto vienen los parámetros de entrada para el algoritmo de señales de transacciones elegido (en nuestro caso son los parámetros usados en la clase CSignalMA).

    Hemos elegido la clase CTrailingStopFixedPips del rastreo de posiciones abiertas. Esta clase rastrea las posiciones abiertas a una distancia fija determinada por los niveles de Stop Loss y Take Profit, cuyos valores se definen en puntos digitales 2/4 "normales". Cuando el precio se mueve hacia la posición abierta a una distancia que excede el número de puntos establecido por el nivel de Trailing_FixedPips_StopLevel, el asesor experto modifica los valores de los niveles de Stop Loss y Take Profit (si Trailing_FixedPips_StopLevel > 0).  

    Los parámetros de entrada Money_FixLot_Percent y Money_FixLot_Lots corresponden a los parámetros del algoritmo con el lote de transacciones fijo implementado en la clase CMoneyFixedLot. En nuestro caso, la transacción se realizará con un volumen fijo igual al valor de Money_FixLot_Lots.

    La clase Money_FixLot_Lots también implementa el algoritmo de gestión de riesgo: si hay una pérdida (como un porcentaje de la acción actual) especificada en el parámetro Inp_Money_FixLot_Percent, la clase CMoneyFixedLot recomendará al asesor experto el cierre forzado de la posición no rentable y esto se llevará a cabo.

    A continuación, se declaran los parámetros de entrada del asesor experto del objeto ExtExpert de la clase CExpert:

    CExpert ExtExpert;
    

    Esta es la instancia de la clase de la estrategia de trading.

    Al ser una instancia de la clase CExpert, el objeto ExtExpert contiene referencias a los objetos hijos de la clase CExpertSignal (la clase básica de señales de trading), la clase CExpertMoney (la clase básica de la gestión de de dinero y riesgo) y la clase CExpertTrailing (la clase básica del rastreo de posiciones abiertas). Además, la clase CExpert contiene las instancias de las clases CExpertTrade, SSymbolInfo, CAccountInfo, CPositionInfo, COrderInfo y el contenedor CIndicators.

    Para establecer los parámetros del asesor experto tenemos que crear instancias de las clases correspondientes y especificar las referencias a los objetos creados en la clase ExtExpert.

    Vamos a ver la función OnInit de inicialización del asesor experto. Aquí inicializamos y configuramos las propiedades de la clase ExtExpert.


    1. Inicialización de la clase ExtExpert:

    //--- Initializing expert
       if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
         {
          //--- failed
          printf(__FUNCTION__+": error initializing expert");
          ExtExpert.Deinit();
          return(-1);
         }

    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

    //--- 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);
    

    La configuración de las señales de trading comprende varias etapas:

    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.

    //--- Set signal parameters
       filter0.PeriodMA(85);                        //--- Parameter was set as fixed in MQL5 Wizard
                                                       //--- (gray icon - fixed value equal to 85)
       filter0.SlowPeriod(Signal_MA_Shift);      //--- Parameter was set as input variable
                                                       //--- (blue icon - input parameter of Expert Advisor)
    

    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).


    3. Crear y configurar las propiedades del objeto de rastreo

    //--- 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);
    La configuración del objeto de rastreo también comprende varias etapas:

    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.


    4. Crear y configurar las propiedades del objeto de dinero

    //--- 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);

    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.


    5. Inicializar todos los indicadores usados en las clases

    //--- 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);

    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'.


    3. Comprobando el asesor experto creado en el probador de estrategias de MetaTrader 5

    Si están presentes todos los componentes de la librería estándar, el código del asesor experto se compila con éxito:

    Figura 10. Compilación con éxito del código fuente del Expert Advisor creado en el MQL5 Wizard

    Figura 10. Compilación con éxito del código fuente del Expert Advisor creado en el MQL5 Wizard

    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)

    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: