Diskussion zum Artikel "MQL5 für Anfänger: Antivandalismusschutz der grafischen Objekten"

 

Neuer Artikel MQL5 für Anfänger: Antivandalismusschutz der grafischen Objekten :

Was soll Ihr Programm machen, wenn die grafischen Bedienfelder von jemandem geändert oder gelöscht wurden? In diesem Artikel zeigen wir Ihnen, wie Sie nach der Löschung der Anwendung auf dem Chart keine "herrenlose" Objekte mehr haben können, und wie sie die Kontrolle über sie halten können, falls sie umbenennt werden oder wenn vom Programm erstellte Objekte gelöscht werden.

Der Zweck des erwähnten Indikators: ist der, dass es beim Klick auf ein Chart des Objekts den Namen des Objekts zeigt, dessen Erstellungszeit und Typ (abgesehen von seiner eigenen). Falls es erforderlich ist, können Sie diese Werte aus den Feldern kopieren, wo sie angezeigt werden. Beim Versuch die angezeigten Werte aus dem Feld zu ändern oder zu entfernen, ist ihre Wiederherstellung vorgesehen. Dies gilt unabhängig von den Varianten, die in dem Artikel betrachtet werden, geht jedoch als Ergänzung zu ihnen.

Darüber hinaus gibt es noch die folgenden Funktionen:

  • Die "Minimierung" des Hauptteils des Felds auf dem Chart;
  • "Selbstwiederherstellung" der Objekte, wenn ein Objekt des Feldeshauptteils geändert oder gelöscht wurde;
  • "Self-departure" eines Indikators aus dem Chart, wenn die Schaltfläche des minimierten Felds gelöscht oder nach dem folgenden Prinzip geändert wurde: "wenn es minimiert wurde, dann ist es im Moment nicht sehr benötigt";
  • Die letzten beiden Maßnahmen werden unter Berücksichtigung realisiert, dass die Objekte nach einer möglichen Umbenennung aus dem Chart gelöscht werden müssen;
  • Der Titel vom Feld wird in russischer Sprache angezeigt, wenn das Terminal in Russisch ist, genauso wenn es in Englisch ist, und genauso ist es für jede andere Sprache.

Das Aussehen eines Bedienfeldes im Zusammenhang von der Sprache des Terminals

in Abb. 7. Das Aussehen eines Bedienfeldes im Zusammenhang von der Sprache des Terminals

Autor: Dina Paches

 

Sehr guter Artikel, ich schütze Programme vor solchem Vandalismus auf eine etwas andere Weise ...

Ich erstelle alle notwendigen Objekte mit einem Präfix außerhalb der Chart-Sichtbarkeit in einer speziellen Funktion wie CREATE_OBJECTS(),

dann prüfe ich den Fehler 4202 ERR_OBJECT_DOES_NOT_EXIST Objekt existiert nicht, und wenn es einen solchen Fehler gibt, rufe ich die Funktion CREATE_OBJECTS() erneut auf.

Die übrigen Objekteigenschaften werden je nach Bedarf im Diagramm geändert.

 

Gut gemacht. Der Artikel ist gut. Die Beispiele sind nicht schlecht.

Aber es scheint eine einfache Möglichkeit zu geben, das Vorhandensein eines Objekts zu überprüfen, und man kann es bei Bedarf jederzeit wiederherstellen.

 
Victor Nikolaev:

Es scheint jedoch eine einfache Möglichkeit zu geben, die Existenz eines Objekts zu überprüfen, und es kann bei Bedarf immer wieder hergestellt werden.

Der Trick besteht darin, die Anzahl der Prüfungen auf ein Minimum zu reduzieren, anstatt sie ohne Unterbrechung durchzuführen. Zu diesem Zweck werden sie an ein bestimmtes Ereignis gebunden. Wenn ich das richtig verstanden habe. Es ist schade, dass all dies nicht an die Standardbibliothek gebunden ist
 

Vielen Dank für Ihr Feedback!

Victor Nikolaev:

Gut gemacht. Der Artikel ist gut. Die Beispiele sind nicht schlecht.

Aber es scheint eine einfache Möglichkeit zu geben, das Vorhandensein eines Objekts zu überprüfen, und man kann es bei Bedarf jederzeit wiederherstellen.

Vielen Dank, Victor!

Nur für den Fall, dass ich sage, dass die angegebenen Varianten nicht im Gegensatz zu den üblichen gewohnten Wegen (einfach oder nicht so einfach) stehen.

Es ist nur so, dass die üblichen gewohnten Wege (einfach oder nicht so einfach) vielleicht nicht immer "zeitgemäß" sind. Zumal die verschiedenen "bösen Hände" nicht abgestellt wurden. Einschließlich, und vielleicht in einigen Fällen unsere eigenen oder Benutzer der.

D.h., wenn z.B. die Objekte des Bedienfeldes des Programms versehentlich über die"Objektliste " zusammen mit anderen Selektionen per Shift oder durch ein Fremdprogramm gelöscht werden, wobei die Funktion zum Löschen von Objekten(ObjectsDeleteAll() oder eigenständig erstellt) verwendet werden kann, die nach den in ihr eingestellten Parametern abläuft:
.

  • Gesamtlöschung aller Arten von grafischen Objekten im selben Fenster/Unterfenster, in dem sich die manuell oder mit Hilfe anderer Programme erstellten Objekte befinden;
  • oder Gesamtlöschung von Objekten des Typs, die auch in der Systemsteuerung Ihres Programms vorhanden sind;
  • oder das Löschen mit einem Präfix, das mit dem Präfix von Objekten in Ihrem Programm übereinstimmt,

dann können die in diesem Artikel beschriebenen Optionen sehr hilfreich sein, um auf die jeweilige Situation zu reagieren. In einigen Fällen können Sie sich dadurch auch von einigen unnötigen "Bewegungen" befreien. Ich glaube, dass diese Optionen universell einsetzbar sind und, wenn nötig, mit anderen "schmerzlos und konfliktfrei" kombiniert werden können.

Irgendwie.

D.h. zum "Schutz" von Programmobjekten können natürlich verschiedene Optionen, Methoden und deren Kombinationen angewendet werden.

Und die im Artikel beschriebenen sind nicht für jeden Code zwingend erforderlich, sondern solche, die in manchen Fällen nicht überflüssig sein können.

Alexander Puzanov:
Der Trick besteht darin, die Anzahl der Prüfungen auf ein Minimum zu reduzieren, anstatt Prüfungen ohne Unterbrechungen durchzuführen. Zu diesem Zweck werden sie an ein bestimmtes Ereignis gebunden. Wenn ich das richtig verstanden habe.

Ja, danke, das stimmt, die Verringerung der Anzahl der Verarbeitungen während der Prüfungen ist einer der Chips dort.

 

Dieser Artikel ist völlig überflüssig.

1. Er ist definitiv nicht für Anfänger geeignet

2. Es ist nicht MQL5 - es ist MQL4!

3. Die Art der Kodierung ist total kompliziert und - im Hinblick auf MQL5 - sowieso völlig falsch.

Wenn man meint, es sei ein Problem, dass ein anderer EA oder Indikator Objekte zerstören könnte, kann man das viel effizienter und eleganter machen:

- Definieren Sie für jedes Chart-Objekt ein MQL-Objekt, so wie es die Standard-Control-Bibliothek bereits tut. Jedes dieser MQL-Objekte repräsentiert ein Chart-Objekt und enthält alle seine Daten - normaler MQL5-Stil.

- Packen Sie alle Objekte in einen Master-Container

- Nur der Master-Container prüft, ob ein Diagrammobjekt gelöscht wurde, entweder von Zeit zu Zeit oder durch das entsprechende Diagramm-Ereignis während OnChartEvent().

- Hinzufügen einer .ReCreate()-Mitgliedsfunktion zu CWnd und einer virtuellen OnRecreate()-Funktion zu allen Objekten, die diese Funktionalität implementieren

- Wenn der Master-Container eine Art von "Vandalismus" feststellt, sendet er ein .ReCreate() an alle seine Kindobjekte

Erledigt.

 

Ich verstehe nur wenig Englisch. Ich habe die englische Version dieses Artikels nicht gelesen.

Entschuldigung, aber...haben Sie den Artikel vollständig gelesen?

Sprichst du Russisch?

Wenn Sie Russisch sprechen, dann können Sie und ich bei der Diskussion in der russischen Version dieses Artikels konstruktiver reden.


Doerk Hilger:

Dieser Artikel ist völlig überflüssig.

Sie sind falsch.

Doerk Hilger:

1. Es ist definitiv nichts für Anfänger

Warum glauben Sie das? Erklären Sie mir das bitte etwas genauer.

Doerk Hilger:

2. Es ist nicht MQL5 - es ist MQL4!

Sie liegen falsch.

Aber die in diesem Artikel beschriebenen Schemata können nicht nur für MQL5, sondern auch für MQL4 verwendet werden.

Doerk Hilger:

3. Die Art der Kodierung ist total kompliziert und - im Hinblick auf MQL5 - sowieso völlig falsch.

Пожалуйста прочитайте эту статью "MQL5 для начинающих: Антивандальная защита графических объектов" ещё раз внимательно. И пожалуйста не торопитесь с выводами. Если и после этого ваше мнение не изменится, то напишите более конкретно непонятные для вас моменты.

Bitte lesen Sie diesen Artikel "MQL5 für Anfänger:Vandalismusschutz von Grafikobjekten" noch einmal sorgfältig durch. Und ziehen Sie bitte keine voreiligen Schlüsse. Wenn nach dieser wird nicht Ihre Meinung ändern, schreiben Sie mehr besonders schwierige Momente für Sie.


Doerk Hilger:

Wenn man meint, es sei ein Problem, dass ein anderer EA oder Indikator Objekte zerstören könnte, kann man das viel effizienter und eleganter machen:

- Definieren Sie für jedes Chart-Objekt ein MQL-Objekt, so wie es die Standard-Control-Bibliothek bereits tut. Jedes dieser MQL-Objekte repräsentiert ein Chart-Objekt und enthält alle seine Daten - normaler MQL5-Stil.

- Packen Sie alle Objekte in einen Master-Container

- Nur der Master-Container prüft, ob ein Diagrammobjekt gelöscht wurde, entweder von Zeit zu Zeit oder durch das entsprechende Diagramm-Ereignis während OnChartEvent().

- Hinzufügen einer .ReCreate()-Mitgliedsfunktion zu CWnd und einer virtuellen OnRecreate()-Funktion zu allen Objekten, die diese Funktionalität implementieren

- Wenn der Master-Container eine Art von "Vandalismus" feststellt, sendet er ein .ReCreate() an alle seine Kindobjekte

Erledigt.

В статье "MQL5 для начинающих: Антивандальная защита графических объектов" рассматриваются схемы только двух вариантов (способов) из множества возможных. Но различных вариантов (способов) конечно может быть много.
Применять или не применять схемы из этой статьи - это зависит только от ваших решений.


Скажутолько, что эти две схемы из статьи "MQL5 для начинающих: Антивандальная защита графических объектов" обладают следующими положительными качествами:

  • экономно используют ресурсы компьютера и торгового терминала;
  • имеютвысокий уровень своевременности срабатывания ( невсе другие обычные привычные способы могутбыть своевременными);
  • могутбыть применены совместно со многими другими вариантами (способами).

Эти схемы из данной статьи сконструированы в процедурном стиле. В том числе, чтобы они были более понятны, наглядны и могли послужить идеями для каких-то других вариантов.

Если вам не нравятся эти схемы или они не подходят вам по каким-то другим причинам, вы конечно можете использовать другие схемы. И, естественно, в том стиле программирования, что для вас привычен.

Применять эти схемы из статьи или не применять - это ваше личное дело и право.


In dem Artikel"MQL5 für Anfänger: Anti-Vandalismus-Schutz von grafischen Objekten" sind nur zwei Optionen Schemata (Methoden) von vielen möglichen betrachtet. Aber die Optionen (Methoden) kann eine Menge sein.
Zu verwenden oder nicht zu verwenden, die Schemata aus diesem Artikel - es hängt nur Ihre Entscheidungen.

Ich kann nur sagen, dass diese beiden Schemata aus dem Artikel"MQL5 für Anfänger: Anti-Vandalismus-Schutz von grafischen Objekten" die folgenden positiven Eigenschaften haben:
  • sparsamer Umgang mit den Ressourcen des Computers und des Handelsterminals;
  • sie haben ein hohes Maß an Aktualität der Reaktion (nicht alle anderen üblichen gewohnten Wege können zeitnah sein);
  • sie können in Verbindung mit vielen anderen Methoden verwendet werden.

Diese Schemata wurden in diesem Artikel in einem prozeduralen Stil dargestellt. Insbesondere, um sie verständlicher zu machen, sichtbar und könnte als Ideen für einige andere Optionen dienen.

Wenn Sie diese Schemata nicht mögen oder sie Ihnen aus anderen Gründen nicht passen, können Sie natürlich auch andere Schemata verwenden. Und natürlich in dem Programmierstil, den Sie mögen.

Ob Sie die Schemata aus diesem Artikel verwenden oder nicht - das hängt von Ihren Entscheidungen ab.


Entschuldigung für mein Englisch.


P./S.: Пожалуйста прочитайте эту статью ещё раз внимательно. И пожалуйста не торопитесь с выводами. Если у вас затем будут конструктивные вопросы или предложения, то пишите, пожалуйста. Я смогу ответить вам скорее всего только после новогодних каникул. Это через пять дней.

Bitte lesen Sie diesen Artikel noch einmal sorgfältig durch. Und ziehen Sie bitte keine voreiligen Schlüsse. Wenn Sie konkrete Fragen und Anregungen haben, schreiben Sie mir bitte. Ich kann Ihnen wahrscheinlich erst nach den Neujahrsferien antworten. Das ist in fünf Tagen.

P./S.: Сегодня у нас праздник Нового года. Поэтому и вас поздравляю с наступающим новым 2016-м годом!

Heute haben wir das Neujahrsfest. Deshalb wünschen wir Ihnen ein frohes neues Jahr 2016 !

 

Beim Kompilieren in MetaEditor Version 5.00 build 1241 werden die dem Artikel beigefügten Testcodes mit den Namen:

  • test_Zahl_Klick_0.mq5
  • test_Zahl_Klick_1.mq5
  • test_zähler_klick_2.mq5

Wie zuvor funktionieren sie korrekt, was die Anti-Vandalismus-Funktionen betrifft. Beim Kompilieren im neuen Build habe ich jedoch ein Problem mit einer Funktion gefunden, die nicht zu den Anti-Vandalismus-Maßnahmen aus dem Artikel gehört. Ich habe eine Anfrage an den Service Desk gestellt (#1379624), aber es ist Feiertag, so dass ich natürlich nicht erwarte, eine Antwort oder eine Lösung von dort zu erhalten.

Im Folgenden finden Sie die Beschreibung des Problems, den Lösungsweg und die Dateien mit der Lösung des Problems, die dem Artikel nicht beigefügt sind:

Zunächst möchte ich aber noch einmal betonen, dass die Funktionen, die mit dem Vandalismus zusammenhängen, beim Kompilieren im neuen Build korrekt funktionierten und funktionieren.

Die Fehlerhaftigkeit der genannten Testcodes äußert sich darin, dass beim Anklicken der Bedienfeldobjekte dieser Testcodes die Anzahl der Klicks nicht mehr angezeigt wird, außer bei den allerersten. Das heißt, egal wie viele Schaltflächen angeklickt werden, die Zahlen bleiben gleich:

Die gleichen Testcodes, die in früheren Versionen kompiliert wurden,funktionierenjedoch auch in der neuen Version1241 korrekt, wenn sie dort nicht kompiliert wurden. Das heißt, wenn man auf die Objekte dieser Testcodes klickt, werden die Klicks normal gezählt:

Ichhabe herausgefunden, dass das festgestellte Problem mit der Anwendung der Funktion ArrayFill() im Ereignisverarbeitungsblock CHARTEVENT_OBJECT_CLICK in OnChartEvent() zusammenhängt.

               count=countClick[index]+count;
               int summ=countClick[NUMBER_ALL]+1;
               //---
               ArrayFill(countClick,index,1,count);
               ArrayFill(countClick,NUMBER_ALL,1,summ)

Wenn Sie jedoch Datenausdruck oder ChartRedraw() vor diese Funktion setzen, funktionieren die genannten Codes aus dem Artikel nach der Kompilierung korrekt:

               count=countClick[index]+count;
               int summ=countClick[NUMBER_ALL]+1;
               //---
               //TEST_PRINT_TWO(count,summ);
               ChartRedraw();
               //---
               ArrayFill(countClick,index,1,count);
               ArrayFill(countClick,NUMBER_ALL,1,summ);

In den drei unten angehängten Dateien mit Korrekturen sowie in den gleichnamigen Versionen, die dem Artikel beigefügt sind, sind diese Abschnitte sowie die Behebung des Problems in den Codes unten identisch. D.h.:

  • in der Datei test_count_click_0.mq5 - die Maßnahmen zum Schutz vor Vandalismus werden nicht angewendet;
  • in der Datei test_count_click_1.mq5 - eine Variante der "Selbstlöschung" des Programms aus der Karte im Falle eines unbefugten Eingriffs in seine Objekte auf der Karte;
  • in der Datei test_count_click_2.mq5 - eine Variante der "Selbstwiederherstellung" der Programmobjekte für den Fall ihrer unbefugten Änderung oder Löschung.

P./S.: Für die korrekte Arbeit der unten beigefügten Codes ist es erforderlich, im Ordner "Include" die dem Artikel beigefügte Datei objectcreateandset.mqh zu haben , in der die Codes beigefügt sind, auf deren Grundlage ich die fehlerhafte Arbeit der genannten Funktion gefunden habe. Auch diese Datei kann von der Code Base heruntergeladen werden

 
Übrigens, da es passiert ist, möchte ich für diejenigen, die gerade anfangen, die Verarbeitung von Ereignissen in der MQL5 OnChartEvent()-Funktion zu studieren, hinzufügen, dass die Schemata der Schutzvarianten, die im Artikel angegeben sind, die Ressourcen des Computers und des Handelsterminals sparsam verwenden. Wenn Sie also diesen Artikel lesen, achten Sie in den dort angegebenen Beispielschemata auf die dort vorgesehenen Kontrollfilter, um die Anzahl der Verarbeitungen zu reduzieren.

Zum Beispiel kann es nützlich sein, sich mit den Kontrollfiltern auf der Grundlage der Funktion StringFind() in den Beispielschemata des Artikels vertraut zu machen. Denn Filter mit Hilfe dieser Funktion können, wenn nötig, die Anzahl der Suchvorgänge nach Objektnamen deutlich minimieren, wenn in den Programmen, in denen sie angewendet werden, Benachrichtigungen über irgendwelche Ereignisse mit Objekten im Diagramm eingehen. Das heißt, sie können bei Bedarf nicht nur bei der Entwicklung von Anti-Vandalismus-Varianten nützlich sein. Ich möchte noch hinzufügen, dass der Anwendungsbereich der Kontrollfilter, die auf dieser Funktion basieren, bei Bedarf durch die Verwendung ihres dritten Eingangsparameters erweitert werden kann.

 
Dina Paches:

Ich verstehe nur wenig Englisch. Ich habe die englische Version dieses Artikels nicht gelesen.

Entschuldigung, aber...haben Sie den Artikel vollständig gelesen?


+1

Sehr gute Antwort.

 
Doerk Hilger:

- Definieren Sie ein MQL-Objekt für jedes Diagrammobjekt, so wie es die Standard-Control-Bibliothek bereits tut. Jedes dieser MQL-Objekte repräsentiert ein Diagrammobjekt und enthält alle seine Daten - normaler MQL5-Stil.

- Packen Sie alle Objekte in einen Master-Container

- Nur der Master-Container prüft, ob ein Diagrammobjekt gelöscht wurde, entweder von Zeit zu Zeit oder durch das entsprechende Diagramm-Ereignis während OnChartEvent().

- Hinzufügen einer .ReCreate()-Mitgliedsfunktion zu CWnd und einer virtuellen OnRecreate()-Funktion zu allen Objekten, die diese Funktionalität implementieren

- Wenn der Master-Container eine Art von "Vandalismus" feststellt, sendet er ein .ReCreate() an alle seine Kindobjekte.

Dieser Artikel bietet ein Beispiel für eine fertige Lösung, die in jeden beliebigen Quellcode - OOP oder prozedural - implementiert werden kann. Die Aufgabe lautet also: Finde eine Krawatte, die zum Anzug passt.

Ihre Lösung: Kaufen Sie einen neuen OOP-Anzug. Oh, und vergessen Sie auch nicht, eine Krawatte für Ihren neuen Anzug zu kaufen

PS Was die Standardbibliothek betrifft: leider ist die Kontrollbibliothek der schlimmste Teil dieser Bibliothek - zu viele Fehler und nicht realisierte oder nicht zugängliche Optionen. Infolgedessen ist diese Bibliothek manchmal eine Quelle von Problemen (Müll in der Tabelle), auf die in diesem Artikel hingewiesen wird