IsConnected() - página 4

 
7bit:

Se puede comprobar, sólo hay que ejecutar la comprobación en un bucle infinito. cómo iniciar este bucle al arrancar el terminal durante un corte de conexión es un problema completamente distinto. Una vez que tengas tu bucle en marcha hará lo que se espera.

Tu problema no tiene nada que ver con la función IsConnected(). Con el mismo argumento también podrías quejarte de Print() o Alert() o cualquier otra función que no puedas llamar porque no pudiste iniciar todo el código en primer lugar por alguna razón completamente diferente.


ok, dejame explicarte algo porque estoy usando muchas terminales y mi uso de la cpu esta subiendo hasta 100 por ciento por eso necesito apagar algunas terminales

Y cuando los activo (por supuesto de forma automática) he visto unas cuantas veces que no están conectados y el EA que se ejecuta en ellos no informa de que no hay conexión,

por eso empecé este tema y hasta ahora la única forma que encontré es como dije arriba con un programa externo

 

Tal vez esté relacionado con la "característica" que se introdujo por primera vez con Windows XP SP2 que se niega a tener más que un puñado de conexiones medio abiertas en cualquier momento, principalmente para molestar a la gente que quiere utilizar aplicaciones intensivas de red. AFAIK existen métodos para parchear esta molesta "característica" y restaurar la operatividad normal: http://blog.davidkaspar.com/archives/2005/04/windows-xp-sp2-and-event-id-4226.php

Busca el evento 4226 en el registro de eventos de Windows.

 
7bit:
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.

Esto está bien pero no siempre funciona porque el tick puede desaparecer incluso antes de que initi() haya regresado, en cuyo caso el tick se descarta. Para resaltar esto, si se añade una pausa de 5ms después de

PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return

entonces start() no se ejecutará.

¿Existe una solución mejor para que initi() se ejecute al cargar el asesor experto sin requerir un tick real del broker?

 

Soy un poco viejo perobusco una solución al mismo problema que tengo en este tema.

De hecho, la afirmación de qjol de que "la única forma de hacer esto es con un script; el problema es que no hay forma de abrir la terminal con un script cargado" es parcialmente cierta. Con un script ok, pero hay una manera de iniciar un script con el terminal del cliente. Esto está documentado en la ayuda de metatrader (F1, Herramientas, Configuración al inicio). Puede ser que no es el mismo en el momento de este tema se inició.

Así que desarrollé un pequeño script para hacer el trabajo. Usar esto con un script de inicio, ejemplo :

  ; open chart and run expert and/or script
  Symbol=EURUSD
  Period=H4
  Template=popular.tpl
  Expert=
  ExpertParameters=
  Script=CheckConnection
  ScriptParameters=

Y lauch terminal con algo como :

"...\Metatrader 4\terminal.exe" config\start.ini

Archivos adjuntos:
 

Hola chicos,

¿Saben alguno de ustedes, por qué no trabajar guión garrapatas falsas - https://www.mql5.com/en/forum/128803/page2#373539(página 2) este hilo para construir 600 +?

Mi sistema operativo es Vista. Gracias.

 
endy5:

Hola chicos,

¿Saben alguno de ustedes, por qué no trabajar guión garrapatas falsas - https://www.mql5.com/en/forum/128803/page2#373539(página 2) este hilo para construir 600 +?

Mi sistema operativo es Vista. Gracias.

Desde build > 600 tienes que reemplazar "A" para ansi con "W" para unicode

int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
int RegisterWindowMessageA(string lpString);
 

por qué se usa 2 y 1 en el parámetro

PostMessageA(hwnd, msg, 2, 1)
 
iamsuman2:

¿por qué es el uso de 2 y 1 en el parámetro

Está fuera del alcance de MQL, chet la función aquí:

 

Por si alguien más está buscando información sobre la función IsConnected().

Así que sí, la función no funcionará bajo la función start() o la función OnTick(), porque si no hay conexión, entonces no llegará ningún nuevo tick, y la función no se activará de todos modos....

Entonces, ¿qué debemos hacer?

Usar la función OnTimer(), para comprobar regularmente si hay conexión, independientemente de los ticks entrantes.

int timer = 60;   //60 seconds, for example
int OnInit()
  {
//--- create timer
   EventSetTimer(timer);  //could use EventSetMillisecondTimer(timer) for millisecond resolution
//---
   return(INIT_SUCCEEDED);
  }

// Metatrader self-triggered function, will be called regularly
void OnTimer()
  {
    if(!IsConnected())
      Alert("Problem, not connection to the server!");
  }

void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
      
 

fridayda13:

Así que sí, la función no funcionará bajo la función start() o la función OnTick(), porque si no hay conexión, entonces no llegará ningún nuevo tick, y la función no se activará de todos modos....

Entonces, ¿qué debemos hacer?

Usar la función OnTimer(), para comprobar regularmente si hay conexión, independientemente de los ticks que lleguen.

No debe hacer nada, porque no hay nada que pueda hacer. Tarda más de 30 segundos antes de que la red se agote y la función cambie de valor. ¿Qué vas a hacer cuando nada ha cambiado y no tienes conexión?

Sólo es útil si nunca vuelve de start/OnTick (comprobarlo antes de un OrderSend.) O después de OrderSend para reintentos dentro del mismo tick.

En su lugar, si OrderSend falla, regístrelo, regrese y pruebe/reintente en el siguiente tick. Hecho.