Discusión sobre el artículo "Sistemas de trading simples usando indicadores semáforo"

 

Artículo publicado Sistemas de trading simples usando indicadores semáforo:

Si examinamos en profundidad cualquier sistema de trading complejo veremos que está basado en un conjunto de simples señales de trading. Por tanto, no es necesario que los programadores con menos experiencia comiencen a escribir complejos algorítmicos inmediatamente. Este artículo proporciona un ejemplo de un sistema de trading que utiliza indicadores semáforo para realizar las transacciones.

Fig.4. Señal de trading para realizar una transacción usando un indicador de tendencia de semáforo Heiken_Ashi_Smoothed

Autor: Nikolay Kositsin

 
El artículo es muy claro.
Una pequeña observación en el camino - hay un error tipográfico mecánico en el fragmento de código dado en el ejemplo, que fue copiado-pegado:
//---- Declaración de variables locales
   double TrendVelue[2];
 

He compilado algunas señales y reiniciar, como "Candles_SmoothedSignal.mqh" (.. MQL5\Include\Expert\MySignals\Candles_SmoothedSignal.mqh), pero MetaEditor no puede verlo para hacer un Asesor Experto en el Asistente.

¿Cómo puedo solucionarlo?

 

¡Gracias por esta explicación tan excelente y completa ...!


daveM

 

He descargado y desempaquetado todo como se indica en las instrucciones, pero el probador da un error en todos los sistemas:

tester se detuvo porque OnInit falló

CExpert::ValidationSettings: error parámetros dinero

CMoneyFixedLot::ValidationSettings: la cantidad del lote debe estar en el rango de 1.000000 a 1000000.000000

Por favor, dime lo que ajustar.

 

¡Hola!

Estoy intentando añadir el módulo de señales de trading ASCtrendSignal (ubicado en el archivo comprimido mysignals.zip) creado en base al indicador ASCtrend (ubicado en el archivo comprimido indicators.zip) al MQL5 Wizard, pero nada funciona. Coloco el módulo de señales de trading ASCtrendSignal en Include\Expert\Signal, y coloco el indicador ASCtrend en el paquete Indicators, todo parece correcto, pero el módulo persistentemente no quiere mostrarse en el MQL5 Wizard. Aquí está el código del módulo de señales de trading ASCtrendSignal:

//+------------------------------------------------------------------+
//|ASCtrendSignal.mqh
//|Derechos de autor © 2011, Nikolay Kositsin || 
//|Khabarovsk, farria@mail.redcom.ru | 
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Nikolay Kositsin".
#property link      "farria@mail.redcom.ru"
//+------------------------------------------------------------------+
//| Archivos incluidos|
//+------------------------------------------------------------------+
#property tester_indicator "ASCtrend.ex5"
#include <Expert\ExpertSignal.mqh>
//--- descripción del asistente inicio
//+------------------------------------------------------------------+ 
//| Declaración de constantes|
//+------------------------------------------------------------------+ 
#define  OPEN_LONG     80  // La constante para devolver la orden de compra al Asesor Experto
#define  OPEN_SHORT    80  // La constante para devolver la orden de venta al Asesor Experto
#define  CLOSE_LONG    40  // La constante para devolver la orden de cerrar una posición larga al Asesor Experto
#define  CLOSE_SHORT   40  // La constante para devolver la orden de cerrar una posición corta al Asesor Experto
#define  REVERSE_LONG  100 // La constante para devolver la orden de invertir una posición larga al Asesor Experto
#define  REVERSE_SHORT 100 // La constante para devolver la orden de invertir una posición corta al Asesor Experto
#define  NO_SIGNAL      0  // La constante para devolver la ausencia de señal al Asesor Experto
//+----------------------------------------------------------------------+
//| Descripción de la clase|
//| Title=Las señales basadas en el indicador ASCtrend ||
//| Type=SignalAdvanced.|
//| Nombre=ASCtrend|
//| Class=CASCtrendSignal|
//| Página=|
//| Parameter=BuyPosOpen,bool,true,Permiso para comprar ||
//| Parameter=SellPosOpen,bool,true,Permiso para vender ||
//| Parameter=BuyPosClose,bool,true,Permiso para salir de una posición larga |
//| Parameter=SellPosClose,bool,true,Permiso para salir de una posición corta |
//| Parameter=Ind_Timeframe,ENUM_TIMEFRAMES,PERIOD_H4,Timeframe |
//| Parámetro=RISK,int,4,Nivel de riesgo|
//| Parameter=SignalBar,uint,1,Indice de la barra para la señal de entrada ||
//+----------------------------------------------------------------------+
//--- descripción del asistente fin
//+----------------------------------------------------------------------+
//| Clase CASCtrendSignal.|
//| Propósito: Clase de generador de señales de comercio basado en |
//| ASCtrend indicator values http://www.mql5.com/ru/code/491/.&nbsp;         |
//| Deriva de la clase CExpertSignal.
//+----------------------------------------------------------------------+
class CASCtrendSignal : public CExpertSignal
  {
protected:
   CiCustom          m_indicator;      // el objeto para acceder a los valores ASCtrend

   //--- parámetros ajustados
   bool              m_BuyPosOpen;       // permiso para comprar
   bool              m_SellPosOpen;      // autorización de venta
   bool              m_BuyPosClose;      // permiso para salir de una posición larga
   bool              m_SellPosClose;     // permiso para salir de una posición corta
   ENUM_TIMEFRAMES   m_Ind_Timeframe;    // Plazo del indicador ASCtrend
   uint              m_RISK;             // Nivel de riesgo
   uint              m_SignalBar;        // índice de barra para la señal de entrada

public:
                     CASCtrendSignal();

   //--- métodos de configuración de parámetros ajustables
   void               BuyPosOpen(bool value)                  { m_BuyPosOpen=value;       }
   void               SellPosOpen(bool value)                 { m_SellPosOpen=value;      }
   void               BuyPosClose(bool value)                 { m_BuyPosClose=value;      }
   void               SellPosClose(bool value)                { m_SellPosClose=value;     }
   void               Ind_Timeframe(ENUM_TIMEFRAMES value)    { m_Ind_Timeframe=value;    }
   void               RISK(uint value)                        { m_RISK=value;             }
   void               SignalBar(uint value)                   { m_SignalBar=value;        }

   //--- método de validación de parámetros ajustables
   virtual bool      ValidationSettings();
   //--- método de validación de parámetros ajustables
   virtual bool      InitIndicators(CIndicators *indicators); // inicialización de los indicadores
   //--- método de generación de señales de entrada al mercado
   virtual int       LongCondition();
   virtual int       ShortCondition();

   bool              InitASCtrend(CIndicators *indicators);   // Método de inicialización del indicador ASCtrend

protected:

  };
//+------------------------------------------------------------------+
//|Constructor de CASCtrendSignal.|
//| INPUT: no.|
//| SALIDA: no.|
//|| OBSERVACIÓN: no.|
//+------------------------------------------------------------------+
void CASCtrendSignal::CASCtrendSignal()
  {
//--- configuración de los parámetros por defecto
   m_BuyPosOpen=true;
   m_SellPosOpen=true;
   m_BuyPosClose=true;
   m_SellPosClose=true;
   
//--- parámetros de entrada del indicador
   m_Ind_Timeframe=PERIOD_H4;
   m_RISK=4;
//--- 
   m_SignalBar=1;
   m_used_series=USE_SERIES_OPEN+USE_SERIES_HIGH+USE_SERIES_LOW+USE_SERIES_CLOSE;
  }
//+------------------------------------------------------------------+
//| Comprobación de parámetros ajustables.|
//| INPUT: no.|
//| OUTPUT: true si la configuración es válida, false - si no lo es. |||
//|| OBSERVACIÓN: no.|
//+------------------------------------------------------------------+
bool CASCtrendSignal::ValidationSettings()
  {
//--- comprobación de parámetros
   if(m_RISK<=0)
     {
      printf(__FUNCTION__+": Risk level must be above zero");
      return(false);
     }

//--- completado con éxito
   return(true);
  }
//+------------------------------------------------------------------+
//| Inicialización de indicadores y series temporales.
//| INPUT: indicadores - puntero a una colección de objetos ||
//| de indicadores y series temporales.|
//| OUTPUT: true - en caso de éxito, de lo contrario - false. || OUTPUT: true - en caso de éxito, de lo contrario - false. |||
//|| OBSERVACIÓN: no.|
//+------------------------------------------------------------------+
bool CASCtrendSignal::InitIndicators(CIndicators *indicators)
  {
//--- comprobación del puntero
   if(indicators==NULL) return(false);

//--- inicialización del indicador 
   if(!InitASCtrend(indicators)) return(false);

//--- completado con éxito
   return(true);
  }
//+------------------------------------------------------------------+
//| Inicialización del indicador ASCtrend.|
//| INPUT: indicadores - puntero a una colección de objetos ||
//| de indicadores y series temporales.|
//| OUTPUT: true - en caso de éxito, de lo contrario - false. || OUTPUT: true - en caso de éxito, de lo contrario - false. |||
//|| OBSERVACIÓN: no.|
//+------------------------------------------------------------------+
bool CASCtrendSignal::InitASCtrend(CIndicators *indicators)
  {
//--- comprobación del puntero
   if(indicators==NULL) return(false);

//--- añadir un objeto a la colección
   if(!indicators.Add(GetPointer(m_indicator)))
     {
      printf(__FUNCTION__+": error of adding the object");
      return(false);
     }

//--- configuración de los parámetros del indicador
   MqlParam parameters[2];
   
   parameters[0].type=TYPE_STRING;
   parameters[0].string_value="ASCtrend.ex5";
   
   parameters[1].type=TYPE_INT;
   parameters[1].integer_value=m_RISK;

//--- inicialización del objeto 
   if(!m_indicator.Create(m_symbol.Name(),m_Ind_Timeframe,IND_CUSTOM,2,parameters))
     {
      printf(__FUNCTION__+": object initialization error");
      return(false);
     }
     
//--- número de buffers
   if(!m_indicator.NumBuffers(2)) return(false);
   
//--- Indicador ASCtrend inicializado con éxito
   return(true);
  }
//+------------------------------------------------------------------+
//| Comprobación de las condiciones para la apertura de una posición larga y |
//| y cerrando una corta|
//| INPUT:no|
//| SALIDA: Peso del voto de 0 a 100|
//|| OBSERVACIÓN: no.|
//+------------------------------------------------------------------+
int CASCtrendSignal::LongCondition()
  {
//--- la señal de compra está determinada por el buffer 1 del indicador ASCtrend
   double Signal=m_indicator.GetData(1,m_SignalBar);

//--- obteniendo una señal de negociación 
   if(Signal && Signal!=EMPTY_VALUE)
     {
      if(m_BuyPosOpen)
        {
         if(m_SellPosClose) return(REVERSE_SHORT);
         else return(OPEN_LONG);
        }
      else
        {
         if(m_SellPosClose) return(CLOSE_SHORT);
        }
     }

//--- buscando señales para cerrar una posición corta
   if(!m_SellPosClose) return(NO_SIGNAL);

   int Bars_=Bars(m_symbol.Name(),m_Ind_Timeframe);

   for(int bar=int(m_SignalBar); bar<Bars_; bar++)
     {
      Signal=m_indicator.GetData(0,bar);
      if(Signal && Signal!=EMPTY_VALUE) return(NO_SIGNAL);

      Signal=m_indicator.GetData(1,bar);
      if(Signal && Signal!=EMPTY_VALUE) return(CLOSE_SHORT);
     }

//--- no hay señal de negociación
   return(NO_SIGNAL);
  }
//+------------------------------------------------------------------+
//| Comprobación de las condiciones para la apertura de una posición corta y |
//| cerrando una larga|
//| INPUT:no|
//| SALIDA: Peso del voto de 0 a 100|
//|| OBSERVACIÓN: no.|
//+------------------------------------------------------------------+
int CASCtrendSignal::ShortCondition()
  {
//--- la señal de venta está determinada por el buffer 0 del indicador ASCtrend
   double Signal=m_indicator.GetData(0,m_SignalBar);
   
//--- obteniendo una señal de negociación
   if(Signal && Signal!=EMPTY_VALUE)
     {
      if(m_SellPosOpen)
        {
         if(m_BuyPosClose) return(REVERSE_LONG);
         else return(OPEN_SHORT);
        }
      else
        {
         if(m_BuyPosClose) return(CLOSE_LONG);
        }
     }

//--- buscando señales para cerrar una posición larga
   if(!m_BuyPosClose) return(NO_SIGNAL);

   int Bars_=Bars(m_symbol.Name(),m_Ind_Timeframe); // Здесь код исправлен с учетом подсказки от Владимира Карпутова: Symbol() заменен на m_symbol.Name()
   for(int bar=int(m_SignalBar); bar<Bars_; bar++)
     {
      Signal=m_indicator.GetData(1,bar);
      if(Signal && Signal!=EMPTY_VALUE) return(NO_SIGNAL);

      Signal=m_indicator.GetData(0,bar);
      if(Signal && Signal!=EMPTY_VALUE) return(CLOSE_LONG);
     }

//--- no hay señal de negociación 
   return(NO_SIGNAL);
  }
//+------------------------------------------------------------------+

¿Puede decirme cuál puede ser el problema?

Saludos, Vladimir

 
MrBrooklin:

¡Hola!

Estoy intentando añadir el módulo de señales de trading ASCtrendSignal (ubicado en el archivo comprimido mysignals.zip) creado en base al indicador ASCtrend (ubicado en el archivo comprimido indicators.zip) al MQL5 Wizard, pero nada funciona. Coloco el módulo de señales de trading ASCtrendSignal en Include\Expert\Signal, y coloco el indicador ASCtrend en el paquete Indicators, todo parece correcto, pero el módulo persistentemente no quiere mostrarse en el MQL5 Wizard. Aquí está el código del módulo de señal de comercio ASCtrendSignal:

¿Pueden decirme cual puede ser el problema?

Saludos, Vladimir

Me gustaría añadir que este mismo problema se produce con otros módulos de señales comerciales escritas sobre la base de indicadores. Al parecer, tienen el mismo problema. Por favor, ayuda en la solución de estos problemas.

Saludos, Vladimir.

P.D. Algunos indicadores que descomprimí del archivo comprimido indicators. zip están instalados en el terminal y funcionan normalmente.

 

Lo que cuenta es el orden:

// descripción del asistente inicio
//+----------------------------------------------------------------------+
//| Descripción de la clase|
//| Title=Las señales basadas en el indicador ASCtrend ||
//| Type=SignalAdvanced.|
//| Nombre=ASCtrend|
//| Class=CASCtrendSignal|
//| Página=|
//| Parameter=BuyPosOpen,bool,true,Permiso para comprar ||
//| Parameter=SellPosOpen,bool,true,Permiso para vender ||
//| Parameter=BuyPosClose,bool,true,Permiso para salir de una posición larga |
//| Parameter=SellPosClose,bool,true,Permiso para salir de una posición corta |
//| Parameter=Ind_Timeframe,ENUM_TIMEFRAMES,PERIOD_H4,Timeframe |
//| Parámetro=RISK,int,4,Nivel de riesgo|
//| Parameter=SignalBar,uint,1,Indice de la barra para la señal de entrada ||
//+----------------------------------------------------------------------+
// descripción del asistente fin

no

//--- wizard description start
//--- wizard description end

y entre el inicio y el final sólo un bloque de servicio - sin variables ni sustituciones de macros.


Así es como el módulo debe comenzar

//+------------------------------------------------------------------+
//|ASCtrendSignal.mqh
//|Derechos de autor © 2011, Nikolay Kositsin ||
//|Khabarovsk, farria@mail.redcom.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Nikolay Kositsin".
#property link      "farria@mail.redcom.ru"
//+------------------------------------------------------------------+
//| Archivos incluidos|
//+------------------------------------------------------------------+
//#property tester_indicator "ASCtrend.ex5"
#include <Expert\ExpertSignal.mqh>
// descripción del asistente inicio
//+----------------------------------------------------------------------+
//| Descripción de la clase|
//| Title=Las señales basadas en el indicador ASCtrend ||
//| Type=SignalAdvanced.|
//| Nombre=ASCtrend|
//| Class=CASCtrendSignal|
//| Página=|
//| Parameter=BuyPosOpen,bool,true,Permiso para comprar ||
//| Parameter=SellPosOpen,bool,true,Permiso para vender ||
//| Parameter=BuyPosClose,bool,true,Permiso para salir de una posición larga |
//| Parameter=SellPosClose,bool,true,Permiso para salir de una posición corta |
//| Parameter=Ind_Timeframe,ENUM_TIMEFRAMES,PERIOD_H4,Timeframe |
//| Parámetro=RISK,int,4,Nivel de riesgo|
//| Parameter=SignalBar,uint,1,Indice de la barra para la señal de entrada ||
//+----------------------------------------------------------------------+
// descripción del asistente fin
//+------------------------------------------------------------------+
//| Declaración de constantes|
//+------------------------------------------------------------------+
#define  OPEN_LONG     80  // La constante para devolver la orden de compra al Asesor Experto
#define  OPEN_SHORT    80  // La constante para devolver la orden de venta al Asesor Experto
#define  CLOSE_LONG    40  // La constante para devolver la orden de cerrar una posición larga al Asesor Experto
#define  CLOSE_SHORT   40  // La constante para devolver la orden de cerrar una posición corta al Asesor Experto
#define  REVERSE_LONG  100 // La constante para devolver la orden de invertir una posición larga al Asesor Experto
#define  REVERSE_SHORT 100 // La constante para devolver la orden de invertir una posición corta al Asesor Experto
#define  NO_SIGNAL      0  // La constante para devolver la ausencia de señal al Asesor Experto
//+----------------------------------------------------------------------+
//| Clase CASCtrendSignal.|
//| Propósito: Clase de generador de señales de comercio basado en |
//| ASCtrend indicator values http://www.mql5.com/ru/code/491/.&nbsp;         |
//| Deriva de la clase CExpertSignal.
//+----------------------------------------------------------------------+
class CASCtrendSignal : public CExpertSignal
  {

recargar MetaEditor después de hacer ediciones

 
Vladimir Karputov:

Lo que cuenta es el orden:

no

y entre el inicio y el final sólo un bloque de servicio - sin variables ni sustituciones de macros.


Así es como debe empezar un módulo:

recargar MetaEditor después de hacer ediciones

¡Gracias, Vladimir!

Todo ha funcionado.

Saludos, Vladimir.

 

Foro sobre negociación, sistemas automatizados de negociación y prueba de estrategias de negociación

Discusión del artículo "Sistemas sencillos de trading utilizando indicadores semáforos"

Vladimir Karputov, 2019.10.30 08:50

El orden es importante:

 // descripción del asistente inicio
//+----------------------------------------------------------------------+
//| Descripción de la clase|
//| Title=Las señales basadas en el indicador ASCtrend ||
//| Type=SignalAdvanced|
//| Nombre=ASCtrend|
//| Class=CASCtrendSignal|
//| Página=|
//| Parameter=BuyPosOpen,bool,true,Permiso para comprar ||
//| Parameter=SellPosOpen,bool,true,Permiso para vender ||
//| Parameter=BuyPosClose,bool,true,Permiso para salir de una posición larga |
//| Parameter=SellPosClose,bool,true,Permiso para salir de una posición corta |
//| Parameter=Ind_Timeframe,ENUM_TIMEFRAMES,PERIOD_H4,Timeframe |
//| Parámetro=RISK,int,4,Nivel de riesgo|
//| Parameter=SignalBar,uint,1,Indice de la barra para la señal de entrada ||
//+----------------------------------------------------------------------+
// descripción del asistente fin 

pero no

 //--- wizard description start
//--- wizard description end 

y entre el inicio y el final sólo el bloque de servicio - sin variables y sustituciones de macros.


Este es el comienzo que debe tener el módulo:

 //+------------------------------------------------------------------+
//|ASCtrendSignal.mqh
//|Copyright © 2011, Nikolay Kositsin ||
//|Khabarovsk, farria@mail.redcom.ru |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2011, Nikolay Kositsin"
#property  link        "farria@mail.redcom.ru"
//+------------------------------------------------------------------+
//| Archivos incluidos|
//+------------------------------------------------------------------+
//#property tester_indicator "ASCtrend.ex5"
#include  <Expert\ExpertSignal.mqh>
// descripción del asistente inicio
//+----------------------------------------------------------------------+
//| Descripción de la clase|
//| Title=Las señales basadas en el indicador ASCtrend ||
//| Type=SignalAdvanced|
//| Nombre=ASCtrend|
//| Class=CASCtrendSignal|
//| Página=|
//| Parameter=BuyPosOpen,bool,true,Permiso para comprar ||
//| Parameter=SellPosOpen,bool,true,Permiso para vender ||
//| Parameter=BuyPosClose,bool,true,Permiso para salir de una posición larga |
//| Parameter=SellPosClose,bool,true,Permiso para salir de una posición corta |
//| Parameter=Ind_Timeframe,ENUM_TIMEFRAMES,PERIOD_H4,Timeframe |
//| Parámetro=RISK,int,4,Nivel de riesgo|
//| Parameter=SignalBar,uint,1,Indice de la barra para la señal de entrada ||
//+----------------------------------------------------------------------+
// descripción del asistente fin
//+------------------------------------------------------------------+
//| Declaración de constantes|
//+------------------------------------------------------------------+
#define  OPEN_LONG     80    // La constante para devolver la orden de compra al Asesor Experto
#define  OPEN_SHORT     80    // La constante para devolver la orden de venta al Asesor Experto
#define  CLOSE_LONG     40    // La constante para devolver la orden de cerrar una posición larga al Asesor Experto
#define  CLOSE_SHORT   40    // La constante para devolver la orden de cerrar una posición corta al Asesor Experto
#define  REVERSE_LONG   100 // La constante para devolver la orden de invertir una posición larga al Asesor Experto
#define  REVERSE_SHORT 100 // La constante para devolver la orden de invertir una posición corta al Asesor Experto
#define  NO_SIGNAL       0    // La constante para devolver la ausencia de señal al Asesor Experto
//+----------------------------------------------------------------------+
//| Clase CASCtrendSignal.|
//| Propósito: Clase de generador de señales de comercio basado en |
//| ASCtrend indicator values http://www.mql5.com/ru/code/491/.&nbsp;         |
//| Deriva de la clase CExpertSignal.|
//+----------------------------------------------------------------------+
class CASCtrendSignal : public CExpertSignal
  {

reiniciar el MetaEditor después de hacer cambios