Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 185

 

Buenas tardes.

Necesito que el EA salga después de un determinado evento.

Entiendo que es la función deinit(), necesito llamarla de alguna manera. Esta es una cita del tutorial:

"Lafunción especial deinit() también es llamada para ser ejecutada por el terminal del cliente cuando se apaga el terminal del cliente, cuando se cierra la ventana del instrumento financiero, justo antes de cambiar un instrumento financiero y/o el período del gráfico, cuando el programa se recompila con éxito en el MetaEditor, cuando se cambian los parámetros de entrada y cuando se cambia la cuenta. "

Entonces, ¿tengo que cerrar el terminal manualmente, por ejemplo, para que se llame a esta función?

Intenté llamar a esta función cuando se disparaba una condición, se ejecutaba, pero llegaba un nuevo tick y se iniciaba de nuevo la función de inicio.

int deinit()
  {
  Alert("Закрываем программу"); 
   return(0);
  }

int start()
{
//код
..............
if (OrdersTotal()==0) deinit();
return(0);
}



¿Cómo puedo seguir terminando el programa?

Gracias.

 
GygaByte:

Buenas tardes.

Necesito que el EA se detenga después de un determinado evento.

Entiendo que es la función deinit(), necesito llamarla de alguna manera. Esta es una cita del tutorial:

"Lafunción especial deinit() también es llamada para ser ejecutada por el terminal del cliente cuando se apaga el terminal del cliente, cuando se cierra la ventana del instrumento financiero, justo antes de cambiar un instrumento financiero y/o el período del gráfico, cuando el programa se recompila con éxito en el MetaEditor, cuando se cambian los parámetros de entrada y cuando se cambia la cuenta. "

Entonces, ¿tengo que cerrar el terminal manualmente, por ejemplo, para que se llame a esta función?

Intenté llamar a esta función cuando se disparaba una condición, se ejecutaba, pero llegaba un nuevo tick y se iniciaba de nuevo la función de inicio.

¿Cómo puedo seguir terminando el programa?

Gracias.

Para cerrar el terminal programáticamente, inserte al principio del código antes de la función start():

//----
#import "user32.dll"
int GetParent(int hWnd);  // вызов API
#import
//----

En la función start(), cuando necesites cerrar el terminal, llama a ExitMT4(), que declaras fuera de la función start()

//+----------------------------------------------------------------------------+
void ExitMT4() {  // выгрузить MT4 из памяти

   int hwnd=WindowHandle(Symbol(),Period());
   int hwnd_parent=0;
//----
   while(!IsStopped()) {
      hwnd=GetParent(hwnd);
      if(hwnd==0) break;
      hwnd_parent=hwnd;
      }
   if(hwnd_parent!=0) PostMessageA(hwnd_parent,WM_CLOSE,0,0);
}
//+----------------------------------------------------------------------------+
 
artmedia70:

Para cerrar el terminal programáticamente, inserte al principio del código antes de la función start():

En la función start(), cuando necesites cerrar el terminal, llama a ExitMT4(), que declaras fuera de la función start()



Muchas gracias por su exhaustiva respuesta.

Básicamente, me bastaría con terminar el EA, no necesito cerrar el terminal. ¿No hay una manera fácil de hacerlo?

Creo que deinit() debería resolver de alguna manera este problema, pero debo estar haciendo algo mal...

 

No puedo eliminar Terminal.exe de Alpari Limited, build 509.

Al utilizar el panel de control para desinstalar, aparece el mensaje "No tiene suficientes derechos para desinstalar". Póngase en contacto con el administrador del sistema".

Al utilizar Uninstall.exe se muestra "El servidor ha devuelto el enlace".

El soporte técnico de Alpari no es capaz de decir nada comprensible. Sólo me sugieren que borre toda la carpeta e instale el terminal en otro directorio.

Tengo Win 7, Ultimate. Derechos de administrador activados, ejecuté Uninstall.exe como administrador.

Estaría muy agradecido por cualquier ayuda para resolver este problema.

 
GygaByte:


Muchas gracias por la detallada respuesta.

En principio me bastaría con dar de baja el EA, no hace falta cerrar el terminal. ¿No hay una manera fácil?

Creo que deinit() debería resolver de alguna manera este problema, pero debo estar haciendo algo mal...

No deinit(), sino return(0);
 
artmedia70:
No deinit() sino return(0);


Si no me equivoco, return(0) simplemente terminará la función actual start() y esperará al siguiente tick, mientras que yo necesito que el EA termine como si lo hubiera desbloqueado manualmente del gráfico.

Lo he comprobado en la práctica y sigue mostrando la alerta de "0 órdenes abiertas" con cada tick.

No esperé el preciado "Adiós".

int start()
  {
  if (OrdersTotal()==0) 
   {
   Alert("Открытых ордеров - ", OrdersTotal());
   return(0);
   }  
  }
//+------------------------------------------------------------------+
int deinit()
  {
 Alert("Пока");  
   return(0);
  }
 
polycomp:

No se puede desinstalar Terminal.exe de Alpari Limited, build 509.

Al utilizar el panel de control para desinstalar, aparece el mensaje "No tiene suficientes derechos para desinstalar". Póngase en contacto con el administrador del sistema".

Al utilizar Uninstall.exe se muestra "El servidor ha devuelto el enlace".

El soporte técnico de Alpari no es capaz de decir nada comprensible. Sólo me sugieren que borre toda la carpeta e instale el terminal en otro directorio.

Tengo Win 7, Ultimate. Derechos de administrador activados, desinstalar.exe ejecutar como administrador.

Estaré muy agradecido por cualquier consejo para resolver este problema

Algunos programas maliciosos (mail.ru, lo tuve) redistribuyen los derechos de acceso, por lo que usted con privilegios de administrador no tiene acceso a su eliminación.

El problema fue resuelto por el método de poke científica en la redistribución de los derechos (haga clic en la carpeta, propiedades, la seguridad, el cambio, añadir, opcional, tipos de objetos, search.......)

Pero luego me familiaricé con "Revo uninstaller" y desapareció toda la molestia de borrar algo + la certeza de que el registro estaba limpio de sus actividades.

 
GygaByte:


Si no me equivoco, return(0) simplemente terminará la función actual start() y esperará el siguiente tick. Necesito que el EA termine su trabajo como si lo hubiera separado manualmente del gráfico.

Lo he comprobado en la práctica: con cada tic da la alerta "Órdenes abiertas - 0".

No he esperado el preciado "Adiós".

Su deseo recuerda al chiste de las "damas". Si quiere que el EA deje de operar, entonces al activar la bandera (global) (después de algunas condiciones), interrumpiendo la función start() (salida vía retorno) dará el resultado esperado.
 
ALXIMIKS:

Algunos programas maliciosos (mail.ru tuve) redistribuyen los derechos de acceso y hacen que usted con derechos de administrador no tenga acceso a su eliminación.

El problema se solucionó con el método científico de redistribución de permisos ( PCM en la carpeta, propiedades, seguridad, cambiar, añadir, opcional, tipos de objetos, buscar.......)

Pero luego me familiaricé con "Revo uninstaller" y toda la molestia de borrar algo desapareció, + la certeza de que el registro se limpió DE sus actividades.

¡Muchas gracias! Me familiarizaré con Revo uninstaller.
 
TarasBY:
Tu deseo recuerda al chiste del "dibujante". Si desea que el asesor deje de operar, entonces mediante la activación de la bandera (global) (después de algunas condiciones), la interrupción de la función start() (salida a través de retorno) dará el resultado esperado.

Esto es más o menos lo que parece:

bool GlobalFlag;
int init()
{
   GlobalFlag = true;
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   if ( GlobalFlag )
      if (OrdersTotal() == 0) 
      {
         GlobalFlag = false;
         Alert("Открытых ордеров - ", OrdersTotal());
         Alert("Пока");  
      }  
   return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+------------------------------------------------------------------+