IsConnected() - pagina 4

 
7bit:

Può essere controllato, basta eseguire il controllo in un ciclo infinito. come avviare questo ciclo quando si avvia il terminale durante un'interruzione della connessione è un problema completamente separato. Una volta che hai fatto partire il tuo ciclo farà ciò che ci si aspetta.

Il tuo problema non ha nulla a che fare con la funzione IsConnected(). Con lo stesso argomento potreste anche lamentarvi di Print() o Alert() o qualsiasi altra funzione che non potete chiamare perché non avete potuto avviare l'intero codice in primo luogo a causa di qualche ragione completamente diversa.


Ok, lasciami spiegare qualcosa perché sto usando molti terminali per tutto il tempo in cui il mio utilizzo della cpu sta salendo fino a 100 punti percentuali, ecco perché ho bisogno di spegnere alcuni terminali

E quando li accendo (ovviamente in automatico) ho visto alcune volte che non sono connessi e l'EA che li esegue non segnala che non c'è connessione,

Ecco perché ho iniziato questo topic e finora l'unico modo che ho trovato è come ho detto sopra con un programma esterno

 

Forse è legato alla "caratteristica" che è stata introdotta per la prima volta con Windows XP SP2 che si rifiuta di avere più di una manciata di connessioni semiaperte in qualsiasi momento, principalmente per infastidire le persone che vogliono usare applicazioni ad alta intensità di rete. AFAIK esiste un metodo per patchare questa fastidiosa "caratteristica" e ripristinare la normale operatività: http://blog.davidkaspar.com/archives/2005/04/windows-xp-sp2-and-event-id-4226.php

Cercate l'evento 4226 nel registro eventi di Windows.

 
7bit:
Questo è l'unico modo corretto per forzare uno start() dall'interno di init() in un EA. Non ti è permesso farlo in un indicatore poiché lì la start() verrà eseguita nel thread della GUI.

Questo è bello, ma non sempre funziona perché il tick potrebbe essere andato anche prima che initi() sia tornato, nel qual caso il tick viene scartato. Per evidenziare questo, se si aggiunge una pausa di 5ms dopo

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

allora start() non sarà eseguito.

C'è una soluzione migliore per far eseguire start() al caricamento dell'expert advisor senza richiedere un tick reale dal broker?

 

Sono un po' vecchio masto cercando una soluzione allo stesso problema che ho avuto in questo topic.

Infatti, l'affermazione di qjol che "l'unico modo per farlo è con uno script; il problema è che non c'è modo di aprire il terminale con uno script caricato" è parzialmente vera. Con uno script ok, ma c'è un modo per avviare uno script con il terminale del client. Questo è documentato nella guida di metatrader (F1, Strumenti, Configurazione all'avvio). Forse non è lo stesso al momento in cui questo argomento è stato iniziato.

Così ho sviluppato un piccolo script per fare il lavoro. Usatelo con uno script di avvio, esempio :

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

E lanciare il terminale con qualcosa come :

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

File:
 

Ciao ragazzi,

Sapete qualcuno di voi, perché non lavorare script fake ticks - https://www.mql5.com/en/forum/128803/page2#373539(pagina 2) questo thread per costruire 600++?

Il mio sistema operativo è Vista. Grazie.

 
endy5:

Ciao ragazzi,

Sapete qualcuno di voi, perché non lavorare script fake ticks - https://www.mql5.com/en/forum/128803/page2#373539(pagina 2) questo thread per costruire 600++?

Il mio sistema operativo è Vista. Grazie.

Dalla build > 600 devi sostituire "A" per ansi con "W" per unicode

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

perché è usare 2 e 1 nel parametro

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

perché è usare 2 e 1 nel parametro

È fuori dallo scopo di MQL, chet la funzione qui:

 

Nel caso in cui qualcun altro stia cercando informazioni sulla funzione IsConnected().

Quindi sì, la funzione non funzionerà sotto la funzione start() o la funzione OnTick(), perché se non c'è connessione, allora non arriverà nessun nuovo tick, e la funzione non si attiverà comunque....

Quindi cosa dovremmo fare?

Usare la funzione OnTimer(), per controllare regolarmente la connessione, indipendentemente dai tick in arrivo.

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:

Quindi sì, la funzione non funzionerà sotto la funzione start() o la funzione OnTick(), perché se non c'è connessione, allora nessun nuovo tick arriverà, e la funzione non si attiverà comunque....

Quindi cosa dovremmo fare?

Usare la funzione OnTimer(), per controllare regolarmente la connessione, indipendentemente dai tick in arrivo.

Non dovresti fare nulla, perché non c'è nulla che tu possa fare. Ci vogliono più di 30 secondi prima che la rete vada in timeout e la funzione cambi valore. Cosa farai quando non è cambiato nulla e non hai nessuna connessione?

E' utile solo se non tornate mai da start/OnTick (controllatelo prima di un OrderSend.) o dopo OrderSend per i ritentativi all'interno dello stesso tick.

Invece, se OrderSend fallisce, registralo, torna indietro e prova/ritenta al prossimo tick. Fatto.