Build 216 bug? isConnected() restituisce false ma metatrader è ancora connesso - pagina 2

 
Ok, sì, ho capito... beh... vedremo se tornerà ;)
 

Ciao Stringo,



purtroppo questo bug persiste.

Quando si esegue lo script di test qui sotto e si passa da un conto all'altro (nel mio caso di test ho usato conti di 2 o 3 broker diversi e sono passato da uno all'altro), si può vedere che dopo alcuni accountChanges (un numero abbastanza casuale) il connectionState in realtà non cambia di nuovo a 1, rimane 0 anche se il terminale _è_ connesso.


Ai vostri occhi, questo potrebbe non essere un bug critico. Tuttavia, per alcune persone che sviluppano script che visualizzano il connectionState, i risultati dei test condotti sono abbastanza allarmanti.

Ecco perché vi sarei molto grato se poteste dare un'altra occhiata a questo problema.



Ecco il testScript:


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




Cordiali saluti,


Daniel.

 
Posso anche confermare che questo bug esiste nella build 216. Sembra verificarsi dopo un certo numero di sequenze di 'connessione fallita' - login.
 
Sì, questo script è noto. Ma dovremmo riprodurre l'ambiente per rilevare il problema. Tuttavia non possiamo riprodurre
 

Devo anche confermare lo stesso bug. Nel mio EA controllo simultaneamente se la connessione esiste. Se non esiste il mio script esce.

Si è trovato un workaround per questo?

 

Lo script non può determinare il problema a causa del ciclo infinito e dell'indipendenza dai tick in arrivo.

Il problema può mostrare solo l'esperto. Esperto semplice con una sola linea di codice - Print(IsConnected());

I tick arrivano (significa che il terminale è connesso) - la funzione di avvio viene eseguita - oops! IsConnected() restituisce 0 (cioè falso)

 

grazie

Sì, io uso

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

Il problema è che la lettera quando la connessione è tornata IsConnected() mantiene il vecchio valore falso e non cambia in vero! Ma sto vedendo che il prezzo si muove e il terminale è connesso al 100%. Questo è un bug perché l'infinity loop è stato rotto e l'avvio è stato eseguito come niente è successo sul primo tick dopo che la connessione è stata ripristinata. Ma per qualche ragione Is Connected() restituisce ancora false. Se rimuovo l'EA dal grafico e lo rimetto tutto funziona bene fino alla prossima connessione persa.



Questo mi fa impazzire. Per favore fai qualcosa!

Grazie

 

Liliput - se sopra è lo schema di start() che si usa, perché rimanere in esso con un ciclo infinito?

Lo chiedo perché il modo normale è entrare > voglio lavorare? no:return > fare lavoro > return

(normale - è soggettivo ovviamente ;o)

Non ti sto dicendo come progettare - questo è il tuo campo, sto solo chiedendo il tuo ragionamento, poi imparo di più/vedo diversi modi di fare le cose!

Cosa mi ha spinto a chiedere?

Non ho idea di come si comporti il Terminale se per esempio un EA si rifiuta di ritornare ad esso per molti tick di dati che, dato che l'EA non ritorna - il Terminale semplicemente non fa la chiamata a start()... o - semplicemente non fa la chiamata e alla fine a causa di molti tick di dati che scorrono senza aver potuto chiamare lo start() di EA il Terminale va in profondità inesplorate e manifesta il problema collegato?

;)

 

Questo potrebbe risolvere il 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 - se sopra è lo schema di start() che si usa, perché rimanere in esso con un ciclo infinito?

Lo chiedo perché il modo normale è entrare > voglio lavorare? no:return > fare lavoro > return

(normale - è soggettivo ovviamente ;o)

Non ti sto dicendo come progettare - questo è il tuo campo, sto solo chiedendo il tuo ragionamento, poi imparo di più/vedo diversi modi di fare le cose!

Cosa mi ha spinto a chiedere?

Non ho idea di come si comporti il Terminale se per esempio un EA si rifiuta di ritornare ad esso per molti tick di dati che, dato che l'EA non ritorna - il Terminale semplicemente non fa la chiamata a start()... o - semplicemente non fa la chiamata e alla fine a causa di molti tick di dati che scorrono senza aver potuto chiamare lo start() di EA il Terminale va in profondità inesplorate e manifesta il problema collegato?

;)


ukt, nessun problema ti risponderò. Faccio infinit loop perché ho bisogno di fare molte operazioni e non voglio aspettare un nuovo tick per farle. Così prendo il controllo dal terminale in questo modo e faccio il mio lavoro quando ho bisogno e voglio. Uso RefreshRates() per ottenere i dati reali.

Quindi è logico controllare se la connessione al broker esiste perché io invio/chiudo/modifico gli ordini e se non c'è connessione allora niente lavoro. semplice. ci sono anche altri controlli per uscire dal ciclo che uso. per esempio IsStoped() e così via ma il problema non è nel mio codice ma in IsConnected().