Fehler, Irrtümer, Fragen - Seite 1520

 
Slawa:

Es gibt noch keinen anderen Weg.

Wir haben diskutiert, einen neuen Exit-Befehl einzuführen, der das Programm sofort beendet, aber hier gibt es noch ungelöste Probleme

Das ist sehr schade. Ja, ein exit() wie in C++ wäre schön. Heutzutage ist es ziemlich problematisch, die Antwort von verschachtelten Funktionen in die aufrufende Funktion zu ziehen. Und es gibt keine Universalbibliotheken.
 
Alexey Kozitsyn:
Das ist sehr schade. Ja, ein exit() wie in C++ wäre schön. Heutzutage ist es ziemlich problematisch, die Antwort von verschachtelten Funktionen in die aufrufende Funktion zu ziehen. Und es gibt keine Universalbibliotheken.
Eine andere Möglichkeit ist, eine Funktion zu erstellen, die alle Objekte eines Programms separat entfernt, und sie aufzurufen, wenn die Bedingung für das Entfernen des Programms aus dem Terminal erfüllt ist, gefolgt vonExpertRemove(), in diesem Fall sollte alles schneller fertig werden... obwohl das nicht sicher ist :)
 
coderex:
Alternativ können Sie eine separate Funktion zum Löschen aller Objekte des Programms erstellen und diese aufrufen, wenn die Bedingung zum Löschen des Programms aus dem Terminal erfüllt ist, gefolgt vonExpertRemove(), in diesem Fall sollte alles schneller erledigt werden... wenn auch nicht mit Sicherheit :)

Wie ich bereits geschrieben habe und in einem Artikel auf dieser Website vorgeschlagen wurde, können Sie im Falle eines Fehlers in einer tief verschachtelten Funktion die Division durch 0 aufrufen oder das Array verlassen. Aber es ist nicht schön.

Ja, und es geht nicht nur um OOP (soweit ich es verstanden habe, meinen Sie es). Ganz einfach: Wenn ein Fehler nicht behoben werden kann, wird das Programm abgebrochen.

 
Slawa:
Hält an, aber nicht sofort
Ich verstehe nicht, ist ExpertRemove() richtig, um mit Indikatoren zu arbeiten oder nicht?
 
Alexey Kozitsyn:
Ich verstehe nicht, ist es richtig, mit ExpertRemove() in Indikatoren zu arbeiten oder nicht?

Ich denke, es gibt eine Funktion für Indikatoren, oder sie ist nicht mehr relevant.

ChartIndicatorDelete();
 
Alexey Kozitsyn:
Ich verstehe nicht, ist es richtig, mit ExpertRemove() in Indikatoren zu arbeiten oder nicht?

Nein. ExpertRemove() wird in den Indikatoren überlagert.

"Hält an, aber nicht sofort" wird über ExpertRemove im Allgemeinen gesagt. Diese Funktion unterbricht den Programmablauf nicht.

 
Slawa:

Nein. ExpertRemove() wird in den Indikatoren überlagert.

"Hält an, aber nicht sofort" wird über ExpertRemove im Allgemeinen gesagt. Diese Funktion unterbricht den Betrieb des Programms nicht.

Gibt es einen Plan, um das Problem mit exit() zu lösen? Oder lösen die Nutzer das Problem mit Hilfe von Krücken?)
 
Slawa:
Bitte nennen Sie ein Beispiel. Geben Sie den Quellcode des Indikators an, um das Problem zu veranschaulichen
Fügen Sie den Text in das OnCalculate des im Redakteur erstellten Standardindikators ein. Platzieren Sie es auf einer beliebigen Karte. Die Funktion des Indikators wird in der oberen linken Ecke des Chart-Fensters angezeigt. Nachdem Sie "Löschen" aus der Liste der Indikatoren ausgewählt haben, wird die Funktion nicht beendet, sondern Sie sehen sie in der oberen linken Ecke. Sie wird auch nach dem Schließen des Fensters fortgesetzt. Nach dem Öffnen eines neuen Fensters wird es in dem neuen Fenster fortgesetzt. Dieses Fenster hat nicht unbedingt das gleiche Symbol wie das, das Sie am Anfang hatten :)
Die Arbeit des Anzeigers endet erst, wenn das Terminal geschlossen wird. Und ich weiß nicht, ob er anhält oder nicht - ich musste nur das Terminal manuell über den Task-Manager entfernen, um es neu zu starten...

Gleichzeitig sagt die Hilfe der IsStopped-Funktion, dass der Programmablauf nach 3 Sekunden gestoppt wird, wenn ein Befehl zum Beenden eines mql-Programms vorliegt.

   int i=0;
   while(true){
      Comment(i++);
      Sleep(100);
   }

Und wenn while(true) durch while(!IsStopped()) ersetzt wird, wird der Indikator erfolgreich beendet, wenn er aus dem Diagramm entfernt wird.

 

Ein lustiger Grund für den internen Compilerfehler (Funktion, die im Indikator verwendet wird):

void SaveData ( uint handle_, int wrdata_, int interv_, string dpath_, int tmode_, int tmult_, long ctime_, long& ltime_ )
{
int ierr, wrtint;
// ----
if ( interv_ > 0 ) // Arbeitsmodus
{
if ( MQLInfoInteger ( MQL_TESTER ) == 0 ) { wrtint = interv_; } // spielt keine Rolle
sonst{ wrtint = interv_ * tmult_; } // spielt keine Rolle
//
if ( ( ctime_ - ltime_ ) >= ( wrtint * 60 ) ) // wenn diese Zeile auskommentiert wird, verschwindet der Fehler
{
// etwas Code zum Speichern der Daten ... hat keine Bedeutung - getestet
//
ltime_ = ctime_; // spielt im Allgemeinen auch keine Rolle
} // wenn ( ( ctime_ - ltime_ ) >= ( wrtint * 60 )
} // wenn ( interv_ > 0 )
// ----
Rückkehr;

} // void SaveData

(Entschuldigung, ich habe die SRC-Schaltfläche absichtlich nicht verwendet, weil ich damit nicht die erforderlichen Textteile auswählen kann)

Die Lösung liegt auf der Hand, aber Sie sollten zustimmen, dass es sich um eine ziemlich lustige Panne handelt. :)))

 

Ein Maklerunternehmen hat eine Provision von 16x2 Dollar für einen Umsatz von 1 Million. Sie haben offenbar in den Servereinstellungen eine Provision von 16 Dollar eingestellt. Und nun wird während des Tests auf ihrem Server die Provision 16x2 von jeder Transaktion abgezogen, unabhängig von ihrer Losgröße, d.h. ein angemessener Test kann nur mit 10 Losen durchgeführt werden.

Liegt es an ihren mangelnden Fähigkeiten beim Einrichten von Servern oder an einer echten Einschränkung von MT5? Was genau kann ich ihnen raten, auf den Servern zu tun, damit die Provision im Tester korrekt verarbeitet wird?