IsConnected() - pagina 2

 
Matutin:

Basta chiamare start() da init () ...e sarete in start() anche senza tick in arrivo!

grazie u 2
 
Viffer:

Espandendo il mio link sopra... Eseguo un EA separato per monitorare lo stato della connessione. In pratica ha tutto il codice per il mio test codificato all'interno di start con uno sleep alla fine. Start è fondamentalmente un grande ciclo, quando finisce, torna all'inizio. Ma piuttosto che aspettare un tick per innescare lo start, chiamo start() dentro init(). In questo modo start() continua a fare il ciclo con lo sleep e init() non finisce mai, quindi il codice viene eseguito in base agli intervalli di tempo dallo sleep piuttosto che aspettare un tick... il link sopra mostra il principio...

hth

V


Matutin:

Basta chiamare start() da init () ...e ti troverai in start() anche senza tick in arrivo!


nessuno dei due risolve il problema perché anche init() non parte se non c'è connessione

l'unico modo per farlo è con uno script; il problema è che non c'è modo di aprire il terminale con uno script Loaded

 
qjol:


nessuno dei due risolve il problema perché anche init() non parte se non c'è connessione

l'unico modo per farlo è con uno script; il problema è che non c'è modo di aprire il terminale con uno script caricato


Diamo un'occhiata agli strumenti di MT4i.com. Li uso per monitorare la connessione e inviare avvisi via mail o sms.

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

 
Matutin:

Basta chiamare start() da init () ...e sarai in start() anche senza tick in arrivo!

NO! Questo non è permesso. init() dovrebbe tornare dopo 2 secondi. Non è permesso che init si blocchi! Tutti i tipi di problemi potrebbero nascere (e nasceranno) da questo.

Basta fare il ciclo in start e aspettarsi che start venga chiamato automaticamente al prossimo tick disponibile dopo il caricamento dell'EA. Ci sono stati dei tick prima che la connessione cadesse, quindi il tuo ciclo sarà già in esecuzione quando questo evento si verifica.


Se avete davvero bisogno di innescare uno start() dall'interno di init() perché avete bisogno che venga eseguito nel fine settimana, allora l'unico modo corretto è usare il trucco PostMessage() per imporre un tick. Si invia il messaggio e poi si lascia che init ritorni! MT4 chiamerà poi start() nel modo normale e init() non si bloccherà.


Vedi il prossimo post per un esempio.

 
// 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);
}
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.
 
/**
* 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);
   }
}
Per completezza, quello sopra è uno script che uso per simulare falsi tick nel fine settimana. Non ne avete bisogno, è solo un esempio. Questo è utile soprattutto per il debug di altri EA e indicatori.
 
/**
* 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);
   }
}

E questo è lo stesso dello script precedente ma implementato come un EA, dimostrando entrambi i concetti in un EA.

In init() si enqueue il primissimo tick per innescare il primo start() e poi in start() produrrà altri tick in un ciclo infinito. Questi tick saranno poi raccolti da tutti gli indicatori sullo stesso grafico.

 
7bit:
Questo è l'unico modo corretto per forzare uno start() dall'interno di init() in un EA. Non ti è permesso farlo in un indicatore, dato che la start() verrà eseguita nel thread della 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);
}

prova a mettere questo EA su un grafico, chiudi il terminale, poi disabilita la tua connessione internet e accendi il tuo terminale (mentre la connessione a internet è spenta) e vedrai che non funziona

 
qjol:


prova a mettere questo ea su un grafico, chiudi il terminale, disattiva la tua connessione internet e accendi il tuo terminale (mentre la connessione a internet è spenta) e vedrai che non funziona

Ma dovrebbe continuare a funzionare una volta che è stato avviato in condizioni normali (che dovrebbe essere il caso d'uso normale). Provate a disconnettervi dopo che è stato avviato.


E serve come esempio di come evitare un init() bloccante ed eseguirlo come un EA invece di uno script.

 
7bit:

Ma dovrebbe continuare a funzionare una volta che è stato avviato in condizioni normali (che dovrebbe essere il caso d'uso normale). Provate a disconnettervi dopo che è stato avviato.


E serve come esempio di come evitare un init() bloccante ed eseguirlo come un EA invece di uno script.


Hai ragione, ma non sto cercando una soluzione alla situazione che descrivi, sto cercando una soluzione alla situazione che descrivo, e al momento l'unica soluzione che ho trovato, che, software esterno, eseguirà uno script