OnDeinit en los indicadores - página 2

 
eevviill:

No, no es así. Apago el terminal normalmente.

Si se pone Deinit en Init, tampoco funciona.

Sólo ayudó la función de eliminación de objetos personalizada.

Bueno, si no se borra, quién sabe lo que has hecho ahí :)

 
keekkenen:

Bueno, si no lo quita, quién sabe lo que le has hecho :)

Tiene sentido. Pero si simplemente borro el indicador del gráfico, las zonas se borran. Cuando apago el terminal, no lo hacen. Si uso la función en el init que borra zonas (es la misma función en el deinit).

Tengo entendido que deinit funciona para todos. ¿Y cuándo debe activarse al cerrar o abrir el terminal?

 
int deinit()
  {

deinit2();

return(0);
}

//////////////////////

void deinit2()

{

  for(int i=ObjectsTotal()-1;i>=0;i--)

  {

  if(StringFind(ObjectName(i),Highest_vol_zones_name)!=-1)

  ObjectDelete(ObjectName(i));

  }

 

}
 
eevviill:

Tiene sentido. Pero si simplemente quito el indicador del gráfico, las zonas se eliminan. No cuando el terminal está apagado. Sólo si pongo mi propia función para borrar zonas en el init (la misma función en el deinit).

Tengo entendido que deinit funciona para todos. Pero, ¿cuándo debería funcionar cuando el terminal está cerrado o abierto?

Sí, funciona cuando el terminal está cerrado...

¿quizás tienes algún tipo de lógica desde hace mucho tiempo?

en el sentido de que en el momento del apagado el indicador calcula algo de forma extraña y el terminal lo espera todo mal y/o interrumpe, que OnDeinit no funciona?

Creo que el camino hacia el servicio de asistencia...

 
keekkenen:

sí, al cerrar el terminal funciona...

¿tal vez tenga algún tipo de lógica de juego larga?

en el sentido de que en el momento de apagar el indicador realiza algún cálculo raro y el terminal lo espera todo mal y/o interrumpe, que OnDeinit no funciona ?

Creo que el camino hacia el servicio de asistencia...

Si te funciona, entonces está bien. Voy a echar un vistazo a la mía.
 

Nada ha cambiado y se ha añadido más.

Indicador de amortiguación. Operación Abrió la carta- colocó el indicador M1- cerró el terminal- abrió en un par de minutos. El resultado está en las capturas de pantalla.

Y esto a pesar de que también escribí en el código

//////////////////////////////////////////////////////////////////
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[])
  {
    //new bar
if (Time[0] != prevtime) 
{
 ArrayInitialize(body_up,EMPTY_VALUE);
ArrayInitialize(body_down,EMPTY_VALUE);
ArrayInitialize(shadow_up,EMPTY_VALUE);
ArrayInitialize(shadow_down,EMPTY_VALUE);
  ArrayInitialize(yell_body_up,EMPTY_VALUE);
ArrayInitialize(yell_body_down,EMPTY_VALUE);
ArrayInitialize(yell_shadow_up,EMPTY_VALUE);
ArrayInitialize(yell_shadow_down,EMPTY_VALUE);


prevtime = Time[0];
}

 

Desarrolladores, ¿van a solucionar el problema?

He aquí un indicador para ti. Prueba lo que hice en el post anterior.

Abrimos la carta- colocamos el indicador M1- cerramos el terminal- lo abrimos después de un par de minutos.

Archivos adjuntos:
 
eevviill:

Desarrolladores, ¿van a solucionar el problema?

He aquí un indicador para ti. Prueba lo que hice en el post anterior.

Abrimos la carta- colocamos el indicador M1- cerramos el terminal- lo abrimos después de un par de minutos.

La situación con su indicador se ha resuelto.

La cuestión es que el indicador se calcula no sólo con la llegada de los ticks, sino también con el primer dibujo y con la llegada de la historia perdida.

1. Llega un nuevo tick - el indicador se calcula.

2. Llega el historial que falta, que tapa el hueco entre los últimos datos del último inicio del terminal y el último tick. El indicador se calcula. ¡Pero al mismo tiempo no hay ninguna condición de barra nueva!

Para resolver este problema hay que comprobar el número de barras. Aproximadamente así

   if(Time[0]!=prevtime || Bars!=prevbars)
     {
      ArrayInitialize(body_up,EMPTY_VALUE);
      ArrayInitialize(body_down,EMPTY_VALUE);
      ArrayInitialize(shadow_up,EMPTY_VALUE);
      ArrayInitialize(shadow_down,EMPTY_VALUE);
      ArrayInitialize(yell_body_up,EMPTY_VALUE);
      ArrayInitialize(yell_body_down,EMPTY_VALUE);
      ArrayInitialize(yell_shadow_up,EMPTY_VALUE);
      ArrayInitialize(yell_shadow_down,EMPTY_VALUE);

      prevtime=Time[0];
      prevbars=Bars;
     }
 
stringo:

La situación con su indicador se ha resuelto.

La cuestión es que el indicador se calcula no sólo sobre la llegada de los ticks, sino también sobre el primer dibujo y sobre la llegada de la historia que falta.

1. Llega un nuevo tick - el indicador se calcula.

2. Llega el historial que falta, que tapa el hueco entre los últimos datos del último inicio del terminal y el último tick. El indicador se calcula. ¡Pero al mismo tiempo no hay ninguna condición de barra nueva!

Para resolver este problema hay que comprobar el número de barras. Así

Gracias.

Pero no es sólo en mi indicador. Pensé que desde tu lado resolverías este problema.

Por ejemplo al cerrar el terminal Deinit en todos los programas a ejecutar.

 
eevviill:

Gracias.

Pero no es sólo en mi indicador. Pensé que resolvería este problema por su parte.

Por ejemplo, al cerrar el terminal, deinit en todos los programas.

En realidad, deinit en todos los programas se llama cuando se cierra la terminal.

Incluso hay un código especial para la razón de deinit. REASON_CLOSE