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

 
Rashid Umarov:

PS Corrí la muestra estándar MACD en USDJPY M30 2017.02.01-2018.01.18 "Todos los ticks" (como en el artículo) MetaQuotes-Demo.

Cómo se puede encajar en 8 segundos? Especialmente en 1 segundo?

Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading

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

fxsaber, 2018.01.26 11:06 AM.

No he hecho nada. Ejecutarlo tal cual. En los logs anteriores todos los datos a reproducir. Tu resultado debería ser completamente igual al mío en cuanto a beneficios. Y por rendimiento no muy diferente.

 
Rashid Umarov:
¿De verdad? Cuando afirme que ha encontrado un error o un problema en mi artículo por el que me pagaron dinero, sin duda lo comprobaré. Mientras tanto, no "vamos". Porque haces que parezca que estás siendo condescendiente.
 
fxsaber:

Hizo el MACD SaMple de la entrega en su configuración. ¿Y de dónde viene EURO en el balance, no es ese el punto?

Y el tiempo de prueba es todavía mucho más largo que el tuyo.

2018.01.26 13:34:10.520 Core 1  authorized (agent build 1755)
2018.01.26 13:34:10.522 Tester  EURUSD,M1 (MetaQuotes-Demo): testing of Experts\Examples\MACD\MACD Sample.ex5 from 2017.09.01 00:00 to 2018.01.26 00:00

2018.01.26 13:34:16.792 Core 1  EURUSD,M1 (MetaQuotes-Demo): generating based on real ticks
2018.01.26 13:34:16.792 Core 1  EURUSD,M1: testing of Experts\Examples\MACD\MACD Sample.ex5 from 2017.09.01 00:00 to 2018.01.26 00:00 started with inputs:
2018.01.26 13:34:16.792 Core 1    InpLots=0.1
2018.01.26 13:34:16.792 Core 1    InpTakeProfit=50
2018.01.26 13:34:16.792 Core 1    InpTrailingStop=30
2018.01.26 13:34:16.792 Core 1    InpMACDOpenLevel=3
2018.01.26 13:34:16.792 Core 1    InpMACDCloseLevel=2
2018.01.26 13:34:16.792 Core 1    InpMATrendPeriod=26


2018.01.26 13:25:46.482 Core 1  final balance 10168.90 USD
2018.01.26 13:25:46.482 Core 1  EURUSD,M1: 9753093 ticks, 147480 bars generated. Environment synchronized in 0:00:02.610. 
Test passed in 0:00:19.062 (including ticks preprocessing 0:00:02.078).
2018.01.26 13:25:46.482 Core 1  EURUSD,M1: total time from login to stop testing 0:00:21.672 (including 0:00:02.610 for history data synchronization)
2018.01.26 13:25:46.482 Core 1  600 Mb memory used including 44 Mb of history data, 256 Mb of tick data
 

En el marco de tiempo del artículo, en EURUSD,M30 y USDJPY,M30

MACD Sample One value at a time.mq5:

final balance 100180.01 USD
EURUSD,M30: 26390728 ticks, 12510 bars generated. Environment synchronized in 0:00:00.125. Test passed in 0:00:41.016 (including ticks preprocessing 0:00:02.328).
EURUSD,M30: total time from login to stop testing 0:00:41.141 (including 0:00:00.125 for history data synchronization)
756 Mb memory used including 1.88 Mb of history data, 512 Mb of tick data

final balance 99523.31 USD
USDJPY,M30: 29801706 ticks, 11837 bars generated. Environment synchronized in 0:00:00.032. Test passed in 0:01:00.937 (including ticks preprocessing 0:00:02.735).
USDJPY,M30: total time from login to stop testing 0:01:00.969 (including 0:00:00.032 for history data synchronization)
819 Mb memory used including 1.88 Mb of history data, 576 Mb of tick data


MACD Sample 4 to 5 MQL4 style.mq5:

final balance 100192.51 USD
EURUSD,M30: 26390728 ticks, 12510 bars generated. Environment synchronized in 0:00:00.140. Test passed in 0:01:37.969 (including ticks preprocessing 0:00:02.329).
EURUSD,M30: total time from login to stop testing 0:01:38.109 (including 0:00:00.140 for history data synchronization)
755 Mb memory used including 1.88 Mb of history data, 512 Mb of tick data

final balance 99550.10 USD
USDJPY,M30: 29801706 ticks, 11837 bars generated. Environment synchronized in 0:00:00.031. Test passed in 0:01:51.328 (including ticks preprocessing 0:00:02.500).
USDJPY,M30: total time from login to stop testing 0:01:51.359 (including 0:00:00.031 for history data synchronization)
819 Mb memory used including 1.88 Mb of history data, 576 Mb of tick data

El tiempo de prueba difiere dos veces. Y no es 8 o 1 segundo.

Si se comparan los saldos - sí, hay una ligera diferencia en los números, pero no es perceptible en el gráfico.

 
Vasiliy Sokolov:

De hecho, la descripción de este tema se ve aquí en un plano ligeramente distinto:

  • Ya se han escrito miles de indicadores, a los que se accede a través de iCustom con la asignación de los búferes/manejadores adecuados, etcétera, etcétera. Esta es una historia lenta y que consume muchos recursos;
  • Un indicador puede ser implementado como una función pura dentro de un Asesor Experto - en este caso el valor requerido se calculará mucho más rápido y requerirá menos memoria.

La idea es escribir algún tipo de interfaz que permita el acceso unificado a cualquier indicador personalizado , pero si el indicador se implementa como una función pura separada, la referencia se hace a esta función en lugar del manejador. Como resultado, obtenemos una buena aceleración y al mismo tiempo no perdemos el acceso a cualquier indicador arbitrario. Este es un tema interesante, yo incluso lo retomaría.

Pruébalo, es interesante ver si vale la pena. Me gustaría un enfoque de este tipo - sacamos OnCalculate del indicador, lo modificamos ligeramente con un nuevo nombre, lo añadimos al código del indicador y ahora podemos tirar de esta función como una función bibilio, pasándole parámetros del Asesor Experto. ¿Correcto?
 
Rashid Umarov:
...Me gustaría un enfoque de este tipo - tomamos OnCalculate fuera del indicador, ligeramente modificarlo bajo un nuevo nombre, añadirlo al código del indicador y ahora podemos tirar de esta función como una función bibilio, pasando parámetros desde el Asesor de Expertos a la misma. ¿Correcto?
Tenemos que pensar en la implementación. Ahora es difícil decir cómo puede ser.
 
Rashid Umarov:
Pruébalo, es interesante ver si vale la pena. Me gustaría un enfoque de este tipo - tomamos OnCalculate fuera del indicador, modificarlo ligeramente bajo un nuevo nombre, añadirlo al código del indicador y ahora podemos tirar de esta función como una función bibilio, pasando parámetros desde el Asesor de Expertos a la misma. ¿Correcto?

Hice esto para iRSIOnArray(), que no está en mql5. Funciona en el indicador. Para llamarla desde el Asesor Experto, hay que hacerlo no tan directamente.

//+------------------------------------------------------------------+
//| Índice de Fuerza Relativa en la matriz|
//+------------------------------------------------------------------+
template<typename T>
int RSIOnArray(const int rates_total,
               const int prev_calculated,
               const int begin,
               const int period,
               const T &price[],
               double &buffer_pos[],
               double &buffer_neg[],
               double &buffer_rsi[])
  {
   int   i;
   T     diff;
//--- comprobar el recuento de tarifas
   if(period<1 || rates_total-begin<period) return(0);
//--- guardar banderas as_series
   bool as_series_price=ArrayGetAsSeries(price);
   bool as_series_rsi=ArrayGetAsSeries(buffer_rsi);
   if(as_series_price)
      ArraySetAsSeries(price,false);
   if(as_series_rsi)
     {
      ArraySetAsSeries(buffer_rsi,false);
      ArraySetAsSeries(buffer_pos,false);
      ArraySetAsSeries(buffer_neg,false);
     }
//--- cálculos preliminares
   int pos=prev_calculated-1;
   if(pos<=period)
     {
      //--- los primeros valores RSIPeriod del indicador no se calculan
      buffer_rsi[0]=0.0;
      buffer_pos[0]=0.0;
      buffer_neg[0]=0.0;
      T SumP=0.0;
      T SumN=0.0;
      for(i=1; i<=period; i++)
        {
         buffer_rsi[i]=0.0;
         buffer_pos[i]=0.0;
         buffer_neg[i]=0.0;
         diff=price[i]-price[i-1];
         SumP+=(diff>0 ? diff : 0);
         SumN+=(diff<0 ?-diff : 0);
        }
      //--- calcula el primer valor visible
      buffer_pos[period]=double(SumP/period);
      buffer_neg[period]=double(SumN/period);
      
      buffer_rsi[period]=100.0-(100.0/(1.0+buffer_pos[period]/(buffer_neg[period]>0 ? buffer_neg[period] : DBL_MIN)));
      //--- preparar el valor de posición para el cálculo principal
      pos=period+1;
     }
//--- el bucle principal de cálculos
   for(i=pos;i<rates_total && !IsStopped();i++)
     {
      diff=price[i]-price[i-1];
      buffer_pos[i]=(buffer_pos[i-1]*(period-1)+(diff>0.0 ? diff : 0.0))/period;
      buffer_neg[i]=(buffer_neg[i-1]*(period-1)+(diff<0.0 ?-diff : 0.0))/period;
      buffer_rsi[i]=100.0-100.0/(1+buffer_pos[i]/(buffer_neg[i]>0 ? buffer_neg[i] : DBL_MIN));
     }
//--- restaurar banderas as_series
   if(as_series_price) ArraySetAsSeries(price,true);
   if(as_series_rsi)
     {
      ArraySetAsSeries(buffer_rsi,true);
      ArraySetAsSeries(buffer_pos,true);
      ArraySetAsSeries(buffer_neg,true);
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Ese no es el punto. EUR desde aquí


Y el tiempo de prueba sigue siendo mucho más largo que el tuyo.

2018.01.26 13:34:10.520 Core 1  authorized (agent build 1755)
2018.01.26 13:34:10.522 Tester  EURUSD,M1 (MetaQuotes-Demo): testing of Experts\Examples\MACD\MACD Sample.ex5 from 2017.09.01 00:00 to 2018.01.26 00:00

2018.01.26 13:34:16.792 Core 1  EURUSD,M1 (MetaQuotes-Demo): generating based on real ticks
2018.01.26 13:34:16.792 Core 1  EURUSD,M1: testing of Experts\Examples\MACD\MACD Sample.ex5 from 2017.09.01 00:00 to 2018.01.26 00:00 started with inputs:
2018.01.26 13:34:16.792 Core 1    InpLots=0.1
2018.01.26 13:34:16.792 Core 1    InpTakeProfit=50
2018.01.26 13:34:16.792 Core 1    InpTrailingStop=30
2018.01.26 13:34:16.792 Core 1    InpMACDOpenLevel=3
2018.01.26 13:34:16.792 Core 1    InpMACDCloseLevel=2
2018.01.26 13:34:16.792 Core 1    InpMATrendPeriod=26


2018.01.26 13:25:46.482 Core 1  final balance 10168.90 USD
2018.01.26 13:25:46.482 Core 1  EURUSD,M1: 9753093 ticks, 147480 bars generated. Environment synchronized in 0:00:02.610. 
Test passed in 0:00:19.062 (including ticks preprocessing 0:00:02.078).
2018.01.26 13:25:46.482 Core 1  EURUSD,M1: total time from login to stop testing 0:00:21.672 (including 0:00:02.610 for history data synchronization)
2018.01.26 13:25:46.482 Core 1  600 Mb memory used including 44 Mb of history data, 256 Mb of tick data

Aquí está mi registro con su configuración

EURUSD,M1 (MetaQuotes-Demo): generating based on real ticks
EURUSD,M1: testing of Experts\Examples\MACD\MACD Sample.ex5 from 2017.09.01 00:00 to 2018.01.26 00:00 started with inputs:
  InpLots=0.10
  InpTakeProfit=50
  InpTrailingStop=30
  InpMACDOpenLevel=3
  InpMACDCloseLevel=2
  InpMATrendPeriod=26

final balance 10000168.90 USD
EURUSD,M1: 9753093 ticks, 147480 bars generated. Environment synchronized in 0:00:00.031. Test passed in 0:00:06.302.
EURUSD,M1: total time from login to stop testing 0:00:06.333 (including 0:00:00.031 for history data synchronization)
571 Mb memory used including 44 Mb of history data, 256 Mb of tick data


¿Por qué es 3,5 veces más rápido para mí (almacenamiento en caché fue eliminado por la recompilación antes de backtest) - No sé. Configuración

2018.01.26 11:45:38.151 Terminal        Alpari Limited MT5 x64 build 1755 started (Alpari Limited)
2018.01.26 11:45:38.151 Terminal        Windows 7 Service Pack 1 (build 7601) x64, IE 9, Intel Core i7-2700 K  @ 3.50 GHz, Memory: 10147 / 16301 Mb, Disk: 3 / 29 Gb, GMT+2

¡Vamos a averiguar las razones! Creo que esto es muy importante. No tengo un disco duro (sólo SSD). Tal vez ese es el problema. Pero entonces es MUY malo para la MT5. La computadora es muy antigua - cinco años de edad con seguridad. Es por eso que es raro.

 
Vladimir Karputov:

Los tiempos de prueba son el doble de diferentes. Y no es 8 o 1 segundo.

Muestra las líneas de configuración del registro de inicio del Terminal.

 
fxsaber:

Por qué tengo una ejecución 3,5 veces más rápida (caché eliminada por recompilación antes del backtest) - no lo sé. Configuración

¡Averigüemos las razones! Creo que esto es muy importante. No tengo un disco duro (sólo SSD). Tal vez ese es el problema. Pero entonces es MUY malo para la MT5. La computadora es muy antigua - cinco años de edad con seguridad. Es por eso que es raro.

Aquí está mi equipo, sin SSD

MetaTrader 5 x64 build 1755 started (MetaQuotes Software Corp.)
Windows 10 (build 16299) x64, IE 11, UAC, Intel Core i7  920 @ 2.67 GHz, Memory: 6613 / 12277 Mb, Disk: 156 / 270 Gb, GMT+3

Mirado en todos los puestos - el número de garrapatas es el mismo

2018.01.26 13:25:46.482 Core 1  final balance 10168.90 USD
2018.01.26 13:25:46.482 Core 1  EURUSD,M1: 9753093  ticks, 147480 bars generated. Environment synchronized in 0:00:02.610. 
Test passed in 0:00:19.062 (including ticks preprocessing 0:00:02.078).
2018.01.26 13:25:46.482 Core 1  EURUSD,M1: total time from login to stop testing 0:00:21.672 (including 0:00:02.610 for history data synchronization)
2018.01.26 13:25:46.482 Core 1  600 Mb memory used including 44 Mb of history data, 256 Mb of tick data