IsConnected() - página 2

 
Matutin:

¡Simplemente llama a start() desde init () ...y estarás en start() aunque no venga ningún tick !

gracias u 2
 
Viffer:

Ampliando mi enlace anterior... Ejecuto un EA separado para monitorear el estado de la conexión. Básicamente tiene todo el código para mi prueba codificada dentro de inicio con un sueño al final. Inicio es básicamente un gran bucle, cuando termina, vuelve al principio. Pero en lugar de esperar a un tick para activar el inicio, llamo a start() dentro de init(). De esta manera start() continúa el bucle con el sleep e init() nunca termina, por lo que el código se ejecuta en base a los intervalos de tiempo del sleep en lugar de esperar un tick... el enlace de arriba muestra el principio...

hth

V


Matutin:

¡Simplemente llama a start() desde init () ...y estarás en start() aunque no venga ningún tick !


nada de esto resuelve el problema porque init() tampoco se inicia si no hay conexión

la única manera de hacer esto es con un script; el problema es que no hay manera de abrir la terminal con un script cargado

 
qjol:


nada de esto resuelve el problema porque init() tampoco se inicia si no hay conexión

la única manera de hacer esto es con un script; el problema es que no hay manera de abrir la terminal con un script cargado


Vamos a echar un vistazo a las herramientas de MT4i.com. Yo las uso para monitorear la conexión y enviar alertas por correo o sms.

http://www.mt4i.com/mtdashboard.aspx

 
Matutin:

¡Sólo llame a start() desde init () ...y estará en start() incluso sin que haya un tick disponible !

¡NO! Esto no está permitido. Se espera que init() regrese después de 2 segundos. ¡No se permite que init se bloquee! Todo tipo de problemas podrían (y surgirán) de eso.

Simplemente haga el bucle en start y espere que start sea llamado automáticamente en el siguiente tick disponible después de cargar el EA. Hubo ticks antes de que la conexión se cayera por lo que su bucle ya se estará ejecutando cuando este evento ocurra.


Si realmente necesita desencadenar un start() desde dentro de init() porque necesita que se ejecute en el fin de semana, entonces la única manera correcta es usar el truco PostMessage() para forzar un tick. Usted publica el mensaje y luego deja que init regrese. MT4 llamará entonces a start() de la manera normal e init() no se bloqueará.


Vea la siguiente publicación para un ejemplo.

 
// this is an EA

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return
   return(0);
}


int start(){
   while (!IsStopped()){
      // do your stuff here
      Sleep(1000);
   }
   return(0);
}
Esta es la única forma correcta de forzar un start() desde dentro de init() en un EA. No se permite hacer esto en un indicador ya que allí start() se ejecutará en el hilo de la GUI.
 
/**
* MT4/experts/scripts/ticks.mq4
* send a fake tick every 200 ms to the chart and
* all its indicators and EA until this script is removed.
*/

#property copyright "© Bernd Kreuss"

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int start(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   while(!IsStopped()){
      PostMessageA(hwnd, msg, 2, 1);
      Sleep(200);
   }
}
Para completar lo anterior es un script que utilizo para simular ticks falsos en el fin de semana. No lo necesitas, es sólo un ejemplo. Esto es principalmente útil para la depuración de otros EAs e indicadores.
 
/**
* this is a variation of the above script meant to be run as an EA.
* Send a fake tick every 200 ms to the chart and
* all its indicators until this EA is removed.
*/

#property copyright "© Bernd Kreuss"

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue the first fake tick
}

int start(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   while(!IsStopped()){
      PostMessageA(hwnd, msg, 2, 1);  // produce more fake ticks
      Sleep(200);
   }
}

Y esto es lo mismo que el script anterior pero implementado como un EA, demostrando ambos conceptos en un EA.

En init() se pondrá en cola el primer tick para activar el primer start() y luego en start() producirá más ticks en un bucle infinito.

 
7bit:
Esta es la única manera correcta de forzar un start() desde dentro de init() en un EA. No está permitido hacer esto en un indicador ya que allí start() se ejecutará en el hilo de la GUI.

// this is an EA

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return
   return(0);
}


int start(){
   while (!IsStopped()){
      // do your stuff here
      Sleep(1000);
   }
   return(0);
}

intente poner este EA en un gráfico, cierre el terminal, luego desactive su conexión a internet y encienda su terminal (mientras la conexión a internet está apagada) y verá que no funciona

 
qjol:


intente poner este ea en un gráfico cierre el terminal y luego desactive su conexión a internet y encienda su terminal (mientras la conexión a internet está apagada) y verá que no funciona

Pero debería seguir funcionando una vez que se ha iniciado en condiciones normales (que debería ser el caso de uso normal). Intenta desconectarlo después de que se haya iniciado.


Y sirve como ejemplo de cómo evitar un init() bloqueante y ejecutarlo como un EA en lugar de un script.

 
7bit:

Pero debería seguir ejecutándose una vez iniciado en condiciones normales (que debería ser el caso de uso normal). Intenta desconectarse después de que se haya iniciado.


Y sirve como ejemplo de cómo evitar un init() bloqueante y ejecutarlo como un EA en lugar de un script.


Tienes razón, pero no estoy buscando una solución a la situación que describes, estoy buscando una solución a la situación que describo, y ahora mismo la única solución que he encontrado, que, software externo, ejecutará un script

Razón de la queja: