Discusión sobre el artículo "Asesor Experto multiplataforma: Señales" - página 3

 
Karl Klang:

Hola Enrico,

He encontrado una manera de manejar la función Calcular ahora incluyendo una función de histéresis que parece funcionar cuando el indicador MA y el TEMA se cruzan.

Sin embargo me he encontrado con un problema con el Administrador de pedidos. Sucede cuando he ejecutado el probador de estrategia para algunos bucles durante la optimización. Para los primeros bucles funciona bien, pero después de algunos bucles se coloca una orden para cada vela.

Aquí funciona bien:


Pero aquí el Gestor de Órdenes comienza a colocar múltiples órdenes:


Cuando depuré la siguiente parte de código del COrderManager, la sentencia orders_total = OrdersTotal(); se convierte en 1 cuando funciona pero se convierte en 0 cuando falla, lo que lleva a que la condición if m_orden_max>orders_total siempre se evalúa a true.

Espero que me puedan ayudar a resolver esto.

Un saludo/
Karl

Hola Karl,

Nunca me había encontrado con este problema. El método OrdersTotal() simplemente cuenta el número de objetos COrder activos. Si hay algo mal con la estrategia codificada entonces debe ser corregido. Si no es así, entonces debe haber algún problema en la forma en que se gestionan las instancias COrder (creado / destruido) y / o cómo se cuentan. Le informaré tan pronto como encuentre este problema.

 

Hola Enrico,

Googleando en mt5 OrdersTotal() problemas revela que otros tienen problemas también. Por ejemplo probador de estrategia con esta estrategia. El conjunto de expertos también se ha subido para que pueda ejecutar el probador de estrategia con la misma entrada como lo hice.

Saludos cordiales/
Karl

How to use the OrdersTotal() correctly?
How to use the OrdersTotal() correctly?
  • 2010.09.09
  • www.mql5.com
I tried many times to check OrdersTotal(), but I found it did not work...
 
Karl Klang:

Hola Enrico,

Googleando en mt5 OrdersTotal() problemas revela que otros tienen problemas también. Por ejemplo, probador de estrategia con esta estrategia. El conjunto de expertos también se ha cargado para que pueda ejecutar el probador de estrategia con la misma entrada como lo hice.

Saludos cordiales/
Karl

Gracias por los archivos Karl. He encontrado el problema que describes.

En el archivo include principal, cambie esto (OnInit):

file.Open(savefile,FILE_READ);
if(!experts.Load(file.Handle()))
   return(INIT_FAILED);
file.Close();

por esto:

#ifdef __MQL5__
if (!(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)))
#else
if (!(IsTesting() || IsOptimization()))
#endif
{
   file.Open(savefile,FILE_READ);
   if(!experts.Load(file.Handle()))
      return(INIT_FAILED);
   file.Close();
}


Y esto (OnDeinit):

file.Open(savefile,FILE_WRITE);
experts.OnDeinit(reason,file.Handle());
file.Close();

por esto:

#ifdef __MQL5__
if (!(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)))
#else
if (!(IsTesting() || IsOptimization()))
#endif
{
  file.Open(savefile,FILE_WRITE);
  experts.OnDeinit(reason,file.Handle());
  file.Close();
}

Por alguna razón, los datos guardados de sesiones anteriores se están recargando en sesiones futuras. Por eso el problema sólo existe después del backtest inicial, a veces con alguna fuga de memoria. Basado en mis pruebas, el problema parece existir sólo en el modo de compensación, no en MT4 o en el modo de cobertura MT5. Pero avísame si sigues experimentando este problema. El código anterior impide cargar y guardar datos durante el backtesting y la optimización (pasé por alto mencionar esto mientras escribía el artículo final).

 

Además, respecto al OrdersTotal() en MT5, sólo cuenta las órdenes pendientes (no el equivalente al OrdersTotal de MT4). El código en TradeOpen para OrderManager:

bool COrderManager::TradeOpen(const string symbol,ENUM_ORDER_TYPE type,double price,bool in_points=true)
  {
   bool ret=false;
   double lotsize=0.0;
   int trades_total =TradesTotal();
   int orders_total = OrdersTotal();

utiliza el método OrdersTotal() de la clase, que no es más que un wrapper del método de COrders (también del mismo nombre). COrders extiende CArrayObj, por lo que en realidad no está utilizando la función OrdersTotal() nativa de MT5. Lo anterior también es equivalente a utilizar:

int orders_total = this.OrdersTotal();

Por otro lado, si utilizamos:

int orders_total = ::OrdersTotal();

se llama explícitamente a la función nativa de MT5. Puede que ya estés familiarizado con esto, pero por si acaso para otras personas que se encuentren con un problema similar.

 

Gracias Enrico. El problema ha desaparecido.

/Karl

 
Enrico Lambino:
#ifdef __MQL5__
if (!(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION))) // MQL4-código, no sólo MQL5.
#else
if (!(IsTesting() || IsOptimization()))
#endif
MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION) == MQLInfoInteger(MQL_TESTER)
 
fxsaber:
Ya veo. Sí, tiene razón.
 

Hola Enrico,

En el Github en iceron/MQLx, hay un aviso de cambio de m_new_signal y m_new_signal_close.

m_signal_new puede ser cambiado por el método void CSignalsBase::NewSignal(const bool value), pero no hay ningún método disponible para cambiar m_new_signal_close.

¿Podría explicarme el uso de m_new_signal y m_new_signal_close?

   if(m_invert)
     {
      CSignal::SignalInvert(m_signal_open);
      CSignal::SignalInvert(m_signal_close);
     }
   if(m_new_signal)
     {
      if(m_signal_open==m_signal_open_last)
         m_signal_open = CMD_NEUTRAL;      
     }
   if(m_new_signal_close)
     {
      if(m_signal_close==m_signal_close_last)
         m_signal_close = CMD_NEUTRAL;      
     }

Saludos cordiales/

Karl

iceron - Overview
iceron - Overview
  • github.com
Sign up for your own profile on GitHub, the best place to host code, manage projects, and build software alongside 36 million developers. Sign up
 

¿Funcionan estos métodos con su MT5Bridge?

 

¡Hola Maestros!

Tengo un grave problema con la comprensión de "Candle counting" (Primero, segundo, tercero = idx, idx++, ...) en el siguiente código de Mql Signal que pertenece a la clase SignalAC.

¿Alguien podría ayudar a penetrar en el número idx cuando se mueve en los códigos hacia abajo?

Gracias de antemano.

//+------------------------------------------------------------------+
//| "Votando" que el precio crecerá.|
//+------------------------------------------------------------------+
int CSignalAC::LongCondition(void)
  {
   int result=0;
   int idx   =StartIndex();
//--- si la primera barra analizada es "roja", no "vote" por comprar
   if(DiffAC(idx++)<0.0)
      return(result);
//--- la primera barra analizada es "verde" (el indicador no tiene objeciones a la compra)
   if(IS_PATTERN_USAGE(0))
      result=m_pattern_0;
//--- si la segunda barra analizada es "roja", no hay condición para comprar
   if(DiffAC(idx)<0.0)
      return(result);
//--- la segunda barra analizada es "verde" (la condición de compra puede cumplirse)
//--- si la segunda barra analizada es menor que cero, necesitamos analizar la tercera barra
   if(AC(idx++)<0.0)
     {
      //--- si la tercera barra analizada es "roja", no hay condición para comprar
      if(DiffAC(idx++)<0.0)
         return(result);
     }
//--- hay una condición para comprar
   if(IS_PATTERN_USAGE(1))
      result=m_pattern_1;
//--- si la barra analizada anteriormente es "roja", se acaba de cumplir la condición de compra
   if(IS_PATTERN_USAGE(2) && DiffAC(idx)<0.0)
      result=m_pattern_2;
//--- devuelve el resultado
   return(result);
  }