Build 216 bug ? isConnected() devuelve false pero metatrader sigue conectado - página 2

 
Vale, sí, lo tengo... bueno... ya veremos si vuelve ;)
 

Hola Stringo,



lamentablemente, este error persiste.

Cuando se ejecuta el script de prueba de abajo y se cambia de una cuenta a otra (en mi caso de prueba usé cuentas de 2 o 3 corredores diferentes y cambié de una a otra), se puede ver que después de unos cuantos accountChanges (un número bastante aleatorio) el connectionState realmente no cambia de nuevo a 1, se mantiene 0 a pesar de que el Terminal _está_ conectado.


A sus ojos, esto podría no ser un error crítico. Sin embargo, para algunas personas que desarrollan scripts que muestran el connectionState, los resultados de las pruebas realizadas son bastante alarmantes.

Por eso le agradezco mucho que vuelva a echar un vistazo a este problema.



Aquí está el testScript:


//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
   while(!IsStopped())
   {
      Print("test"+IsConnected());
      Sleep(500);
   }
}




Atentamente,


Daniel.

 
También puedo confirmar que este error existe en la versión 216. Parece ocurrir después de un cierto número de secuencias de conexión fallida.
 
Sí, este script es conocido. Pero debemos reproducir el entorno para detectar el problema. Sin embargo no podemos reproducirlo
 

También debo confirmar el mismo error. En mi EA compruebo simultáneamente si la conexión existe. Si no es así, mi script se cierra.

¿Ha encontrado alguien una solución para esto?

 

El script no puede determinar el problema debido al bucle sin fin y la independencia de las garrapatas entrantes.

El problema sólo puede mostrar el experto. Experto simple con sólo una línea de código - Print(IsConnected());

Ticks entrantes (significa que la terminal está conectada) - la función de inicio se ejecuta - ¡Ups! IsConnected() devuelve 0 (es decir, falso)

 

gracias

Sí, yo uso

int start()
{
 while(true)
 {
  if(IsConnected())
   {
    ....... i do my work 
   {
   else 
   {return(-1);} // so if connection was lost i break the infiny loop
 }
}

¡el problema es que la carta cuando la conexión está de vuelta IsConnected() mantiene el valor antiguo falso y no cambia a verdadero! Pero estoy viendo que el precio se mueve y la terminal está conectada al 100%. Esto es un error porque el bucle infinito se rompió y el inicio se ejecutó como nada sucedió en la primera garrapata después de la conexión fue restaurada. Pero por alguna razón Is Connected() sigue devolviendo false. Si quito el EA del gráfico y lo vuelvo a poner todo funciona bien hasta que se pierde la siguiente conexión.



Esto me vuelve loco. Por favor, hagan algo al respecto.

Gracias

 

Liliput - si lo anterior es el esquema de start() usando, ¿por qué quedarse en él con el bucle infinito?

Lo pregunto porque lo normal es entrar > ¿quiero trabajar? no:volver > hacer el trabajo > volver

(normal - es subjetivo por supuesto ;o)

¡no te digo como diseñar - eso es tu negocio, solo pregunto tu razonamiento, luego aprendo más/veo diferentes formas de hacer las cosas!

¿Qué me hizo preguntar?

No tengo ni idea de cómo se comporta el Terminal si, por ejemplo, un EA se niega a volver a él por tal vez muchos ticks de datos que, como el EA no vuelve - el Termial simplemente no hace la llamada a start()... o - ¿simplemente no hace la llamada y eventualmente debido a muchos ticks de datos que fluyen sin haber podido llamar a start() del EA el Terminal entra en profundidades inexploradas y manifiesta el problema conectado?

;)

 

¿Esto podría resolver el problema...?

string FILE[1];
int MOVE[1];
 
void init() { FILE[0]=Symbol(); }
 
int start()
  {
//---- check connection
   if ( !Connection() ) return(0);
//---- 
   return(0);
  }
 
bool Connection()
  {
   int d;
   bool connect;
   RefreshRates();
   for ( d=0; d<ArraySize(FILE); d++)
    {
     if ( MOVE[d] != MarketInfo(FILE[d],5) )
      {
       MOVE[d] = MarketInfo(FILE[d],5);
       /* if ( !connect ) */
       connect=1;
      }
    }
   return(connect);
  }
 
ukt:

Liliput - si lo anterior es el esquema de start() usando, ¿por qué quedarse en él con el bucle infinito?

Lo pregunto porque lo normal es entrar > ¿quiero trabajar? no:volver > hacer el trabajo > volver

(normal - es subjetivo por supuesto ;o)

¡no te digo como diseñar - eso es tu negocio, solo pregunto tu razonamiento, luego aprendo más/veo diferentes formas de hacer las cosas!

¿Qué me hizo preguntar?

No tengo ni idea de cómo se comporta el Terminal si, por ejemplo, un EA se niega a volver a él por tal vez muchos ticks de datos que, como el EA no vuelve - el Termial simplemente no hace la llamada a start()... o - ¿simplemente no hace la llamada y eventualmente debido a muchos ticks de datos que fluyen sin haber podido llamar a start() del EA el Terminal entra en profundidades inexploradas y manifiesta el problema conectado?

;)


ukt, no hay problema, voy a responder. Hago un bucle infinito porque necesito hacer muchas operaciones y no quiero esperar a un nuevo tick para hacerlas. Así que tomo el control de la terminal de esta manera y hago mi trabajo cuando lo necesito y quiero. Uso RefreshRates() para obtener los datos reales.

Así que es lógico comprobar si la conexión con el broker existe porque envío/cierro/modifico órdenes y si no hay conexión entonces no funciona. simple es eso. también hay otras comprobaciones para salir del bucle que utilizo. por ejemplo IsStoped() y así sucesivamente pero el problema no está en mi código está en el IsConnected().