Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 185

 

Buon pomeriggio.

Ho bisogno che l'EA si fermi dopo un certo evento.

Ho capito che questa è la funzione deinit(), ho bisogno di chiamarla in qualche modo. Questa è una citazione dal tutorial:

"La funzione speciale deinit() viene anche chiamata per l'esecuzione dal terminale client quando il terminale client viene spento, quando la finestra dello strumento finanziario viene chiusa, appena prima di cambiare uno strumento finanziario e/o un periodo del grafico, quando il programma viene ricompilato con successo nel MetaEditor, quando i parametri di input vengono cambiati e quando il conto viene cambiato. "

Quindi devo chiudere manualmente il terminale, per esempio, perché questa funzione sia chiamata?

Ho provato a chiamare questa funzione quando una condizione si è innescata, è stata eseguita, ma è arrivato un nuovo tick e la funzione di avvio è stata avviata di nuovo.

int deinit()
  {
  Alert("Закрываем программу"); 
   return(0);
  }

int start()
{
//код
..............
if (OrdersTotal()==0) deinit();
return(0);
}



Come posso ancora terminare il programma?

Grazie.

 
GygaByte:

Buon pomeriggio.

Ho bisogno che l'EA si fermi dopo un certo evento.

Ho capito che questa è la funzione deinit(), ho bisogno di chiamarla in qualche modo. Questa è una citazione dal tutorial:

"La funzione speciale deinit() viene chiamata per l'esecuzione dal terminale client anche quando il terminale client viene spento, quando la finestra dello strumento finanziario viene chiusa, appena prima di cambiare uno strumento finanziario e/o un periodo del grafico, quando il programma viene ricompilato con successo nel MetaEditor, quando i parametri di input vengono cambiati e quando il conto viene cambiato. "

Quindi devo chiudere manualmente il terminale, per esempio, perché questa funzione sia chiamata?

Ho provato a chiamare questa funzione quando una condizione si è innescata, è stata eseguita, ma è arrivato un nuovo tick e la funzione di avvio è stata avviata di nuovo.

Come posso ancora terminare il programma?

Grazie.

Per chiudere programmaticamente il terminale, inserite all'inizio del codice prima della funzione start():

//----
#import "user32.dll"
int GetParent(int hWnd);  // вызов API
#import
//----

Nella funzione start(), quando avete bisogno di chiudere il terminale, chiamate ExitMT4(), che dichiarate fuori dalla funzione start()

//+----------------------------------------------------------------------------+
void ExitMT4() {  // выгрузить MT4 из памяти

   int hwnd=WindowHandle(Symbol(),Period());
   int hwnd_parent=0;
//----
   while(!IsStopped()) {
      hwnd=GetParent(hwnd);
      if(hwnd==0) break;
      hwnd_parent=hwnd;
      }
   if(hwnd_parent!=0) PostMessageA(hwnd_parent,WM_CLOSE,0,0);
}
//+----------------------------------------------------------------------------+
 
artmedia70:

Per chiudere programmaticamente il terminale, inserite all'inizio del codice prima della funzione start():

Nella funzione start(), quando avete bisogno di chiudere il terminale, chiamate ExitMT4(), che dichiarate fuori dalla funzione start()



Grazie mille per la sua risposta esauriente.

In pratica, mi basterebbe chiudere l'EA, non ho bisogno di chiudere il terminale. Non c'è un modo semplice per farlo?

Penso che deinit() dovrebbe in qualche modo risolvere questo problema, ma devo star facendo qualcosa di sbagliato...

 

Non riesco a rimuovere Terminal.exe da Alpari Limited, build 509.

Quando si usa il pannello di controllo per disinstallare, appare un "Non hai diritti sufficienti per disinstallare". Contatta il tuo amministratore di sistema!".

Quando si usa Uninstall.exe viene visualizzato "Il server ha restituito il link".

Il supporto tecnico di Alpari non è in grado di dire nulla di comprensibile. Mi hanno solo suggerito di cancellare l'intera cartella e di installare il terminale in un'altra directory.

Ho Win 7, Ultimate. Diritti di amministratore attivati, ho eseguito Uninstall.exe come amministratore.

Sarei molto grato per qualsiasi aiuto per risolvere questo problema.

 
GygaByte:


Grazie mille per la risposta dettagliata.

In linea di principio mi basterebbe semplicemente terminare l'EA, non c'è bisogno di chiudere il terminale. Non c'è un modo semplice?

Penso che deinit() dovrebbe in qualche modo risolvere questo problema, ma devo star facendo qualcosa di sbagliato...

Non deinit(), ma return(0);
 
artmedia70:
Non deinit() ma return(0);


Se non mi sbaglio, return(0) terminerà semplicemente la funzione corrente start() e aspetterà il prossimo tick, mentre io ho bisogno che l'EA termini il suo lavoro, come se lo avessi staccato manualmente dal grafico.

L'ho controllato in pratica e continua a visualizzare l'avviso "0 ordini aperti" ad ogni tick.

Non ho aspettato il caro "Ciao".

int start()
  {
  if (OrdersTotal()==0) 
   {
   Alert("Открытых ордеров - ", OrdersTotal());
   return(0);
   }  
  }
//+------------------------------------------------------------------+
int deinit()
  {
 Alert("Пока");  
   return(0);
  }
 
polycomp:

Impossibile rimuovere Terminal.exe da Alpari Limited, build 509.

Quando si usa il pannello di controllo per disinstallare, appare un "Non hai diritti sufficienti per disinstallare". Contatta il tuo amministratore di sistema!".

Quando si usa Uninstall.exe viene visualizzato "Il server ha restituito il link".

Il supporto tecnico di Alpari non è in grado di dire nulla di comprensibile. Mi hanno solo suggerito di cancellare l'intera cartella e di installare il terminale in un'altra directory.

Ho Win 7, Ultimate. Diritti di amministratore attivati, uninstall.exe eseguito come amministratore.

Sarò molto grato per qualsiasi consiglio per risolvere questo problema

Alcuni programmi maligni (mail.ru, l'ho avuto io) ridistribuiscono i diritti di accesso, quindi voi con privilegi di amministratore non avete accesso alla loro rimozione.

Il problema è stato risolto con il metodo del poke scientifico nella ridistribuzione dei permessi (clic sulla cartella, proprietà, sicurezza, cambiare, aggiungere, opzionale, tipi di oggetti, ricerca.......)

Ma poi ho fatto conoscenza con "Revo uninstaller" e tutto il fastidio di cancellare qualcosa è scomparso + la certezza che il registro è stato pulito dalle loro attività.

 
GygaByte:


Se non mi sbaglio, return(0) terminerà semplicemente la funzione corrente start() e aspetterà il prossimo tick. Ho bisogno che l'EA finisca il suo lavoro come se lo avessi staccato manualmente dal grafico.

Ho controllato in pratica - all'infinito ad ogni tick dà l'avviso "Ordini aperti - 0".

Non ho aspettato il caro "Ciao".

Il tuo desiderio ricorda la battuta della "dama". Se volete che l'EA fermi il trading, allora attivando il flag (globale) (dopo alcune condizioni), interrompendo la funzione start() (uscita tramite return) si otterrà il risultato atteso.
 
ALXIMIKS:

Alcuni programmi maligni (io avevo mail.ru) ridistribuiscono i diritti di accesso e fanno in modo che voi con i diritti di amministratore non abbiate accesso alla loro cancellazione.

Il problema è stato risolto con il metodo scientifico di ridistribuzione dei permessi (PCM sulla cartella, proprietà, sicurezza, modifica, aggiunta, opzionale, tipi di oggetti, ricerca.......)

Ma poi ho fatto conoscenza con "Revo uninstaller" e tutto il fastidio di cancellare qualcosa è scomparso, + la certezza che il registro è stato pulito dalle loro attività.

Grazie mille! Farò conoscenza con Revo uninstaller.
 
TarasBY:
Il tuo desiderio ricorda la battuta del "disegnatore". Se volete che l'advisor fermi il trading, allora attivando il flag (globale) (dopo alcune condizioni), l'interruzione della funzione start() (uscita tramite return) darà il risultato atteso.

Questo è più o meno quello che sembra:

bool GlobalFlag;
int init()
{
   GlobalFlag = true;
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   if ( GlobalFlag )
      if (OrdersTotal() == 0) 
      {
         GlobalFlag = false;
         Alert("Открытых ордеров - ", OrdersTotal());
         Alert("Пока");  
      }  
   return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+------------------------------------------------------------------+