Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 185

 

Guten Tag.

Ich möchte, dass der EA nach einem bestimmten Ereignis abgeschaltet wird.

Ich verstehe, dass dies die Funktion deinit() ist , ich muss sie irgendwie aufrufen. Dies ist ein Zitat aus dem Lernprogramm:

"Die Spezialfunktion deinit() wird vom Kundenterminal auch dann zur Ausführung aufgerufen, wenn das Kundenterminal heruntergefahren wird, wenn das Fenster des Finanzinstruments geschlossen wird, kurz vor dem Wechsel eines Finanzinstruments und/oder einer Chartperiode, wenn das Programm im MetaEditor erfolgreich neu kompiliert wird, wenn die Eingabeparameter geändert werden und wenn das Konto geändert wird. "

Ich muss also z. B. das Terminal manuell schließen, damit diese Funktion aufgerufen wird?

Ich habe versucht, diese Funktion aufzurufen, wenn eine Bedingung ausgelöst wurde, sie wurde ausgeführt, aber es kam ein neuer Tick und die Startfunktion wurde erneut gestartet.

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

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



Wie kann ich das Programm trotzdem beenden?

Ich danke Ihnen.

 
GygaByte:

Guten Tag.

Ich möchte, dass der EA nach einem bestimmten Ereignis beendet wird.

Ich verstehe, dass dies die Funktion deinit() ist , ich muss sie irgendwie aufrufen. Dies ist ein Zitat aus dem Lernprogramm:

"Die Spezialfunktion deinit() wird auch zur Ausführung durch das Kundenterminal aufgerufen, wenn das Kundenterminal heruntergefahren wird, wenn das Fenster des Finanzinstruments geschlossen wird, kurz vor dem Wechsel eines Finanzinstruments und/oder einer Chartperiode, wenn das Programm im MetaEditor erfolgreich neu kompiliert wird, wenn die Eingabeparameter geändert werden und wenn das Konto geändert wird. "

Ich muss also z.B. das Terminal manuell schließen, damit diese Funktion aufgerufen wird?

Ich habe versucht, diese Funktion aufzurufen, wenn eine Bedingung ausgelöst wurde, sie wurde ausgeführt, aber es kam ein neuer Tick und die Startfunktion wurde erneut gestartet.

Wie kann ich das Programm trotzdem beenden?

Ich danke Ihnen.

Um das Terminal programmatisch zu schließen, fügen Sie ganz am Anfang des Codes vor der Funktion start() ein:

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

Wenn Sie das Terminal schließen müssen, rufen Sie in der Funktion start() die Funktion ExitMT4() auf, die Sie außerhalb der Funktion start() deklarieren

//+----------------------------------------------------------------------------+
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:

Um das Terminal programmatisch zu schließen, fügen Sie ganz am Anfang des Codes vor der Funktion start() ein:

Wenn Sie das Terminal schließen müssen, rufen Sie in der Funktion start() die Funktion ExitMT4() auf, die Sie außerhalb der Funktion start() deklarieren



Vielen Dank für die ausführliche Antwort.

Im Grunde genommen würde es mir genügen, den EA einfach zu beenden, ich muss das Terminal nicht schließen. Gibt es nicht eine einfache Möglichkeit, dies zu tun?

Ich denke, deinit() sollte dieses Problem irgendwie lösen, aber ich muss etwas falsch machen...

 

Ich kann die Datei Terminal.exe von Alpari Limited, Build 509, nicht entfernen.

Wenn Sie die Systemsteuerung zur Deinstallation verwenden, erscheint die Meldung "Sie verfügen nicht über ausreichende Rechte zur Deinstallation. Wenden Sie sich an Ihren Systemadministrator!".

Bei Verwendung von Uninstall.exe wird "Server hat den Link zurückgegeben" angezeigt.

Der technische Support von Alpari konnte mir nichts Verständliches sagen, er meinte nur, ich solle den gesamten Ordner löschen und das Terminal in einem anderen Verzeichnis installieren.

Ich habe Win 7, Ultimate. Mit aktivierten Administratorrechten habe ich Uninstall.exe als Administrator ausgeführt.

Ich wäre für jede Hilfe zur Lösung dieses Problems sehr dankbar.

 
GygaByte:


Vielen Dank für die ausführliche Antwort.

Im Prinzip würde es mir genügen, den EA einfach zu beenden, es ist nicht nötig, das Terminal zu schließen. Gibt es nicht einen einfachen Weg?

Ich denke, deinit() sollte dieses Problem irgendwie lösen, aber ich muss etwas falsch machen...

Nicht deinit(), sondern return(0);
 
artmedia70:
Nicht deinit(), sondern return(0);


Wenn ich mich nicht irre, wird return(0) einfach die aktuelle Funktion start() beenden und auf den nächsten Tick warten, während ich den EA brauche, um seine Arbeit zu beenden, als ob ich ihn manuell vom Diagramm gelöst hätte.

Ich habe es in der Praxis überprüft und es wird bei jedem Tick die Meldung "0 offene Aufträge" angezeigt.

Ich habe nicht auf das geschätzte "Tschüss" gewartet.

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

Kann Terminal.exe von Alpari Limited, Build 509, nicht entfernen.

Wenn Sie die Systemsteuerung zur Deinstallation verwenden, erscheint die Meldung "Sie verfügen nicht über ausreichende Rechte zur Deinstallation. Wenden Sie sich an Ihren Systemadministrator!".

Bei Verwendung von Uninstall.exe wird "Server hat den Link zurückgegeben" angezeigt.

Der technische Support von Alpari konnte mir nichts Verständliches sagen, er meinte nur, ich solle den gesamten Ordner löschen und das Terminal in einem anderen Verzeichnis installieren.

Ich habe Win 7, Ultimate. Administratorrechte aktiviert, uninstall.exe als Administrator ausführen.

Ich bin für jeden Ratschlag zur Lösung dieses Problems sehr dankbar

Einige bösartige Programme (ich hatte mail.ru) verteilen die Zugriffsrechte neu, so dass Sie mit Administratorrechten keinen Zugang zu ihrer Entfernung haben.

Das Problem wurde durch die Methode des wissenschaftlichen Stocherns in der Umverteilung der Rechte gelöst (klicken Sie auf den Ordner, Eigenschaften, Sicherheit, ändern, hinzufügen, optional, Arten von Objekten, suchen.......)

Aber dann habe ich mich mit dem "Revo Uninstaller" vertraut gemacht und der ganze Ärger über das Löschen von etwas verschwand + die Gewissheit, dass die Registry von ihren Aktivitäten bereinigt wurde.

 
GygaByte:


Wenn ich mich nicht irre, wird return(0) einfach die aktuelle Funktion start() beenden und auf den nächsten Tick warten. Ich brauche den EA, um seine Arbeit zu beenden, als ob ich ihn manuell vom Diagramm abgetrennt hätte.

Ich habe es in der Praxis überprüft - bei jedem Tick gibt es die Meldung "Offene Aufträge - 0".

Ich habe nicht auf das geschätzte "Tschüss" gewartet.

Ihr Wunsch erinnert an den "Damespiel"-Witz. Wenn Sie möchten, dass der EA den Handel stoppt, dann wird durch die Aktivierung des (globalen) Flags (nach einigen Bedingungen), die Unterbrechung der start()-Funktion (Exit über Return) das erwartete Ergebnis liefern.
 
ALXIMIKS:

Einige bösartige Programme (ich hatte mail.ru) verteilen die Zugriffsrechte neu und sorgen dafür, dass Sie mit Administratorrechten keinen Zugriff auf deren Löschung haben.

Das Problem wurde durch die wissenschaftliche Methode der Neuverteilung von Berechtigungen gelöst ( PCM auf den Ordner, Eigenschaften, Sicherheit, ändern, hinzufügen, optional, Arten von Objekten, suchen.......)

Aber dann habe ich mich mit dem "Revo Uninstaller" vertraut gemacht und der ganze Ärger über das Löschen von etwas verschwand, sowie die Gewissheit, dass die Registry von ihren Aktivitäten bereinigt wurde.

Herzlichen Dank! Ich werde mich mit Revo Uninstaller vertraut machen.
 
TarasBY:
Ihr Wunsch erinnert an den "Zeichner"-Witz. Wenn Sie möchten, dass der Advisor den Handel stoppt, dann wird die Unterbrechung der Funktion start() durch die Aktivierung des (globalen) Flags (nach einigen Bedingungen) das erwartete Ergebnis bringen (Beenden über Return).

So sieht es ungefähr aus:

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);
}
//+------------------------------------------------------------------+