Discusión sobre el artículo "MQL5 Wizard: Cómo crear un módulo de Trailing de posiciones abiertas" - página 2

 

Gracias por su gran y útil artículo,

¿Puedo pedirle amablemente traer un ejemplo de cómo podría utilizar esta clase en la escritura de un asesor experto, mi decir es que el uso de esta clase en la plantilla de EA no EA generar ..

Gracias de nuevo,.

 

Buenas tardes. El módulo no funciona.

El log muestra que el nivel de umbral de beneficio debe ser mayor que el nivel de fijación de órdenes.

En el constructor inicializo variables que no están vacías y no son iguales a cero. ¿Por qué obtengo un error?

 //+------------------------------------------------------------------+
//|TrailingFixedPips.mqh |
//| Copyright 2009-2013, MetaQuotes Software Corp. | |
//| http://www.mql5.com
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
// descripción del asistente inicio
//+----------------------------------------------------------------------+
//| Descripción de la clase|
//| Title=Trailing con Stop Loss flotante (Fox104) | | |
//| Type=Trailing|
//| Nombre=FixedPips|
//| Clase=CTrailingFixedPips|
//| Página=|
//| Parameter=StopLevel,int,30,Stop Loss trailing level (in points) | |
//| Parámetro=ProfitLevel,int,50,Take Profit trailing level (en puntos) | |
//+----------------------------------------------------------------------+
// descripción del asistente fin
//+------------------------------------------------------------------+
//| Clase CTrailingFixedPips.|
//| Finalidad: Clase de trailing stops con nivel de stop fijo en pips. || Finalidad: Clase de trailing stops con nivel de stop fijo en pips. ||| Finalidad: Clase de trailing stops con nivel de stop fijo en pips.
//| Deriva de la clase CExpertTrailing.|
//+------------------------------------------------------------------+
class CTrailingFixedPips : public CExpertTrailing
  {
protected:
   //--- parámetros de entrada
   int               m_stop_level;
   int               m_profit_level;

public:
                     CTrailingFixedPips(void);
                    ~CTrailingFixedPips(void);
   //--- métodos de inicialización de datos protegidos
   void              StopLevel(int stop_level)     { m_stop_level=stop_level;     }
   void              ProfitLevel(int profit_level) { m_profit_level=profit_level; }
   virtual bool      ValidationSettings(void);
   //---
   virtual bool      CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp);
   virtual bool      CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp);
  };
//+------------------------------------------------------------------+
//| Constructor|
//+------------------------------------------------------------------+
void CTrailingFixedPips::CTrailingFixedPips(void)
  {
            m_stop_level = 30;
            m_profit_level = 50;
  }
//+------------------------------------------------------------------+
//| Destructor|
//+------------------------------------------------------------------+
CTrailingFixedPips::~CTrailingFixedPips(void)
  {
  }
//+------------------------------------------------------------------+
//|| Configuración de validación de datos protegidos. |||
//+------------------------------------------------------------------+
bool CTrailingFixedPips::ValidationSettings(void)
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- comprobaciones de datos iniciales
   if((m_profit_level-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit_level!=0.0)
     {
      printf(__FUNCTION__+": el nivel de beneficio umbral debe ser superior al nivel de ajuste de la orden");
      return(false);
     }
//--- ok
   return(true);
  }
//+------------------------------------------------------------------+
//| Comprobando el trailing stop y/o el beneficio de una posición larga.
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
  {
//--- comprobar
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- comprobación de parámetros 
   if(m_profit_level==0.0)  return(false);
//--- ¿Ya está en el punto de equilibrio?
   double open=position.PriceOpen();
   if(position.StopLoss()>=open) return(false);
//--- control de beneficios
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(m_symbol.Bid()-open>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+
//| Comprobación de trailing stop y/o beneficio para posición corta.
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp)
  {
//--- comprobar
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- comprobación de parámetros
   if(m_profit_level==0.0)  return(false);
//--- ¿Ya está en el punto de equilibrio?
   double open=position.PriceOpen();
   if(position.StopLoss()<=open) return(false);
//--- control de beneficios
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(open-m_symbol.Ask()>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
Fox104:

Buenas tardes. El módulo no funciona.

El log muestra que el nivel de umbral de beneficio debe ser mayor que el nivel de fijación de órdenes.

En el constructor inicializo variables que no están vacías y no son iguales a cero. ¿Por qué obtengo un error?

Por favor, formatee correctamente el código de su mensaje: Inserte el código correctamente en el foro. (Su mensaje ya ha sido corregido).
 
Andy:

Al utilizar el módulo especificado en el artículo, se generan errores en el registro del Asesor Experto mientras se carga el Asesor Experto en el gráfico:

2017.09.06 00:28:29.873 1 (EURUSD,M5) OnInit: error al inicializar los indicadores

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetPriceSeries: el cambio de timeseries está prohibido

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetOtherSeries: cambio de timeseries está prohibido

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::InitIndicators: no se comprueban los parámetros de ajuste

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpert::InitIndicators: error al inicializar los indicadores del objeto de seguimiento

2017.09.06 00:31:20.256 1 (EURUSD,M5) OnInit: error inicializando indicadores

Tal vez está fuera de fecha, ¿dónde conseguir uno nuevo o qué arreglar en esto?

Hacer un cambio en el módulo trailing "sampleTrailing.mqh":

//+------------------------------------------------------------------+
//| Compruebe los parámetros de configuración.|
//| INPUT: no.|
//| OUTPUT: true si la configuración es correcta, en caso contrario false. || OUTPUT: true si la configuración es correcta, en caso contrario false.
//| REMARK: No.|
//+------------------------------------------------------------------+
bool CSampleTrailing::ValidationSettings()
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- en caso de que el método Init no haya sido llamado
   if(m_symbol==NULL) return(false);
//--- comprobación de parámetros
   if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0)
     {
      printf(__FUNCTION__+": el nivel de beneficio umbral debe ser superior al nivel de ajuste de la orden");
      return(false);
     }
//--- ok
   return(true);
  }
 
Andy:

Cuando se utiliza el módulo especificado en el artículo, se generan errores en el registro del Asesor Experto mientras se carga el Asesor Experto en un gráfico:


Tal vez es obsoleto, ¿dónde conseguir uno nuevo o qué arreglar en esto?

Gracias por el mensaje, el artículo ha sido corregido

 
Andy:

Al abrir una posición corta y poner el stop loss habitual (no trailing) a 0 en los parámetros, el trailing stop no se pone a breakeven, pero si mueves ligeramente el stop habitual y lo pones a -1 pip como mínimo, todo funciona. En longing todo funciona normalmente. En comprobar la condición de que ya hay un breakeven (el stop es menor que el precio), inicialmente 0 en el valor del stop y no lo deja ir más allá.


Así es. Es el Stop Loss especificado el desencadenante para que ESTE módulo de arrastre funcione en el punto de equilibrio. Es decir, se asume que la posición DEBE tener un Stop Loss inicialmente.


Añadido:

el propósito de cualquier artículo es mostrar y familiarizar con enfoques para resolver algún problema. Luego, el propio usuario debe desarrollar su propio código basándose en los conocimientos adquiridos.

 
Andy:

Se debe complementar de manera que si no hay stop, el trailing es también - llenar la variable con al menos el valor de apertura.

(Recibí una notificación push para 2 de sus mensajes, pero uno de ellos no está - borrado)?


Si necesita cambiar algo - este no es el problema de este artículo. Aquí puede hacerlo usted mismo, basándose en los conocimientos adquiridos. Es decir, si usted quiere componer una asignación técnica y pensar que el artículo será reescrito en virtud de ella - no es así.

Como veo sus acciones: reescribir el módulo (un pequeño cambio) y el uso.


Añadido: Por última vez, por favor, utilice el botón "Responder". De lo contrario no voy a responder.

 
Andy:

Vale, lo escribiré yo. ¿Has borrado uno de tus mensajes (dime si es así, para que no tenga que buscarlo)?


Puedes abrir un nuevo tema, algo así como"Módulo de mantenimiento de posiciones abiertas a breakeven" - creo que un tema así será útil.

Así que sí, yo estaba editando mi mensaje y haga clic en "eliminar" por error - que es, de hecho, escribí dos mensajes y eliminado uno. Por lo tanto, el empuje llegó correctamente.