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

 
Renat Fatkhullin:

...

Además, extracción ineficiente por 1 valor del indicador.

...

Todo esto es en teoría. Pero en la práctica, el 99% de los indicadores se calculan en búferes anulares FIFO: eliminar el último elemento, añadir uno nuevo, volver a calcular el indicador. Es decir, de nuevo en la práctica la adición al buffer de cálculo se hace por un elemento y el 99% de todos los cálculos en el indicador es la adición de un elemento. Por lo tanto, la idea de CopyBuffer, CopyRates, CopyXXX es bonita pero no corresponde al tema.

 
Renat Fatkhullin:

...

Horror duro con fugas de mango (¿por qué cerrar el mango del indicador?) y la sobrecarga increíble (tratando de recrear el indicador, cayendo dentro del gestor de indicadores). Y bastante gente lo copiará sin mirar y sin entender.

...

No está claro lo que querías decir. Por lo que tengo entendido, los manejadores no se cierran en ningún sitio( no hayllamadas a IndicatorRelease ). Hay una llamada constante a funciones estándar de creación de hendle, como iMACD:

//+------------------------------------------------------------------+
//| 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);
  }

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

 
Vasiliy Sokolov:

Todo esto es en teoría. Pero en la práctica, el 99% de los indicadores son cálculos en búferes de anillo FIFO: borrar el último elemento, añadir uno nuevo, recalcular el indicador. Es decir, de nuevo en la práctica la adición al buffer de cálculo se hace por un elemento y el 99% de todos los cálculos en el indicador es la adición de un elemento. Por lo tanto, la idea de CopyBuffer, CopyRates, CopyXXX es hermosa pero no corresponde al tema.

Esto es si escribes los manejadores de ultima mirada mas simples y primitivos. Pero en cuanto des un paso al lado y empieces a controlar 2 o más puntos, verás inmediatamente la diferencia y el efecto.

En general, por supuesto, es extraño escuchar que las funciones CopyXXX supuestamente no están en el tema.

Usted debe tratar muy duro para decir tales cosas acerca de las funciones básicas de acceso al entorno de mercado.


Y también - no es por nada que los indicadores se les da el 100% de toda la historia para los cálculos:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
Esto es para demostrar que no hay "99% en el búfer de anillo". El acceso masivo al historial, no a los últimos valores individuales, es muy necesario.
 
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 se basa en el hecho de que iMACD y funciones similares caché de la manija devuelta anteriormente dentro de sí mismos, por lo que no debería haber ninguna recreación del indicador.

Todo el juego está construido sobre hack y completa indiferencia por el control de las manijas.

Otro trader toma este código, no presta atención a la asignación de handles, comienza a hacer llamadas con diferentes parámetros, multiplica indicadores, pierde todos los handles, y luego se sorprende por los frenos y el consumo de memoria.

Ya se sabe de quién es la culpa.

 
fxsaber:

El artículo es un pequeño extracto de otro.

No he visto ninguna analogía.

fxsaber:

No se ha hecho nada para que funcione eficientemente. No hay almacenamiento en caché de los indicadores y series de tiempo.

Realmente hay espacio para la optimización aquí. La introducción de almacenamiento en caché sería una muy buena idea.

fxsaber:

High[i], Low[i], etc. faltan.

¿Deberían 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?

fxsaber:

No iCustom.

Desafortunadamente, MQL no soporta funciones con un número arbitrario de parámetros, por lo que no es posible implementar iCustom "como en MT4".

fxsaber:

Era de esperar ver algo completamente diferente. Por otra parte, ¿cuál es el punto de comida rápida en EAs, si ni siquiera huele en las fuentes de todos modos?

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

 
Renat Fatkhullin:

...

Esto es para demostrar que no hay "99% en el búfer de anillo". Son los accesos masivos a la historia, no los últimos valores individuales, los que son muy necesarios.

Los hay y se utilizan un poco más a menudo que constantemente. Simplemente no hay medios especiales y los desarrolladores tienen que crear bucles anidados. Abra cualquier indicador con doble anidado for's: felicitaciones, el búfer de anillo se ha encontrado. He aquí un ejemplo de su cálculo supereficiente del indicador IMF:

//+------------------------------------------------------------------+
//| Calcular IMF por volumen a partir del argumento |
//+------------------------------------------------------------------+
void CalculateMFI(const int nPosition,
                  const int nRatesCount,
                  const double &HiBuffer[],
                  const double &LoBuffer[],
                  const double &ClBuffer[],
                  const long &VolBuffer[],
                  const datetime &time[])
  {
   for(int i=nPosition;i<nRatesCount && !IsStopped();i++)
     {
      double dPositiveMF=0.0;
      double dNegativeMF=0.0;
      double dCurrentTP=TypicalPrice(HiBuffer[i],LoBuffer[i],ClBuffer[i]);
      if(time[i] == D'2016.05.23')
         int dbg = 4;
      for(int j=1;j<=ExtMFIPeriod;j++)
        {
         int    index=i-j;
         double dPreviousTP=TypicalPrice(HiBuffer[index],LoBuffer[index],ClBuffer[index]);
         if(dCurrentTP>dPreviousTP)
            dPositiveMF+=VolBuffer[index+1]*dCurrentTP;
         if(dCurrentTP<dPreviousTP)
            dNegativeMF+=VolBuffer[index+1]*dCurrentTP;
         dCurrentTP = dPreviousTP;
        }
      if(dNegativeMF!=0.0) ExtMFIBuffer[i]=100.0-100.0/(1+dPositiveMF/dNegativeMF);
      else                 ExtMFIBuffer[i]=100.0;
     }
  }

Bueno, es obvio que la velocidad de cálculo de este indicador depende del periodo de promediación, y no debería ser así. Y hay un montón de ejemplos de este tipo, algunos escritos por el propio MQ, y dices que no hay ring buffer.

 
Vasiliy Sokolov:

Los hay y se utilizan un poco más a menudo que siempre. Lo que ocurre es que no hay herramientas especiales y los desarrolladores tienen que crear bucles anidados. Abra cualquier indicador con doble for anidado: enhorabuena, se ha encontrado el búfer anular. He aquí un ejemplo de su cálculo supereficiente del indicador IMF:

Bueno, es obvio que la velocidad de cálculo de este indicador depende del periodo de promediación, y no debería ser así. Y hay un montón de ejemplos de este tipo, algunos escritos por el propio MQ, y dices que no hay ring buffers.

No existen en el 99% de los casos. Y en el 90% de los casos no hay ring buffers y en el 50% de los casos no hay ring buffers. Pero hay un 100% de volumen de datos iniciales (para toda la profundidad de la historia) en los parámetros OnCalculate.

Y ni siquiera se trata de calcular indicadores, sino de utilizar tanto los resultados de los indicadores como el acceso a los datos de partida. El acceso se requiere a escala masiva, no una sola.

Intentas presentar la situación de tal manera que "todo el mercado de análisis está representado por el último valor del indicador" y "CopyXXXX no corresponde al ámbito temático".

Usted se esfuerza por esbozar.

 
Renat Fatkhullin:

...

Y ni siquiera se trata de calcular indicadores, sino de utilizar tanto los resultados de los indicadores como el acceso a los datos originales. El acceso es necesario a escala masiva, no individual.

...

Por favor, preste atención a la solicitud #1923700. Hay algunos problemas con el acceso frecuente a grandes cantidades de datos.

Hace mucho tiempo que no hay comentarios y preguntas para proporcionar información adicional para ayudar a averiguar la razón de este resultado.

 
Renat Fatkhullin:

Otro trader toma este código, no presta atención a la asignación de handles, comienza a hacer llamadas con diferentes parámetros, multiplica los indicadores, pierde todos los handles, y luego se sorprende por los frenos y el consumo de memoria.

Del mismo modo, este otro trader puede empezar a hacer llamadas a iHandles estándar con diferentes parámetros. Si los parámetros son diferentes, se crearán indicadores diferentes, independientemente de si trabaja con el handle directamente o utiliza MQL4-Style.

 
Renat Fatkhullin:

Te estás esforzando mucho por esbozar.

Y esto es una vergüenza.

Y ni siquiera se trata de calcular indicadores, sino de usarlos como resultados de indicadores.

Sí.

Renat Fatkhullin:

...

De todos modos, no voy a discutir, ya que no tiene sentido. Sería interesante recopilar estadísticas sobre el uso de las funciones Copy***. Cuántos elementos copian los usuarios por término medio mostraría mucho.