Errores, fallos, preguntas - página 214

 
Ashes:

Permítanme recordarles que el resultado se obtuvo con un simple Asesor Experto, que prácticamente no dedica tiempo a ningún análisis y no utiliza indicadores, es decir, los resultados habrían sido aún más tristes con un EA en funcionamiento.

Por favor, publique el código del EA.
 
Ashes:

Permítanme recordarles que el resultado se obtuvo con un simple Asesor Experto, que prácticamente no dedica tiempo a ningún análisis y no utiliza indicadores, es decir, los resultados habrían sido aún más tristes con un EA en funcionamiento.

Para comparar:

Ejecutar esta prueba con 10000 operaciones en una máquina Windows 7, Intel Pentium Dual-Core E5400 @ 2.70 GHz, 2038 MB (PR111) tomó 472866ms.

A la luz de lo anterior, existe cierta probabilidad de que algunos de los candidatos al Campeonato 2010 hayan sido injustamente descalificados debido a la barrera de los 15 minutos y a las peculiaridades del probador (si hubiera muchos tratos).

** - Hubo varias veces en las que el probador no pudo mostrar el gráfico de símbolos con las operaciones mostradas al final de la prueba.

No fui capaz de escribir un "simple EA" que mostrara tales resultados. Aquí está mi código:

//+------------------------------------------------------------------+
//|                                                  TimeOnDeals.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters
input int      deals=1000;
input double   lot=0.01;
uint start;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   start=GetTickCount();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   PrintFormat("deals=%d  time=%d",deals,(GetTickCount()-start));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
   return(GetTickCount()-start);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static int done_deals=0;
//---
   if(done_deals<deals)
     {
      if(Buy(lot)) done_deals++;
      else Print("Не удалось выполнить Buy, ошибка ",GetLastError());
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Buy(double v)
  {
   double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   MqlTradeRequest   m_request;         // request data
   MqlTradeResult    m_result;          // result data   
   m_request.action=TRADE_ACTION_DEAL;
   m_request.symbol      =_Symbol;
   m_request.magic       =555;
   m_request.volume      =v;
   m_request.type        =ORDER_TYPE_BUY;
   m_request.price       =price;
   m_request.sl          =0;
   m_request.tp          =0;
   m_request.deviation   =10;
   return(OrderSend(m_request,m_result));

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
bool Sell(double v)
  {
   double price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   MqlTradeRequest   m_request;         // request data
   MqlTradeResult    m_result;          // result data   
   m_request.action=TRADE_ACTION_DEAL;
   m_request.symbol      =_Symbol;
   m_request.magic       =555;
   m_request.volume      =v;
   m_request.type        =ORDER_TYPE_SELL;
   m_request.price       =price;
   m_request.sl          =0;
   m_request.tp          =0;
   m_request.deviation   =10;
   return(OrderSend(m_request,m_result));
  }
//+------------------------------------------------------------------+


Aquí están los resultados de la optimización, con la columna Resultado mostrando el tiempo de ejecución en milisegundos.


 
Rosh:

No he sido capaz de escribir un "simple EA" que muestre estos resultados. Aquí está mi código:

Aquí están los resultados de la optimización, la columna Resultado muestra el tiempo de ejecución en milisegundos.

Interesante...

Alexander:
Código EA, por favor, publique el código.

El Asesor Experto se basa en la plantilla del artículo Cómo escribir rápidamente un Asesor Experto para el Campeonato de Comercio Automatizado 2010.

La clase CExpertAdvisor se utiliza sin ningún cambio. ¿Tal vez sea un efecto secundario del uso de las clases? Los resultados de la prueba dan la impresión de que la ralentización comienza tras superar algún umbral. ¿Tal vez se trate de una tabla de transacciones de tamaño limitado, después de la cual la reasignación de memoria/recolección de basura comienza a surtir efecto?

PS. Una vez más me gustaría recordarles que el Asesor Experto utiliza la característica de la cuenta Alpari-Demo (margen cero), de lo contrario el número de operaciones puede cambiar.

Archivos adjuntos:
 
Rosh:

No he sido capaz de escribir un "simple EA" que muestre estos resultados. Aquí está mi código:

Aquí están los resultados de la optimización, la columna Resultado muestra el tiempo de ejecución en milisegundos.

¿Tampoco hay problemas con la salida a XLSX?

 
Rosh:

No he sido capaz de escribir un "simple EA" que muestre estos resultados. Aquí está mi código:

Aquí están los resultados de la optimización, la columna Resultado muestra el tiempo de ejecución en milisegundos.

Tabla - Resultado del optimizador: ¿Registro OFF? ¿Un efecto secundario de la tala de árboles?

 
Ashes:


Un EA basado en la plantilla del artículo Cómo escribir un EA rápido para el Campeonato de Comercio Automatizado 2010.

La clase CExpertAdvisor se utiliza sin ningún cambio. ¿Tal vez sea un efecto secundario del uso de las clases? Los resultados de la prueba dan la impresión de que la ralentización comienza tras superar algún umbral. ¿Tal vez se trate de una tabla de transacciones de tamaño limitado, después de la cual la reasignación de memoria/recolección de basura comienza a surtir efecto?

PS. Una vez más me gustaría recordarles que el Asesor Experto utiliza una característica de la cuenta Alpari-Demo (margen cero), de lo contrario el número de operaciones puede cambiar.

Esta clase contiene el método GetDealByOrder(ulong order)

ulong CExpertAdvisor::GetDealByOrder(ulong order) // получение тикета сделки по тикету ордера
  {
   PositionSelect(m_smb);
   HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));
   uint total=HistoryDealsTotal();
   for(uint i=0; i<total; i++)
     {
      ulong deal=HistoryDealGetTicket(i);
      if(order==HistoryDealGetInteger(deal,DEAL_ORDER))
         return(deal);                            // запомнили тикет сделки 
     }
   return(0);
  }

que se llama en cada operación. En consecuencia, cada vez se revisa todo el historial de operaciones y se produce una ralentización del tiempo de prueba que es proporcional al cuadrado del número de operaciones.

Es mejor no utilizar estas cosas en un Asesor Experto que necesita ser optimizado o probado, porque las pérdidas de tiempo son inevitables. Para estos casos es mejor sustituir estas llamadas de forma algorítmica.

 
Rosh:

Esta clase contiene el método GetDealByOrder(ulong order)

que se llama en cada transacción. En consecuencia, cada vez se busca en todo el historial de operaciones y se produce una ralentización del tiempo de prueba, proporcional al cuadrado del número de operaciones.

Es mejor que no use esas cosas en el Asesor Experto que necesita ser optimizado o probado, porque inevitablemente perderá tiempo. Para estos casos es mejor sustituir estas llamadas de forma algorítmica.

Es decir, todos los que utilizaron la plantilla del Asesor Experto están "afectados"...

¿Qué pasa con XLSX? No tiene nada que ver con el código del Asesor Experto, ¿verdad?

 
Rosh:

Esta clase contiene el método GetDealByOrder(ulong order)

 ulong CExpertAdvisor::GetDealByOrder(ulong order) // получение тикета сделки по тикету ордера
  {
   PositionSelect(m_smb);
   HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));
   uint total=HistoryDealsTotal();
   for(uint i=0; i<total; i++)
     {
      ulong deal=HistoryDealGetTicket(i);
      if(order==HistoryDealGetInteger(deal,DEAL_ORDER))
         return(deal);                            // запомнили тикет сделки
     }
   return(0);
  } 

que se llama en cada transacción. Por lo tanto, en este Asesor Experto, bajo estas condiciones especificadas, se busca todo el historial de transacciones cada vez, y el tiempo de prueba que es proporcional al cuadrado del número de transacciones, se ralentiza.

Es mejor no utilizar estas cosas en un Asesor Experto que necesita ser optimizado o probado, porque las pérdidas de tiempo son inevitables. Para estos casos es mejor sustituir estas llamadas de forma algorítmica.

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));

¿Este método busca en todo el historial, y no sólo en la parte del historial que está asociada a una posición abierta? Si no tengo más de 5 operaciones conectadas con una posición abierta, creo que es mejor usar HistorySelectByPosition que buscar en todo el historial HistorySelect(0,TimeCurrent());

P.D. CExpertAdvisor no miró

 
Konstantin83:

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));

¿Este método busca en toda la historia? ¿Y no sólo en la parte de la historia que está relacionada con una posición abierta? Si no tengo más de 5 operaciones conectadas con una posición abierta, creo que es mejor usar HistorySelectByPosition que buscar en todo el historial HistorySelect(0,TimeCurrent());

P.D. CExpertAdvisor no miró

En este caso, tenemos miles de ofertas en una posición, y todas tienen el mismo identificador de posición POSITION_IDENTIFIER. Por lo tanto, la llamada de HistorySelectByPosition en este caso es equivalente a la llamada de HistorySelect(0,TimeCurrent()), la enumeración de estos tratos lleva a una búsqueda de todos los tratos del historial.

Digamos que se hizo un ejemplo desafortunado de uso del patrón del artículo. Es como en la historia de los hombres siberianos y la motosierra japonesa.

 
Ashes:

¿Qué pasa con XLSX? ¿No tiene nada que ver con el código EA?

Este lugar se arreglará. Los desarrolladores son conscientes de ello, gracias.