testador estrategia lento com array tipo matrix

 

prezados(as),

quado uso o testador de estrategia para alguns indicadores com array tipo matrix fica bastante lento mais de 10 vezes mais lento, retirando a matrix e convertendo em uma função comum fica normal. Alguem já teve esse problema ? grato e bons trades !

exemplo https://www.mql5.com/pt/code/16806

//
double workRsi[][3];
#define _price  0
#define _change 1
#define _changa 2
//
double iRsi(double price, double period, int bars, int i, int forInstance=0)
{
   if (ArrayRange(workRsi,0)!=bars) ArrayResize(workRsi,bars);
   int z    = forInstance*3; double alpha = 1.0 /(double)period;
   //
       workRsi[i][_price+z] = price;
      if (i<period)
      {
         int k; double sum = 0; for (k=0; k<period && (i-k-1)>=0; k++) sum += MathAbs(workRsi[i-k][_price+z]-workRsi[i-k-1][_price+z]);
            workRsi[i][_change+z] = (workRsi[i][_price+z]-workRsi[0][_price+z])/MathMax(k,1);
            workRsi[i][_changa+z] =                                         sum/MathMax(k,1);
      }
      else
      {
         double change = workRsi[i][_price+z]-workRsi[i-1][_price+z];
            workRsi[i][_change+z] = workRsi[i-1][_change+z] + alpha*(        change  - workRsi[i-1][_change+z]);
            workRsi[i][_changa+z] = workRsi[i-1][_changa+z] + alpha*(MathAbs(change) - workRsi[i-1][_changa+z]);
      }
      if (workRsi[i][_changa+z] != 0)
            return(50.0*(workRsi[i][_change+z]/workRsi[i][_changa+z]+1));
      else  return(0);
}

DMI de Tushar Chande
DMI de Tushar Chande
  • www.mql5.com
Um indicador utilizado na análise técnica que determina as condições de sobrecompra e sobrevenda de um determinado ativo. Este indicador é muito semelhante ao índice de força relativa (RSI). A principal diferença entre os dois é que o RSI usa um número fixo de períodos de tempo (normalmente 14), enquanto o Índice de Impulso Dinâmico utiliza...
 
frcardim:

prezados(as),

quado uso o testador de estrategia para alguns indicadores com array tipo matrix fica bastante lento mais de 10 vezes mais lento, retirando a matrix e convertendo em uma função comum fica normal. Alguem já teve esse problema ? grato e bons trades !

exemplo https://www.mql5.com/pt/code/16806

//
double workRsi[][3];
#define _price  0
#define _change 1
#define _changa 2
//
double iRsi(double price, double period, int bars, int i, int forInstance=0)
{
   if (ArrayRange(workRsi,0)!=bars) ArrayResize(workRsi,bars);
   int z    = forInstance*3; double alpha = 1.0 /(double)period;
   //
       workRsi[i][_price+z] = price;
      if (i<period)
      {
         int k; double sum = 0; for (k=0; k<period && (i-k-1)>=0; k++) sum += MathAbs(workRsi[i-k][_price+z]-workRsi[i-k-1][_price+z]);
            workRsi[i][_change+z] = (workRsi[i][_price+z]-workRsi[0][_price+z])/MathMax(k,1);
            workRsi[i][_changa+z] =                                         sum/MathMax(k,1);
      }
      else
      {
         double change = workRsi[i][_price+z]-workRsi[i-1][_price+z];
            workRsi[i][_change+z] = workRsi[i-1][_change+z] + alpha*(        change  - workRsi[i-1][_change+z]);
            workRsi[i][_changa+z] = workRsi[i-1][_changa+z] + alpha*(MathAbs(change) - workRsi[i-1][_changa+z]);
      }
      if (workRsi[i][_changa+z] != 0)
            return(50.0*(workRsi[i][_change+z]/workRsi[i][_changa+z]+1));
      else  return(0);
}

Já. Resolvi assim >>   if (ArrayRange(workRsi,0)!=bars) ArrayResize(workRsi,bars,1000);

 
murphybr:

Já. Resolvi assim >>   if (ArrayRange(workRsi,0)!=bars) ArrayResize(workRsi,bars,1000);

Valeu Murphy ! o indicador já tem o arrayresize, eu estava chamando 2 indicadores com icustom, combinei a média com o DMI e ficou aceitavel chamando 1 só indicador, a medida que se carrega mais indicadores no EA fica mais lento, tem um artigo aqui no site que sugere incorporar o indicador no proprio EA para ficar mais rapido, mais acho isso bem mais complexo, combinar 2 indicadores em 1 para ter só um icustom é mais simples.

Tentei mudar a matrix para um indicator_calculation mais não tive paciencia, o calculation faz o resize automaticamente do array, mais pelo que lí não da para colocar uma matrix.

Razão: