Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 742

 
Klimenko_a_e:

In echtem Code gibt die Funktion ein Objekt zurück.

Der Kopierkonstruktor sollte in diesem Fall meiner Meinung nach eine temporäre Kopie erstellen.

Der Code funktioniert korrekt in MQL5 Build 1545.

In der neuen Version kann der Kopierkonstruktor nicht einmal die Größe eines eindimensionalen Arrays ändern: Fehler 4007.

Ich denke, das ist nicht richtig.

Es fällt mir schwer, in diesem Fall eine eindeutige Aussage zu treffen. Es gibt sehr gute Experten für Ihre Frage, daher empfehle ich Ihnen, sich anhttps://www.mql5.com/ru/forum/1111 zu wenden.

Mit meinen Änderungen funktioniert der Code wie er sollte. Ohne sie ist das nicht der Fall. Aber ob Ihr Code funktionieren sollte oder nicht, ist besser für den Zweig unter dem obigen Link.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Klimenko_a_e:

In echtem Code gibt die Funktion ein Objekt zurück.

Ich denke, der Kopierkonstruktor sollte in diesem Fall eine temporäre Kopie erstellen.

Der Code funktioniert korrekt in MQL5 Build 1545.

In der neuen Version kann der Kopierkonstruktor nicht einmal die Größe eines eindimensionalen Arrays ändern: Fehler 4007.

Dies ist meiner Meinung nach nicht korrekt.


Der Fehler wurde in Build 1580 behoben, danke, alles funktioniert wie es sollte).
 
fxsaber:

Es ist schwierig für mich, in diesem Fall etwas Definitives zu sagen. Es gibt sehr gute Experten für Ihre Frage, daher empfehle ich Ihnen, sich an die Geschäftsstellehttps://www.mql5.com/ru/forum/1111 zu wenden.

Mit meinen Änderungen funktioniert der Code wie er sollte. Ohne sie ist das nicht der Fall. Aber ob Ihr Code funktionieren sollte oder nicht, sollten Sie besser auf den Zweig unter dem obigen Link verweisen.


Danke für den Link.
 

Vielleicht kann mir jemand einen Tipp geben.

Ich kann nicht herausfinden, wie ich die Ausführung des EA unterbrechen kann, nachdem ich die Eingabeeinstellungen manuell geändert habe.

1) Führen Sie den EA-Code wie folgt auf dem Chart aus:

#property version   "1.00"

input int Setting_ = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   Print ("OnInit:",Setting_);
   
   return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Print ("OnDeinit(",reason,"):",Setting_);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

2) Öffnen Sie das Einstellungsfenster und setzen Sie den Parameter "Setting_" auf 1.

3) Und übernehmen Sie die Änderungen.

Um mit der Anwendung der Änderungen zu beginnen, muss OnInit ausgeführt werden, aber OnInit wird erst ausgeführt, wenn die Berechnungen in OnTick (oder einem anderen) beendet sind.

Soweit ich weiß, gibt es nur eine Prüfung für dasAnhalten des Programms durch _StopFlag - Flagge zum Anhalten des mql5-Programms, aber nur für das vollständige Beenden. Aber ich weiß nicht, wie ich verstehen soll, dass die Eingabeeinstellungen geändert wurden, um die Berechnungen zu stoppen.

Vielleicht war jemand schon einmal in einer solchen Situation? Vielleicht gibt es einen geheimen Hack?

 
Marat Sultanov:

Vielleicht kann mir jemand einen Tipp geben.

Ich kann nicht herausfinden, wie ich die Ausführung des EA unterbrechen kann, nachdem ich die Eingabeeinstellungen manuell geändert habe.

1) Führen Sie den EA-Code wie folgt auf dem Chart aus:

2) Öffnen Sie das Einstellungsfenster und setzen Sie den Parameter "Setting_" auf 1.

3) Und übernehmen Sie die Änderungen.

Um mit der Anwendung der Änderungen zu beginnen, muss also OnInit ausgeführt werden, aber OnInit wird erst ausgeführt, wenn die Berechnungen in OnTick (oder in einem anderen Programm) beendet sind.

Soweit ich weiß, gibt es nur eine Prüfung für dasAnhalten des Programms durch _StopFlag - Flagge, um ein mql5-Programm zu stoppen, aber es ist nur für den vollständigen Ausgang. Aber ich weiß nicht, wie ich verstehen soll, dass die Eingabeeinstellungen geändert wurden, um die Berechnungen zu stoppen.

Vielleicht war jemand schon einmal in einer solchen Situation? Vielleicht gibt es einen geheimen Hack?

Überprüfen Sie den Deinitialisierungscode in OnInit()

Ursachen für die Deinitialisierung

Die von UninitializeReason() zurückgegebenen Deinitialisierungsgrundcodes von Expert Advisor. Sie können einen der folgenden Werte annehmen:

Konstant.

Wert

Beschreibung

ANLASS_PROGRAMM

0

Der Experte hat seine Arbeit durch den Aufruf von ExpertRemove() beendet

REASON_REMOVE

1

Programm aus der Tabelle entfernt

REASON_RECOMPILE

2

Programm neu kompiliert

REASON_CHARTCHANGE

3

Das Diagrammsymbol oder die Periode wurde geändert

REASON_CHARTCLOSE

4

Das Diagramm ist geschlossen

GRUND_PARAMETER

5

Eingabeparameter wurden vom Benutzer geändert

REASON_ACCOUNT

6

Ein anderes Konto wurde aktiviert oder erneut mit dem Handelsserver verbunden, weil die Kontoeinstellungen geändert wurden

GRUND_VORLAGE

7

Eine weitere Diagrammvorlage wurde angewendet

REASON_INITFAILED

8

Ein Zeichen, dass der OnInit()-Handler einen Wert ungleich Null zurückgegeben hat

REASON_CLOSE

9

Terminal wurde geschlossen

 
Artyom Trishkin:

Überprüfung des Deinitialisierungscodes in OnInit()

...

Ähm ... Du verstehst mich nicht :)

Sie müssen innerhalb der Funktion (z. B. inOnTick) wissen, dass der Benutzer die Eingabeparameter geändert hat, d. h. Sie müssen wissen, dass es an der Zeit ist, die Funktion zu beenden und das Programm zu OnDeinit übergehen zu lassen.

 
Marat Sultanov:

Ähm ... Du missverstehst mich :)

Sie müssen innerhalb der Funktion (z. B. inOnTick) wissen, dass der Benutzer die Eingabeparameter geändert hat, d. h. Sie müssen wissen, dass es an der Zeit ist, die Funktion zu beenden und das Programm in OnDeinit enden zu lassen.

Sobald ein Benutzer das EA-Einstellungsfenster (F7) aufruft und dort die OK-Schaltfläche drückt, wird sofort OnDeinit() aufgerufen, das seinerseits den Wert REASON_PARAMETERS in den Deinitialisierungscode schreibt. Dann wird OnInit() aufgerufen, wo man mitUninitializeReason() den Deinitialisierungscode überprüfen kann und, wenn sein Wert gleichREASON_PARAMETERSist , entscheiden kann, was als nächstes zu tun ist.
 
Artyom Trishkin:
Sobald ein Benutzer das EA-Einstellungsfenster (F7) aufruft und dort auf den OK-Button klickt, wird sofort OnDeinit() aufgerufen, das seinerseits den Wert von REASON_PARAMETERS in den Deinitialisierungscode schreibt. Dann wird OnInit() aufgerufen, wo man mit UninitializeReason() den Deinitialisierungscode überprüfen kann und, wenn sein Wert gleichREASON_PARAMETERSist , entscheiden kann, was als nächstes zu tun ist.

Also gut.

Ich bitte Sie:

1) Führen Sie zunächst meinen Code aus, den ich in meinem ersten Beitrag angegeben habe. Ich habe es nicht um der Schönheit willen dort angebracht... Sie können es auf jeder Karte ausführen.

2) Rufen Sie das EA-Einstellungsfenster auf.

3) Ändern Sie den Parameter und drücken Sie OK.

Wenn Sie sich meinen Code genau ansehen, dann wird Sie das Ergebnis nicht überraschen: OnDeinit() wird nicht aufgerufen.

 

Nicht nur das, ich habe auch einen Ausdruck im Deinit hinzugefügt, sowohl den Grund als auch den Parameter, so dass Sie sicherstellen können, dass der Experte das Deinit NICHT erreicht.

Bitte beachten Sie den wichtigsten Teil des Codes:

void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

Es ist eine klare Emulation einer langen Berechnung, die nicht durch eine Änderung der Eingabeparameter unterbrochen wird. Und ich muss sie unterbrechen, und die Frage ist, wie? :)

Ich möchte nur sicherstellen, dass ich nicht etwas in MQL5 fehlt, und es gibt wirklich nichts anderes in der Sprache als_StopFlag, die leider nicht diese Situation lösen.

Grob gesagt, muss ich den Moment abfangen, in dem sich die Eingabeparameter während einer umfangreichen Berechnung ändern.

 
Marat Sultanov:

Nicht nur das, ich habe auch einen Ausdruck im Deinit hinzugefügt, sowohl den Grund als auch den Parameter, so dass Sie sicherstellen können, dass der Experte das Deinit NICHT erreicht.

Bitte beachten Sie den wichtigsten Teil des Codes:

Es ist eine klare Emulation einer langen Berechnung, die nicht durch eine Änderung der Eingabeparameter unterbrochen wird. Und ich muss sie unterbrechen, und die Frage ist, wie? :)

Ich möchte nur sicherstellen, dass ich nicht etwas in MQL5 fehlt, und es gibt wirklich nichts anderes in der Sprache als_StopFlag, die leider nicht diese Situation lösen.

Grob gesagt, muss ich den Moment abfangen, in dem sich die Eingabeparameter während einer umfangreichen Berechnung ändern.

Grob gesagt - lesen Sie noch einmal genau, was ich Ihnen geschrieben habe, und lassen Sie die Endlosschleife aus Ihrem Code.

Sind Sie sicher, dass es die richtige Lösung ist, den Expert Advisor in eine Endlosschleife zu schicken?

Grund der Beschwerde: