tiempo excesivo para ejecutar este función en mql5

 

Hola! esta función se ejecuta y necesita demasiado tiempo.. unos 15 segundos, cuando debería ser algo de milisegundos. Simplemente compara unas medias móviles. El problema debe tener algo que ver con que la media es para marco temporal DIARIO, porque esta misma función para marcos temporales menores, como 15M, etc. sí funciona rápidamente. En mql5 estamos creando el array con la serie temporal de las medias móviles, aunque en verdad mi función sólo necesita utilizar el primer valor del array, no uso el resto del array. ¿Existe una forma más eficiente de hacer esto para que no sea un proceso lento?. ¡¿Por qué no funciona rápida esta función?. Gracias. 

string Tipo_De_Tendencia_Muy_Largo_Plazo()
  {
   double   short_ma[];
   double   media_largo_1[];
   double   media_largo_2[];
   double   media_largo_3[];
     
   int short_ma_handler=iMA(NULL,15,per_sma_rapida,1,MODE_SMA,PRICE_CLOSE);
   int media_largo_1_handler=iMA(NULL,PERIOD_D1,10,0,MODE_SMA,PRICE_CLOSE);
   int media_largo_2_handler=iMA(NULL,PERIOD_D1,50,0,MODE_SMA,PRICE_CLOSE);
   int media_largo_3_handler=iMA(NULL,PERIOD_D1,100,0,MODE_SMA,PRICE_CLOSE);

   CopyBuffer(short_ma_handler,0,0,1,short_ma);
      CopyBuffer(media_largo_1_handler,0,0,1,media_largo_1);
      CopyBuffer(media_largo_2_handler,0,0,1,media_largo_2);
      CopyBuffer(media_largo_3_handler,0,0,1,media_largo_3);
      
      ArraySetAsSeries(short_ma,true); 
      ArraySetAsSeries(media_largo_1,true);  
      ArraySetAsSeries(media_largo_2,true);    
      ArraySetAsSeries(media_largo_3,true);

   if(short_ma[0]>media_largo_1[0] && media_largo_1[0]>media_largo_2[0] && media_largo_2[0]>media_largo_3[0])
      return "Alcista";

   if(short_ma[0]<media_largo_1[0] && media_largo_1[0]<media_largo_2[0] && media_largo_2[0] <media_largo_3[0])
      return "Bajista";

   else
      return "Lateral";
  }
 

Hola, 

Prueba estas líneas de código

#include <Indicators\Trend.mqh>
CiMA short_ma, media_largo_1, media_largo_2, media_largo_3;

int OnInit()
  {
   CrearMedias();
   return(INIT_SUCCEEDED);
  }

void OnTick()
  {
   string TipoDeTendencia = Tipo_De_Tendencia_Muy_Largo_Plazo();
...
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CrearMedias()
  {
   short_ma.Create(Symbol(), PERIOD_H1, 10, 0, MODE_SMA, 0);
   media_largo_1.Create(Symbol(), PERIOD_D1, 10, 0, MODE_SMA, 0);
   media_largo_2.Create(Symbol(), PERIOD_D1, 50, 0, MODE_SMA, 0);
   media_largo_3.Create(Symbol(), PERIOD_D1, 100, 0, MODE_SMA, 0);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string Tipo_De_Tendencia_Muy_Largo_Plazo()
  {
//Actualizamos los datos de los indicadores
   short_ma.Refresh();
   media_largo_1.Refresh();
   media_largo_2.Refresh();
   media_largo_3.Refresh();
   if(short_ma.Main(0) > media_largo_1.Main(0) &&
      media_largo_1.Main(0) > media_largo_2.Main(0) &&
      media_largo_2.Main(0) > media_largo_3.Main(0))
      return "Alcista";
   if(short_ma.Main(0) < media_largo_1.Main(0) &&
      media_largo_1.Main(0) < media_largo_2.Main(0) &&
      media_largo_2.Main(0) < media_largo_3.Main(0))
      return "Bajista";
   else
      return "Lateral";
  }
 
Antonio muchas gracias por tu respuesta. He probado tu código, y funciona bien pero sigo teniendo esos retrasos de tiempo, y el EA no corre bien. Lo he solucionado poniendo esta función en otro EA en otra gráfica, y envío el resultado por variables globales del terminal, así no ralentizo mi EA. Gracias.
Razón de la queja: