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

 
dimnik:

Mit der Verwendung von OnTradeTransaction hat sich die Optimierungszeit merkwürdigerweise verändert. Ein System auf 15M, sehr einfach, Jahresverlauf, ein Lauf erfolgt in 0,3 - 0,4 Sekunden.

Nach dem Optimierungsstart gehen die ersten 200-300 Läufe unter einer Sekunde, die nächsten verlangsamen sich auf 15-20 Sekunden (50 Mal!);

Kein Überhitzen des Prozessors oder Trolling, mehr als die Hälfte des Speichers ist frei (von 16 GB).

Vor der Verwendung des OnTradeTransaction-Handlers gab es nichts dergleichen - selbst komplexere Expert Advisors auf kleinen Timeframes wurden mit ungefähr der gleichen Geschwindigkeit optimiert.

Wirkt sich HistoryDealSelect so stark auf die Geschwindigkeit aus? Wie können wir die Verzögerungen beseitigen?

void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   if( trans.type != TRADE_TRANSACTION_DEAL_ADD) return;
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   long     deal_type         =0;
   double   deal_volume       =0;
   long     deal_magic        =0;
   if(HistoryDealSelect(trans.deal))
     {
      deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
      deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
      deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
     }
   else
      return;
   if (deal_type == DEAL_TYPE_BUY && deal_magic == MagicNumber) current_position += deal_volume;
   if (deal_type == DEAL_TYPE_SELL && deal_magic == MagicNumber) current_position -= deal_volume;
      
  }


Zeigen Sie mir den gesamten Code.
 

Hallo!

Wer weiß, wie man die Balken rechts vom Null-Balken im Indikator anzeigt und wie viele maximal? (Preisprognose zu erstellen)

 
dimnik:

Ist es HistoryDealSelect, das die Geschwindigkeit negativ beeinflusst? Wie kann die Verlangsamung beseitigt werden?

Die Entwickler empfehlen, den (teuren) Aufruf von History-Funktionen zu minimieren - durch History-Caching.

Ich habe eine funktionierende Lösung in kodobase gepostet (MT4Orders), aber sie wird Ihnen wahrscheinlich nicht passen.

Ich habe nach der Verwendung von Caching keine Verzögerungen festgestellt.

Trotzdem sollte Ihre OnTradeTransaction nicht langsamer werden, auch wenn sie nicht optimal geschrieben ist.

 
Renat Akhtyamov:

Hallo!

Wer weiß, wie man die Balken rechts vom Null-Balken im Indikator anzeigt und wie viele maximal? (Preisprognose zu erstellen)

Fügen Sie PeriodSeconds() zur Eröffnungszeit des letzten Balkens hinzu und zeichnen Sie dort eine Kerze mit grafischen Objekten. Der Höchstbetrag wird auf der rechten Seite angezeigt. Aber ich habe nicht überprüft, wie es angezeigt wird, wenn es einen Ausgang gibt. Wahrscheinlich sollte sie selbst berücksichtigt werden.
 
Alexey Viktorov:
Fügen Sie PeriodSeconds() zur Eröffnungszeit des letzten Balkens hinzu und zeichnen Sie dort eine Kerze mit grafischen Objekten. Sie wird höchstens auf der rechten Seite sichtbar sein. Aber ich habe nicht überprüft, wie es angezeigt wird, wenn es einen Ausgang gibt. Wahrscheinlich sollte man das berücksichtigen.
Danke, ich hab's schon!
 
Alexey Viktorov:
Fügen Sie PeriodSeconds() zur Eröffnungszeit des letzten Balkens hinzu und zeichnen Sie die Kerze dort. Sie sehen es höchstens auf der rechten Seite. Aber ich habe sein Aussehen nicht überprüft. Wahrscheinlich ist es notwendig, dies zu berücksichtigen.

Auf dem Chart zeichnet er eine Fortsetzung, aber leider nicht im Indikatorfenster.

Vielleicht liege ich ja falsch...

Was meinen Sie - kann ich die Indikatorlinie über den Nullstrich hinaus nach rechts fortsetzen?

 
Wer weiß - ist es möglich, die Indikatorlinie über den Nullstrich hinaus nach rechts fortzusetzen?
 
Renat Akhtyamov:
Wer weiß - kann die Indikatorlinie über den Nullstrich hinaus nach rechts verlängert werden?
Sie können. Es ist möglich, eine Verschiebung einzustellen, aber es wird wahrscheinlich nicht möglich sein, mit nicht existierenden Werten zu rechnen, und der Indikator verwendet keine Zeit. Aus diesem Grund habe ich über die Anzeige von Balken mit grafischen Elementen gesprochen. Die Funktion ObjectCreate() enthält sowohl die Fensternummer (Unterfenster) als auch die Zeit. Bei der Erstellung grafischer Elemente sollte es keine Probleme geben.
 
Alexey Viktorov:
Sie können. Sie können sie verschieben, aber die Berechnung wird wahrscheinlich nicht mit nicht vorhandenen Werten durchgeführt und die Zeit wird nicht in der Anzeige verwendet. Aus diesem Grund habe ich über die Anzeige von Balken mit grafischen Elementen gesprochen. Die Funktion ObjectCreate() enthält sowohl die Fensternummer (Unterfenster) als auch die Zeit. Daher sollte es bei der Erstellung grafischer Elemente keine Probleme geben.

Im Diagrammfenster können Sie mit Hilfe der Zeitstempel auf die in der Zukunft liegenden Balken verweisen. Es hat funktioniert.

Im Indikatorfenster kann ich jedoch nicht dasselbe tun. D.h. ich kann keine Werte in den Indikatorpuffer mit dem Index -1, -2, etc. schreiben.

Die Frage ist folgende.

Das ist im Prinzip klar. Die Lösung besteht darin, einen Indikator aus grafischen Objekten zu erstellen.

 
Renat Akhtyamov:

Im Diagrammfenster können Sie mit Hilfe der Zeitstempel auf die in der Zukunft liegenden Balken verweisen. Es hat funktioniert.

Im Indikatorfenster kann ich jedoch nicht dasselbe tun. D.h. ich kann keine Werte in den Indikatorpuffer mit dem Index -1, -2, etc. schreiben.

Die Frage ist folgende.

Im Prinzip ist das klar. Die Lösung besteht darin, den Indikator durch grafische Objekte zu erstellen.

Berechnen Sie den zweiten Puffer auf seine normalen Werte, zum Beispiel (wenn wir 10 Balken berechnen wollen, um "future" anzuzeigen), dann berechnen Sie diesen Puffer auf die Werte Buff[9] -- Buff[8] -- Buff[n] -- Buff[0], und zeigen Sie diesen Puffer dann mit einem Offset ungleich Null an. Stellen Sie den Pufferversatz auf die gewünschte Anzahl von Takten in der Zukunft ein - in diesem Fall 10