Problema con Indicador que consume mucha memoria

Comparte y analiza indicadores para la plataforma creada por MetaQuotes.

Problema con Indicador que consume mucha memoria

Notapor MF1Forex » 03 Oct 2014, 22:51

Hola amigos!
Tengo un gran problema con este indicador que me consume mucha memoria RAM.
Poniéndolo una vez en la plantilla consume de 8 a 10Mb por minuto, que se va acumulando hasta que no se cierra la plataforma MT4.

No es mucho, pero como el indicador lo pongo varias veces y en diferentes plantillas, al final me quedo sin RAM en 1 Hora.

Mi programador dice que es por culpa de la matriz que hace cálculos muy complejos y no hay solución.
O sea, que no se puede hacer que el indicador consuma cero.

Hemos probado que calcule al Close de la vela en lugar de al tick, pero Metatrader parece que lo interpreta de igual forma al tick.
Lo que pasa es que a cada tick, acumula carga en memoria que se va acumulando sin parar hasta que no se reinicia el indicador o Metatrader.

Si álguien tiene alguna idea, será de gran ayuda ya que tenía el proyecto de una plantilla compleja con este indicador y no la voy a poder acabar por culpa de este contratiempo.

Si hay que pagar algo, no hay problema si dais con la solución. Pero la solución es que consuma cero o casi cero.
Pongo el indicador y una plantilla como ejemplo, para que veais que consume mucha memoria RAM.

Gracias y espero que me echeis una mano.
Adjuntos
Dibujo.JPG
trend.mq4
(2.31 KiB) 458 veces
Trend-Ram.tpl
(2.43 KiB) 447 veces
Avatar de Usuario
MF1Forex
 
Mensajes: 1078
Registrado: 02 Dic 2013, 10:54
Ubicación: Cyberdyne Systems
Karma: 13

Re: Problema con Indicador que consume mucha memoria

Notapor Andrest » 04 Oct 2014, 13:09

Muy buenas MF1 prueba con esta versión, a mi nunca me dio problemas, aunque no llegue a probarlo mucho y menos con periodos tan grandes.

Podrías también mirar de configurar el máximo de barras en graficos y eso del metatrader en 2400 que es lo justo que necesitas o 3000 barras. Eso esta en Herramientas > Opciones > Graficos "max barras en historial" y "max. barras en grafico"

Espero te sea de ayuda.

Un saludo!

Super_Trend2.mq4
(5.96 KiB) 459 veces
Super_Trend2.ex4
(6.93 KiB) 445 veces
“No sirve para nada proclamar la verdad en economía o recomendar cosas útiles. Es la mejor manera de hacerse enemigos” A. Kostolany
“El optimismo es el enemigo del comprador racional” Warren Buffet
...
Avatar de Usuario
Andrest
 
Mensajes: 960
Registrado: 23 Ene 2014, 19:24
Karma: 31

Re: Problema con Indicador que consume mucha memoria

Notapor MF1Forex » 04 Oct 2014, 21:30

Gracias Andrest!
Este indicador que me adjuntas es para marcar tendencias haciendo cortes en la gráfica.
El interés que tengo por el indicador "trend" que he subido, es mas por donde pasa la línea en su efecto "Moving Average" que por los colores que marca.

A ver si alguno que sepa programar puede hacer algo... como lo de poner el cálculo en el close de la vela, de alguna manera que el motor del indicador no lo almacene al tick en memoria, o algún truco para reiniciar el indicador o resetearlo cada 5 minutos, ya que si lo actualizo entrando en el y dando en aceptar, descarga toda la memoria acumulada sin que se note nada en pantalla.

Ya se que es jodío... pero lo necessitooo! :shocking:

Eso que parece la mar de sencillo.
Pongo el código aqui, a ver si le podeis echar un vistazo:

Código: Seleccionar todo
#property copyright "Limited Maintenance Trading"
#property link      "http://www.lmt-forex-forula.com"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Red

extern int period = 1500;
extern int method = 3;
extern int price = 0;
double g_ibuf_88[];
double g_ibuf_92[];
double g_ibuf_96[];

int init() {
   IndicatorBuffers(3);
   SetIndexBuffer(0, g_ibuf_88);
   SetIndexBuffer(1, g_ibuf_92);
   SetIndexBuffer(2, g_ibuf_96);
   ArraySetAsSeries(g_ibuf_96, TRUE);
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);
   IndicatorShortName("Slope Direction Line(" + period + ")");
   return (0);
}

int deinit() {
   return (0);
}

double WMA(int ai_0, int a_period_4) {
   return (iMA(NULL, 0, a_period_4, 0, method, price, ai_0));
}

int start() {
   double lda_16[];
   double lda_20[];
   int l_ind_counted_0 = IndicatorCounted();
   if (l_ind_counted_0 < 0) return (-1);
   int li_4 = 0;
   int l_period_8 = MathSqrt(period);
   int li_12 = Bars - l_ind_counted_0 + period + 1;
   if (li_12 > Bars) li_12 = Bars;
   ArrayResize(lda_16, li_12);
   ArraySetAsSeries(lda_16, TRUE);
   ArrayResize(lda_20, li_12);
   ArraySetAsSeries(lda_20, TRUE);
   for (li_4 = 0; li_4 < li_12; li_4++) lda_16[li_4] = 2.0 * WMA(li_4, period / 2) - WMA(li_4, period);
   for (li_4 = 0; li_4 < li_12 - period; li_4++) g_ibuf_96[li_4] = iMAOnArray(lda_16, 0, l_period_8, 0, method, li_4);
   for (li_4 = li_12 - period; li_4 >= 0; li_4--) {
      lda_20[li_4] = lda_20[li_4 + 1];
      if (g_ibuf_96[li_4] > g_ibuf_96[li_4 + 1]) lda_20[li_4] = 1;
      if (g_ibuf_96[li_4] < g_ibuf_96[li_4 + 1]) lda_20[li_4] = -1;
      if (lda_20[li_4] > 0.0) {
         g_ibuf_88[li_4] = g_ibuf_96[li_4];
         if (lda_20[li_4 + 1] < 0.0) g_ibuf_88[li_4 + 1] = g_ibuf_96[li_4 + 1];
         g_ibuf_92[li_4] = EMPTY_VALUE;
      } else {
         if (lda_20[li_4] < 0.0) {
            g_ibuf_92[li_4] = g_ibuf_96[li_4];
            if (lda_20[li_4 + 1] > 0.0) g_ibuf_92[li_4 + 1] = g_ibuf_96[li_4 + 1];
            g_ibuf_88[li_4] = EMPTY_VALUE;
         }
      }
   }
   return (0);
}
Avatar de Usuario
MF1Forex
 
Mensajes: 1078
Registrado: 02 Dic 2013, 10:54
Ubicación: Cyberdyne Systems
Karma: 13

Re: Problema con Indicador que consume mucha memoria

Notapor FXWizard » 06 Oct 2014, 10:58

Hola MF1Forex, se me ocurre una idea: si te fijas estás usando 2.500 períodos lo cual es una barbaridad de datos para hacer cálculos. Lo que puedes hacer es incrementar el timeframe (pasar a 5 o 15 minutos) y reducir el período en esa proporción, suele ser una buena aproximación y te ahorraría bastante memoria. Pruébalo y me dices.

Saludos,
FXWizard
Avatar de Usuario
FXWizard
 
Mensajes: 8493
Registrado: 12 Feb 2008, 15:17
Karma: 35

Re: Problema con Indicador que consume mucha memoria

Notapor MF1Forex » 07 Oct 2014, 18:27

FXWizard escribió:Hola MF1Forex, se me ocurre una idea: si te fijas estás usando 2.500 períodos lo cual es una barbaridad de datos para hacer cálculos. Lo que puedes hacer es incrementar el timeframe (pasar a 5 o 15 minutos) y reducir el período en esa proporción, suele ser una buena aproximación y te ahorraría bastante memoria. Pruébalo y me dices.

Saludos,
FXWizard

Eso tambien es una solución para economizar memoria.

Al final resulta que lo de hacerlo al close de la vela si que funciona y se ahorra mucha memoria, porque ya no calcula al tick. Lo que pueden ser 100 veces menos de carga según como, y aqui si que se nota en TF mas altos.
No es un indicador óptimo porque sigue acumulando datos a medida que corre, pero ahora es aceptable.

En un indicador para trabajar en no mas de 80 periodos, que es para lo que está diseñado. Si se sale de esa línea, da estos problemas.
Gracias a todos y un saludo. ;)
Avatar de Usuario
MF1Forex
 
Mensajes: 1078
Registrado: 02 Dic 2013, 10:54
Ubicación: Cyberdyne Systems
Karma: 13


Volver a Indicadores

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados