Discusión sobre el artículo "LifeHack para tráders: preparando "comida rápida" a partir de indicadores" - página 3

 
Renat Fatkhullin:

...empieza a hacer llamadas con diferentes parámetros, multiplica los indicadores, pierde todas las asas, y luego se pregunta sobre los frenos y el consumo de memoria.

Para ser honesto, no he entendido cómo se puede perder una manija, si se almacena detrás de las escenas de MetaTrader.

p.s. En general, que el autor del artículo se una a la discusión y explique algunos puntos sobre su visión de trabajar con handles de indicadores en MT5.

 
Vasiliy Sokolov:
Para ser honesto, nunca entendí cómo se puede perder un mango si se memoriza detrás de las escenas de MetaTrader.

Con este enfoque de la calidad del código, no tengo más preguntas.

 
Vasiliy Sokolov:

No está claro a qué te refieres con lo que has dicho. Por lo que tengo entendido, los hendles no se cierran en ninguna parte( no hayllamadas a IndicatorRelease ). Hay una llamada constante a funciones estándar de creación de hendles, como iMACD:

Obviamente, todo el juego aquí se basa en el hecho de que iMACD y funciones similares caché dentro de sí mismos la manija devuelta anteriormente, por lo que no debería haber ninguna recreación del indicador.


Sí, tenía una idea inicial para demostrar que en MQL5 se debe trabajar con indicadores de una manera elegante: se debe crear un handle en OnInit(), y el acceso a los datos del indicador se debe obtener a través de funciones CopyXXXX, y si se utiliza la recreación de handles al estilo MQL4, está muy mal y será un desastre: se comerá la memoria. Pero en el proceso resultó que el kernel de MQL5 es tan inteligente (obviamente hay caché interna de handles idénticos) que no permite recrear handles.

El efecto secundario es que el kernel MQL5 esta tan bien diseñado que permite que MQL5 funcione de una manera que no esta de moda.

 
Vasiliy Sokolov:

No he visto ninguna similitud.

Ambos artículos ofrecen lo mismo - escribir la variante más simple del estilo MQL4 en MQL5. Compare esto

Foro sobre Trading, Sistemas Automatizados de Trading y Prueba de Estrategias de Trading

Discusión del artículo "LifeHack para trader: cocinar comida rápida a partir de indicadores"

Vasiliy Sokolov, 2018.01.25 16:05

//+------------------------------------------------------------------+
//| Función iMACD en notación MQL4|
//| Los números de búfer son los siguientes: ||
//| MQL4 0 - MODE_MAIN, 1 - MODE_SIGNAL|
//| MQL5 0 - MAIN_LINE, 1 - SIGNAL_LINE|
//+------------------------------------------------------------------+
double   iMACD(
               string                     symbol,              // nombre del símbolo 
               ENUM_TIMEFRAMES            timeframe,           // marco temporal 
               int                        fast_ema_period,     // período para el cálculo de la media rápida 
               int                        slow_ema_period,     // período para el cálculo de la media lenta 
               int                        signal_period,       // periodo para su promedio de diferencias 
               ENUM_APPLIED_PRICE         applied_price,       // tipo de precio o asa 
               int                        buffer,              // búfer 
               int                        shift                // cambio
               )
  {
   
   double result=NaN;
//---
   int handle=iMACD(symbol,timeframe,fast_ema_period,slow_ema_period,signal_period,applied_price);
   if(handle==INVALID_HANDLE)
     {
      Print(__FUNCTION__,": INVALID_HANDLE error=",GetLastError());
      return(result);
     }
   double val[1];
   int copied=CopyBuffer(handle,buffer,shift,1,val);
   if(copied>0)
      result=val[0];
   else
      Print(__FUNCTION__,": CopyBuffer error=",GetLastError());
   return(result);
  }

y esto

double iMACDMQL4(string symbol,
                 int tf,
                 int fast_ema_period,
                 int slow_ema_period,
                 int signal_period,
                 int price,
                 int mode,
                 int shift)
  {
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);
   int handle=iMACD(symbol,timeframe,
                    fast_ema_period,slow_ema_period,
                    signal_period,applied_price);
   if(handle<0)
     {
      Print("Объект iMACD не создан: Ошибка ",GetLastError());
      return(-1);
     }
   else
      return(CopyBufferMQL4(handle,mode,shift));
  }

De hecho, es la misma cosa.

Deben estar presentes? Creo que el título del artículo (o más bien su descripción) dice claramente sólo acerca de los indicadores?

No deberían, a juzgar por el título. Pero el artículo toca el tema del trabajo con series temporales al estilo de MQL4. Y sin ella, obtenemos una solución incompleta. Casi todo el mundo utiliza "High[i]" en MQL4. Además, su implementación es fácil de encontrar.

Por desgracia, MQL no soporta funciones con un número arbitrario de parámetros, por lo que iCustom no es posible implementar "al igual que en MT4"

No creo que sea posible escribir un motor completo emulando completamente el estilo de MT4 en un solo artículo. El tema estaba claramente establecido: trabajar con indicadores en estilo MQL4 (es una pena que el título del artículo no refleje el tema, lo cual es confuso).

El estilo MQL4 sigue siendo un concepto, pero no una adhesión clara a la sintaxis.

 
Vladimir Karputov:

Si se usa la recreación de handles al estilo de MQL4, es muy incorrecto y causará problemas: se consumirá memoria.

Por eso surge la pregunta, ¿por qué implementaron un trabajo incorrecto cuando podría hacerse correctamente y al estilo de MQL4?

MQL5 no es inteligente, sólo tiene una protección infalible. De lo contrario, cualquier error accidental llevaría a consecuencias desafortunadas. Pero la protección a prueba de tontos, como muestran las mediciones de rendimiento, está diseñada de tal manera que hay un fallo en el rendimiento. Por eso es necesario trasladar la "re-creación del handle" al wrapper de MQL5, ocultándolo (una pequeña parte de las capacidades OOP) a los ojos del usuario.

 
fxsaber:

... Pero también la prueba de tontos, como las mediciones de rendimiento muestran, se hace de tal manera que hay una caída en el rendimiento ...

Sí, eso es interesante. Voy a medir la velocidad y publicar mis conclusiones aquí.

 
Vasiliy Sokolov:

Medido en el más simple de los espacios en blanco.

Nombre del expertoDescripciónRendimiento
iMACDtrabajo hendle estilo clásico MT5EURUSD,M5: 26189141 ticks, 74266 barras generadas. Entorno sincronizado en 0:00:01.045. Prueba superada en 0:00:12.121 (incluyendo preprocesamiento de ticks 0:00:01.966).
MACD MQL4 estilo EA cortoTrabajo en estilo MQL4EURUSD,M5: 26189141 ticks, 74266 barras generadas. Entorno sincronizado en 0:00:00.047. Prueba superada en 0:00:34.960 (incluyendo preprocesamiento de ticks 0:00:01.872).

La sobrecarga es de aproximadamente tres veces. Así que, sí, MetaTrader 5 toma mucho tiempo para encontrar un mango en caché.


Tuve una idea para probar esto: un EA similar a"MACD MQL4 estilo EA corto", sólo que en ella se puede abordar no dos, sino tres, cuatro, cinco indicadores .... En este contexto, "indicador" significa (usando MACD como ejemplo) un indicador con diferentes parámetros pero un símbolo cada uno.

 

He borrado mi post anterior porque me di cuenta de que MACD MQL4 estilo EA, además, accede al subsistema de gráficos:

//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double macd_main_1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MAIN_LINE,1);
   Comment("MACD, main buffer, index 1: ",DoubleToString(macd_main_1,Digits()+1));
  }

Es decir, la prueba realizada se realizó incorrectamente. Después de comentar la función Comment, el rendimiento es casi igual:

EURUSD,M5: 26189141 ticks, 74266 bars generated. Environment synchronized in 0:00:00.047. Test passed in 0:00:15.444 (including ticks preprocessing 0:00:01.872).

Conclusiones: MetaTrader 5 sigue encontrando eficazmente la caché creada anteriormente y es posible utilizar el codestyle propuesto.

fxsaber:

Pero la protección infalible, como muestran las mediciones de rendimiento, está hecha de tal manera que se produce un fallo de rendimiento. Por eso es necesario trasladar la "re-creación del handle" al wrapper MQL5, ocultándolo (una pequeña parte de las características OOP) a los ojos del usuario.

Si la última prueba se hace correctamente, resulta que el cambio a la envoltura OOP no hará nada. Las velocidades son casi iguales.
 
Vasiliy Sokolov:

MetaTrader 5 requiere bastante tiempo para encontrar un mango en caché.

No hay certeza de que un usuario pueda acelerar este proceso de forma general. Obviamente, la sobrecarga se gasta en el cálculo de la función hash.

Una variante de tal función hash indicadora en una forma general fue publicada aquí

  static string GetMyUniqueName( void )
  {
    const int handle = GetMyHandle();

    MqlParam Params[];
    ENUM_INDICATOR Type;

    const int Total = ::IndicatorParameters(handle, Type, Params);
    ::IndicatorRelease(handle);

    uchar Bytes[];

    for (int i = 1; i < Total; i++)
    {
      ::ArrayCopy(Bytes, _R(Params[i].double_value).Bytes, ::ArraySize(Bytes));
      ::ArrayCopy(Bytes, _R(Params[i].integer_value).Bytes, ::ArraySize(Bytes));
      ::ArrayCopy(Bytes, _R(Params[i].string_value).Bytes, ::ArraySize(Bytes));
    }

    return("::" + (string)::ChartID() + (string)INIT_SYNC::crc64(Bytes) + ::MQLInfoString(MQL_PROGRAM_NAME));
  }

No me importaba el rendimiento allí, pero estaba claro que cualquier entrada de función hash debe ser un array de MqlParam-values. Y esto no puede funcionar rápido teniendo en cuenta el hecho de que hay un campo de cadena lenta.

Por lo tanto, escribir un indicador universal rápido función hash mucho más rápido que lo que está incorporado en MT5 es una tarea abierta. Pero estoy categóricamente en contra de llamar a los indicadores de alguna parte. Es por eso que ni siquiera quiero entender la cuestión.


Hay otro pensamiento sobre smart MQL5. Hay un montón de Asesores Expertos, donde el mismo indicador se llama en cada barra, pero con diferentes parámetros de entrada. MQL5 "dispara" manijas innecesarias en el tiempo. Pero esta es una solución universal. Y en un Asesor Experto, el autor puede tomar esta responsabilidad sobre sí mismo, matando a las manijas por sí mismo. Es obvio que es super-despilfarro en términos de recursos computacionales y de memoria para llevar el equipaje de un centenar de asas a través de un centenar de bares. Pero no he visto EAs en el mismo kodobase que clavaran un asa de esta manera. Todo se da a la "astucia de MQL5", obligando así a los autores a no ser nada astutos.


Pero repito, los indicadores y las barras son malvados.

 
fxsaber:

No hay certeza de que un usuario pueda acelerar este proceso de forma general. Obviamente, la sobrecarga se gasta en calcular la función hash.

Una variante de dicha función hash indicadora de forma general se publicó aquí


Bueno, querías volcar mucha información al lector en un solo artículo. Pero en cuanto a tu método - es una solución de cabeza, ¿has probado otros? ¿Y comparado el rendimiento?