Mein Ansatz. Der Kern ist der Motor. - Seite 85

 

Apropos Intuition. Ich möchte Ihnen ein interessantes Beispiel geben. Mein Beitrag, der in diesem Thread https://www.mql5.com/ru/forum/95632/page12 abgedruckt ist,liegt mehr als zwei Jahre zurück:

Реter Konow:

1. Das Konzept einer Grafik-Engine.

2. Konzept des Grafikkerns.

3. die Phasen der Erstellung des Visual Studio für die MT-Plattform.

4. eine Beschreibung des Mechanismus zur Erstellung von EA-Schnittstellen.


DieGrafik-Engine ist ein Programm, das als Indikator konzipiert ist.Dieses Programm ist ausschließlich für die Verwaltung der Benutzeroberfläche bestimmt. Sie führt eine Reihe von Grundfunktionen aus:

  • Laden des Kerns der grafischen Oberfläche aus einer Datei.
  • Speichern der benutzerdefinierten Einstellungen der Schnittstelle.
  • Implementierung der einheitlichen und koordinierten Steuerung aller Prozesse in der Schnittstelle. Es implementiert die "Mechanik" der Schnittstelle, einschließlich: Öffnen und Schließen von Fenstern, Ändern der Größe von Fenstern, Verschieben von Fenstern, Zusammenführen von Fenstern, Skalieren, Abspielen von Skripten, Ändern des Zustands von Objekten, Binden von Objekten, Steuern der Werte von Parametern von Steuerelementen entsprechend ihrer Typen und Eigenschaften, Erstellen und Zerstören von globalen Variablen.

Die Grafik-Engine wird wie jeder andere Indikator zu einem Diagramm hinzugefügt . Sie umfasst die folgenden Fenster:

  • Eine Taskleiste, auf deren rechter Seite mehrere Symbole hinzugefügt werden, um dieDienstfenster des Motors selbst aufzurufen.
  • Ein Datei-Navigator, mit dem die Boot-Datei auseiner Liste von Dateien mit Schnittstellen ausgewählt werden kann, die sich in einem speziellen Ordner befinden.
  • Optionale Einstellungsfenster, die in diesem Stadium keine entscheidende Rolle spielen.

Dies ist im Prinzip das Ende des Konzepts der grafischen Maschine. Das Wichtigste ist, dass ohne sie der Betrieb der Schnittstelle unmöglich ist.



Eine Grafik-Engine ist ein Informationsblock, der die Daten aller Objekte und Fenster in einer Schnittstelle enthält, die in einem Array erfasst und in einer Datei gespeichert werden.

Dieser Block ist eine digitale Darstellung der grafischen Schnittstelle. Sie wird von der Grafik-Engine auf Anfrage des Benutzers geladen. Die Grafik-Engine selbst verfügt über einen eigenen, internen Grafik-Kernel, der den Betrieb seiner eigenen Fenster sicherstellt, und innerhalb dieses Kernels wird freier Platz für die Integration der Benutzeroberfläche (in digitaler Form) in ihn bereitgestellt. Die Integration erfolgt durch das Laden des grafischen Kerns aus einer Datei.


3. Die Erstellung eines Visual Studios auf der MT-Plattform ist meines Wissens nach in zwei Phasen unterteilt:

  • In der ersten Phase wird eine dateibasierte Version des Interface Builders erstellt. Darin wird der Benutzer mit Tabellenvorlagen arbeiten. In die Tabellen schreibt der Benutzer die Typen und Namen der Schnittstellenelemente und legt die Eigenschaften ihrer Parameter fest. Die Erstellung wird für den Benutzer extrem einfach sein, er wird sich nicht um die korrekte Positionierung seiner Elemente in den Fenstern kümmern müssen (die Engine wird alles automatisch berechnen) und es wird ausreichen, die Elemente in der gewünschten Reihenfolge anzuordnen.
  • In der zweiten Phase wird eine visuelle Umgebung geschaffen, die die gleiche Methode zur Konstruktion der Schnittstelle wie der Dateikonstruktor implementiert, nur dass sie einfacher und bequemer zu benutzen ist. Außerdem können Sie das Aussehen der Steuerelemente ändern. Im Allgemeinen hat der Benutzer mehr grafische Optionen.


4. Ich möchte den Mechanismus der Schnittstellenerstellung skizzieren und den Schleier über die Technologie etwas lüften. Erläutern Sie, woher die Einfachheit der Erstellung einer Schnittstelle über eine Datei kommt.

Dies ist der Fall: Die Engine verfügt über eine spezielle Funktion, die einen vollständigen grafischen Kernel auf der Grundlage einer einzigen Datei mit einem Minimum an Ladeinformationen erstellt. Die Boot-Informationen in dieser Datei sind selbsterklärend und für den Menschen lesbar. Er ist leicht zu schreiben und zu bearbeiten. Zum Beispiel müssen Sie "_CREATE_NEW_WINDOW" schreiben, um ein Fenster zu erstellen , und "_CHECKBOX" und den Namen des Kontrollkästchens (die Engine erkennt automatisch den Namen des Elements, den Namen des Elements selbst und den Namen seines Parameters).

Diese Funktion heißt "G_CORE_BUILDER()" und baut den grafischen Kern auf, indem sie Daten aus zwei Hauptquellen übernimmt: eine vom Benutzer erstellte Startdatei und das Array "CONTENT[]", das alle Standard-Objektgruppen enthält, die in Windows- und Controls-Plattformen enthalten sind. " CONTENT[]" enthält auch Zustände und Skripte von Objekten. Alles in einer Reihe. Im Allgemeinen wird das Quellmaterial aus "CONTENT[]" + der vom Benutzer erstellten Loader-Datei von "G_CORE_BUILDER()" verwendet, um den grafischen Kern zu erstellen, mit dem die Engine arbeitet.

Приход нового поколения торговых программ. Каким должен стать интерфейс советников?
Приход нового поколения торговых программ. Каким должен стать интерфейс советников?
  • 2016.09.19
  • www.mql5.com
Уважаемые разработчики, в преддверии скачка развития торговых программ, ожидается что создаваемые нами роботы преобретут массу новых возможностей...
 

Es ist erstaunlich, wie sehr sich die Begriffe und Konzepte in zwei Jahren harter Arbeit NICHT verändert haben. Und Funktionen, Arrays und Schlüsselwörter sind so, wie es hier steht. Alles ist nach diesem Szenario umgesetzt worden. Und diese Technologie funktioniert und entwickelt sich weiter, obwohlich vor zwei Jahren noch überhaupt keine Erfahrung mit der Entwicklung einer Auszeichnungssprache hatte.

Ich bin nicht in eine Sackgasse geraten, ich habe das Konzept nicht geändert, ich habe die Richtung nicht geändert. Ich habe den Motor, den Kern und die Auszeichnungssprache genau so weiter entwickelt , wie ich es ursprünglich vorhatte. Und die Praxis bestätigt, dass der Weg, den ich gewählt habe, der richtige war.

Wenn das keine prophetische Intuition ist, was ist es dann?

 

Liebe Gegner.

Hier ist der Skriptcode, der:

  1. Misst die Zeit für die Übertragung einer Zeichenkette in ein Char-Array, um die Zeichenkette über eine Ressource an ein anderes Programm weiterzugeben, und die Zeit für das Abrufen einer Zeichenkette aus einem Char-Array für das anschließende Aufteilen und Abrufen von Informationen.
  2. Misst die Zeit für das Schreiben der Zeichenkette in die MT-Objektbeschreibung und die Zeit für das Abrufen der Zeichenkette aus der MT-Objektbeschreibung für das anschließende Aufteilen und Abrufen von Informationen.
//+------------------------------------------------------------------+
//|                        CharArrayToString и StringToCharArray.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
//--------------------------------------------

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   string qwerty = "qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj";   
   uchar Arr[];
   //---------------------------------
   //Создаем объект связи.
   //---------------------------------
   ObjectCreate(0,"button_1",OBJ_BUTTON,0,0,0);   
   //---------------------------------
   ulong t1 = GetMicrosecondCount();
   //---------------------------------
   //Переводим строку в тип Char
   //---------------------------------
   StringToCharArray(qwerty,Arr,0,WHOLE_ARRAY);
   //---------------------------------
   ulong t2 = GetMicrosecondCount();
   //---------------------------------
   //Переводим массив Char обратно в строку:
   //---------------------------------
   string str_1 = CharArrayToString(Arr,0,WHOLE_ARRAY);
   //---------------------------------
   ulong t3 = GetMicrosecondCount();
   //---------------------------------
   //Записываем строку в описании МТ-объекта.
   //---------------------------------
   ObjectSetString(0,"button_1",OBJPROP_TEXT,"qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj");
   ulong t4 = GetMicrosecondCount();
   //---------------------------------
   //Cчитываем строку из описания МТ-объекта.
   //---------------------------------
   string str_2 = ObjectGetString(0,"button_1",OBJPROP_TEXT);
   ulong t5 = GetMicrosecondCount();
   //---------------------------------   
   //Замеряем время исполнения.
   //----------------------------------------------
   Print("Time of execution StringToCharArray:   ",t2-t1);
   Print("Time of execution CharArrayToString:   ",t3-t2," строка от CharArrayToString:  ",str_1);
   //----------------------------------------------
   Print("Time of execution ObjectSetString:     ",t4-t3);
   Print("Time of execution ObjectGetString:     ",t5-t4," строка от ObjectGetString:  ",str_2);
   //----------------------------------------------
  }
//+------------------------------------------------------------------+

Ergebnis:

2018.12.18 16:44:20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution StringToCharArray:   47
2018.12.18 16:44:20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution CharArrayToString:   35 строка от CharArrayToString:  qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj

2018.12.18 16:44:20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution ObjectSetString:     3
2018.12.18 16:44:20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution ObjectGetString:     3 строка от ObjectGetString:  qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj


 

Meine Lösung ist mehr als 10 Mal schneller.

Fügen Sie zu Ihrer Lösung die Zeit zum Speichern der Ressource und die Zeit zum Abrufen der Ressource in das Array mit ResourceReadImage() hinzu;

Bei meiner Lösung ist weder das erste noch das zweite erforderlich.

 
Реter Konow:
Meine Lösung ist mehr als 10 Mal schneller.

Peter, wenn Sie mit String arbeiten, verlieren Sie auf jeden Fall an Leistung. Daher ist es überraschend, dass Sie einer mythischen Leistung nachjagen, obwohl Sie ursprünglich eine ungeeignete Lösung dafür gewählt haben: die Übermittlung von Nachrichten durch einen String und das anschließende Parsen dieser Nachricht.

 
Vasiliy Sokolov:

Peter, wenn Sie mit String arbeiten, verlieren Sie auf jeden Fall an Leistung. Daher ist es überraschend, dass Sie eine mythische Leistung anstreben, obwohl Sie sich ursprünglich für eine ungeeignete Lösung entschieden haben: die Weiterleitung von Nachrichten über eine Zeichenkette und das anschließende Parsen dieser Nachricht.

Vasily, wie kann man sonst Daten aller Art zwischen Programmen übertragen?

OnChartEvent() ist teilweise geeignet.

  1. Im Testgerät funktioniert es nicht.
  2. Bei einer großen Anzahl von Aufrufen wird die Ereigniswarteschlange verstopft.


 
Übrigens sind Messungen von weniger als 20 Millisekunden streng genommen gar nicht zulässig, zumindest in präemptiven Multithreading-Systemen. Aber selbst wenn Sie Ihr Ergebnis akzeptieren (im Allgemeinen gebe ich es zu), sagt es Ihnen immer noch nichts, denn es sind die Vollkosten, die zählen. Und was Sie gemessen haben, ist nur ein Teil davon.
 
Vasiliy Sokolov:
Übrigens ist die Messung von weniger als 20 Millisekunden streng genommen überhaupt nicht zulässig, zumindest in Systemen mit präemptivem Multithreading. Aber selbst wenn Sie Ihr Ergebnis akzeptieren (im Allgemeinen gebe ich es zu), sagt es Ihnen immer noch nichts, denn es sind die Vollkosten, die zählen. Und was Sie gemessen haben, ist nur ein Teil davon.

Ich brauche eine universelle und schnelle Lösung. Um im Tester zu arbeiten und die OnChartEvent()-Ereigniswarteschlange zu umgehen;

Der Test zeigt, dass die Übertragung durch die Ressourcen 10 Mal langsamer ist. (ohne Messung der Zeit für das Speichern der Ressource und das Abrufen von Daten aus diesermittels ResourceReadImage()) .

Meine Lösung ist die beste Option unter den Ausgangsbedingungen.

 
Vasiliy Sokolov:
...Aber selbst wenn Sie Ihr Ergebnis akzeptieren (im Allgemeinen gebe ich es zu), sagt es Ihnen immer noch nichts, denn es sind die Vollkreiskosten, die zählen. Und was Sie gemessen haben, ist nur ein Teil davon.

Stimmt, aber wenn man die Anzahl der Linien und Gänge hochrechnet, gewinnt meine Option immer noch.

 
Реter Konow:

Vasiliy, wie übertragen Sie sonst Daten aller Art zwischen Programmen?

Direkte Abbildung von Strukturen über Union auf Byte-Array, gemeinsam genutzt für globalen Zugriff. Ich weiß nicht, ob das technisch machbar ist, aber wenn ja, wird die Geschwindigkeit kosmisch sein, weil man gar nichts mehr kopieren muss.