Diskussion zum Artikel "Das MQL5-Kochbuch: Steuerelemente des Indikatorunterfensters - Die Schaltflächen" - Seite 6

 
tol64:

Nicht notwendigerweise jede Sekunde, es gibt eine Alternative auf einem anderen Ereignis dort (bereits diskutiert). Bitte geben Sie mir ein Beispiel, wie ich es hier gemacht habe. ) Ausgehend von der Bedingung, dass der Expert Advisor dieses Ereignis benötigt, der Indikator aber nicht. So wird es klarer.

P.S. Korrektur. Ich habe einen Fehler gemacht. )) Ihre Variante ist nicht mehr korrekt. Sie passt überhaupt nicht. Es ist also besser, ein Beispiel zu geben, das auf der obigen Bedingung basiert.

Wenn der Indikator dieses Ereignis nicht benötigt, verarbeitet er es einfach nicht. Außerdem sollte der Expert Advisor keine Ereignisse deaktivieren, die er nicht braucht. Er kann sie einschalten, aber nicht ausschalten. Denn es geht ihn nichts an, welche Ereignisse durch sein Fenster laufen und wer sie brauchen könnte.

 
C-4:

Wenn der Indikator dieses Ereignis nicht benötigt, verarbeitet er es einfach nicht. Auch sollte der Expert Advisor keine Ereignisse deaktivieren, die er nicht benötigt. Er kann sie einschalten, aber nicht ausschalten. Denn es geht ihn nichts an, welche Ereignisse durch sein Fenster laufen und wer sie brauchen könnte.

Der Punkt ist, dass dieses Ereignis unbearbeitet sein kann (man kann es einfach vergessen). Das bedeutet aber nicht, dass die Ereignis-Warteschlange in der OnChartEvent()-Funktion nicht mit Dingen gefüllt wird, die zu einem bestimmten Zeitpunkt nicht benötigt werden.

Und das bedeutet Tausende von unnötigen Ereignissen pro Minute. Und wenn es mehrere Programme auf dem Diagramm gibt? Kein Argument?

Es werden viel weniger Ressourcen verschwendet, wenn Sie sogar jede Sekunde prüfen, ob ein Ereignis aktiviert ist, und es aktivieren, wenn es derzeit nicht aktiviert ist, aber benötigt wird. Auch kein Argument? Dann machen Sie es auf Ihre Art.

Ich habe keine Argumente mehr. ) Ich bleibe bei meiner Meinung, denn ich habe nichts gehört, was meine Meinung ändern könnte.

Nun gut. Dann habe ich eine Frage an diejenigen, die der Meinung sind, dass dieses Ereignis nicht durch das Programm, das es aktiviert hat, deaktiviert werden muss.

Warum eigentlich? )

Das ist so:

1. Warum etwas belassen, das nicht benötigt wird (Tausende von Ereignissen pro Minute)?

2. (in einer anderen Formulierung) Warum mehr Ressourcen ausgeben, wenn man weniger ausgeben kann?

Optionen wie "wenn ein Ereignis nicht benötigt wird, dann verarbeite es einfach nicht" gefallen mir persönlich überhaupt nicht. Das eine kann man nicht abschalten, das andere auch nicht, und was hat man dann davon?

 

Sehr geehrter Autor des Artikels, Sie versuchen vergeblich, die inneren Widersprüche Ihrer Produkte zu erklären, die Sie zu bekämpfen und "Anfängern" beizubringen versuchen.

Also, der Autor hat die schlüpfrigen Momente gezeigt, die die korrekte Arbeit seines Indikators stören können. Gut, jetzt ist es für den "Anfänger" klar:

  1. Wenn man ein Programm aus dem Diagramm löscht, sollte man daran denken, andere Programme nicht zu beschädigen.
  2. Auf keinen Fall sollten Sie widersprüchliche Programme auf einem Chart platzieren, sondern besser in anderen Fenstern des Charts des betreffenden Symbols. Wer das nicht weiß, kann mit einem Symbol eine ausreichende Anzahl von Chartfenstern öffnen.
  3. Jeder Chart hat seine eigenen Eigenschaften. Wenn Sie diese ändern, können Sie daher die korrekte Arbeit anderer Programme stören. Dies sollte unter keinen Umständen geschehen!
  4. Es muss "narrensicher" sein. Das heißt, wenn ein Virus in Form eines Indikators oder eines anderen Programms versucht, die Eigenschaften eines Charts, das Sie in Ihren Programmen verwenden, zu verändern, müssen Sie dies überprüfen. Und wenn dies regelmäßig geschieht - entfernen Sie den Virus!
  5. Fehler in Programmen für die Finanzmärkte führen meist zu großen Verlusten. Vergessen Sie das nicht!
 
tol64:

1. Warum sollte man das, was man nicht braucht (Tausende von Ereignissen pro Minute), stehen lassen?

2. (in einer anderen Formulierung) Warum mehr Ressourcen ausgeben, wenn man weniger ausgeben kann?

Optionen wie "wenn ein Ereignis nicht benötigt wird, dann verarbeite es einfach nicht" gefallen mir persönlich überhaupt nicht. Man kann weder das eine noch das andere abschalten und was hat man davon?

Sie erhalten einen vollständig kontrollierten Code.

Sie betonen die Leistung, aber sinkt sie so sehr mit diesem aktivierten Ereignis? Um diese Frage zu beantworten, habe ich eigens einen einfachen Expert Advisor geschrieben, der dieses Ereignis testet. Nachdem ich verschiedene Kombinationen getestet habe, erhielt ich die folgende Tabelle:

Modus
% CPU-Auslastung
EVENT_MOVE_MOUSE ist aktiviert, die Verarbeitung dieses Ereignisses im Expert Advisor ist aktiviert.9%
EVENT_MOVE_MOUSE ist aktiviert, die Verarbeitung dieses Ereignisses im Expert Advisor ist deaktiviert.
6%
EVENT_MOVE_MOUSE ist ausgeschaltet, die Verarbeitung dieses Ereignisses im Expert Advisor ist ausgeschaltet.
5-6%
Der Expert Advisor ist ausgeschaltet. Der Chart ist geschlossen. Bewegen Sie einfach die Maus über das MetaTrader-Fenster.
5-6%

Wie Sie sehen, steigt die tatsächliche Last nur dann an, wenn die eigentliche Verarbeitung dieses Ereignisses stattfindet. Es ist bemerkenswert, dass MetaTrader, gemessen an der CPU-Last, die Mausposition verfolgt, unabhängig davon, ob das Abonnement für dieses Ereignis aktiviert ist oder nicht. Im Allgemeinen stellt sich heraus, dass es sinnlos ist, hypothetische Ressourcen zu sparen, da die Mausverfolgung ohnehin durchgeführt wird.

Testen Sie den Code des Expert Advisors:

//+------------------------------------------------------------------+
//|Test.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. | |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ObjectCreate(0, "Edit", OBJ_EDIT, 0, 0, 0);
   ObjectSetInteger(0, "Edit", OBJPROP_XSIZE, 400);
   //Das Ereignis nach eigenem Ermessen ein- und ausschalten
   ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, false);
   
//---
   return(INIT_SUCCEEDED);
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   //Kommentieren Sie den Block, wenn es nicht notwendig ist, das eingehende Ereignis zu verarbeiten.
   if(id == CHARTEVENT_MOUSE_MOVE)
   {
      string label = (string)lparam + " " + (string)dparam + " " + sparam;
      //printf(sparam);
      ObjectSetString(0, "Edit", OBJPROP_TEXT, label);
      ChartRedraw(0);
   }
}
Знакомство с MQL5: написание простого советника и индикатора
Знакомство с MQL5: написание простого советника и индикатора
  • 2010.03.16
  • Denis Zyatkevich
  • www.mql5.com
В этой статье проведен краткий обзор языка MQL5, приведен пример написания советника и индикатора. Данная статья ориентирована как на читателей, знакомых с программированием на языке MQL4, так и на тех, кто только начинает знакомство с программированием торговых систем и индикаторов.
 

1. Sie sollten immer den Fall in Betracht ziehen, dass ein Ereignis auf dem Stapel ausgelassen wird. Wenn in dem Fall, in dem ein Ereignis ausgelassen wird, etwas Kritisches passieren kann, ist das sehr schlecht.

2. Die Anpassung des Charts an die eigenen Bedürfnisse ist schlecht. Das ist in etwa so, als würde man mit einer automatischen Handelsmaschine ohne Magie handeln.

 
DC2008:

Sehr geehrter Autor des Artikels, Sie versuchen vergeblich, die inneren Widersprüche Ihrer Produkte zu erklären, die Sie zu bekämpfen und "Anfängern" beizubringen versuchen.

Also, der Autor hat die schlüpfrigen Momente gezeigt, die die korrekte Arbeit seines Indikators stören können. Gut, jetzt ist es für einen "Anfänger" klar, dass:

...

Sie können sich noch 20 weitere Regeln einfallen lassen, um Ihre Selbstherrlichkeit zu rechtfertigen, und dann werden Sie sich definitiv selbst verwirren und Anfängern "helfen". Widersprüche und Missverständnisse wurden in diesem Fall von Ihnen beobachtet. )

C-4:

Sie werden einen vollständig kontrollierten Code erhalten.

...

Er wird kontrolliert, wenn Sie ihn kontrollieren. In diesem Fall schlagen Sie vor, alles unkontrolliert zu lassen, d.h. ein Ereignis zu lassen, das im Moment nicht benötigt wird und sehr oft reproduziert werden kann. Bei einfachen Beispielen fällt es vielleicht nicht auf. Vielleicht werden Sie bei komplexeren Programmen die Notwendigkeit erkennen, alles zu deaktivieren, was nicht benötigt wird.

 
TheXpert:

1. Sie sollten immer den Fall in Betracht ziehen, dass ein Ereignis auf dem Stapel ausgelassen wird. Wenn in dem Fall, in dem ein Ereignis ausgelassen wird, etwas Kritisches passieren kann, ist das sehr schlecht.

...

Zum Beispiel, wenn die Ereigniswarteschlange überläuft?
 

tol64:

Verzeihung, störe ich Sie zufällig beim Schreiben eines weiteren Tutorials oder Rezepts?

Wenn nicht, lassen Sie uns weiter über Ihren Artikel über die Steuerung im Unterfenster des Indikators diskutieren. Sie bieten also eine Massenlösung (oder eine Idee) an, wie man ein bequemes Menü in einem Indikator erstellen kann. Gut, der Zweck des Artikels ist sehr würdig! Aber wie kann ein "Anfänger" Programmierer verwenden alle dieses Arsenal? Wo kann man benutzerdefinierte Funktionen platzieren? Zeigen Sie es an einem Beispiel. Und erklären Sie gleichzeitig, was Sie im Code ändern müssen, um z. B. 5 Schaltflächen zu verwenden? Betrachten Sie es als eine Anfängerfrage.

 
tol64:
Zum Beispiel, wenn die Ereigniswarteschlange überläuft?
Ja.
 
DC2008:
Sind Sie so sicher, dass alles in Ihrem Artikel perfekt ist?