Alternative Implementierungen von Standardfunktionen/-ansätzen - Seite 13

 
Реter Konow:

So sieht der Anfang des Blocks aus:

Soweit ich Sie verstehe, haben Sie Ihre eigene Dolmetschersprache entwickelt.

  • Sie erstellen die Schnittstelle selbst als Textdatei in dieser Sprache
  • der Hauptteil des Programms lädt die Textdatei und konvertiert sie in verständlichen "Byte-Code", im Wesentlichen ein Array.
  • Aus diesem Array wird die Schnittstelle gerendert

Etwa so?

Eine weitere dumme Frage:

Ist jedes erzeugte Fenster mit verschiedenen Elementen eine Ressource oder mehrere?

Obwohl eine bessere Analogie wahrscheinlich HTML wäre

Wie ich bereits sagte, braucht Ihr Kind einen grafischen Konstruktor. So etwas wie die von Andrei Barinov.

Auch Ihre Videoclips sind zu lang. Sie müssen sie von 45 Minuten auf 5 Minuten oder besser noch auf 3 Minuten reduzieren.

 
A100:

Haben Sie selbst versucht, die Antwort auf diese Frage zu finden?

Tipp: Geben Sie in der Google-Suche "DBL_MANT_DIG 53 52" ein.

Ja, danke. Ich habe es gefunden.

 
Nikolai Semko:

1. Soweit ich Sie verstehe, haben Sie Ihre eigene Dolmetschersprache entwickelt.

  • Sie erstellen die Schnittstelle selbst als Textdatei in dieser Sprache
  • Der Hauptteil des Programms lädt die Textdatei und konvertiert sie in menschenlesbaren "Byte-Code", im Wesentlichen ein Array.
  • Dieses Array wird verwendet, um Schnittstellenbilder zu erzeugen.

Etwa so?

Und eine dumme Frage:

Ist jedes erzeugte Fenster mit verschiedenen Elementen eine Ressource oder mehrere?

Eine bessere Analogie wäre aber vielleicht die Sprache HTML.

Wie ich schon sagte - Ihr Geistesprodukt braucht einen grafischen Konstrukteur. So etwas wie die von Andrei Barinov.

Auch Ihre Videoclips sind zu lang. Von 45 Minuten sollten sie auf 5 oder besser noch auf 3 Minuten reduziert werden.

1. Ja, es hat sich herausgestellt, dass die Definition von "Dolmetscher" am besten zu dem passt, was ich geschaffen habe (obwohl ich bei der Erstellung keine Ahnung hatte, was es ist).

  • Ja, das ist richtig. Der Interpreter wird in Form einer Textdatei erstellt. Genauer gesagt, wird eine direkte Initialisierung des Arrays "string SOURCE[]" innerhalb der mit dem Indikator verbundenen Datei durchgeführt. (Der Benutzer schreibt den "KIB-Code" und initialisiert damit das Array). Weiterhin wird die Indikator-Datei vom Benutzer kompiliert, und der Inhalt des Arrays wird mit dem EventChartCustom() an den Konstruktor (Expert Advisor) übergeben.

  • Innerhalb des Konstruktors erfolgt die Übernahme des "KIB-Codes" des Benutzers in Form von "Slicing" von Zeichenketten. Jede übergebene Zeichenkette ist eine Vereinigung von 128 Zeichen. Diese Zeichenketten werden zerlegt und in eine Kopie des SOURCE-Arrays auf der Designer-Seite geschrieben. Anschließend wird der "Kernel-Baustein" ausgeführt, der den Inhalt des Arrays "SOURCE" in den Inhalt des Arrays "int G_CORE[][]" umwandelt. Dies ist der "Kern". Der Block wandelt einen Inhalt in einen anderen um, mehr als 5000 Zeilen Code (besteht aus einer Reihe von Funktionen).
  • .
  • Die Konvertierung erfolgt mit Hilfe eines Zwischenarrays "int TEMPLATES[]", das die Prototypen aller Elemente und Fensterplattformen sammelt. Nach einer Anweisung von "SOURCE[]" (vom Benutzer erstellt) wird der Hauptkernel zusammengestellt. Vorlagen von Elementen aus "TEMPLATES" werden entnommen und in "G_CORE" umgewandelt.
  • .
  • Wenn der Kern erstellt ist, beginnt die "Engine" (der Teil des Konstruktors, der für die Steuerung der GUI-Mechanik verantwortlich ist) mit dem erstellten Kern zu arbeiten. Es zeichnet Kanvas und öffnet Fenster.

2. Jedes gebildete Fenster besteht aus mehreren Kanvasen (Ressourcen). Bei den ersten beiden handelt es sich um die Windows-Plattform. Früher habe ich eine andere Zeichenmethode verwendet und deshalb waren einige Teile halbtransparent und man konnte die Grafik durch sie hindurch sehen. Um dies zu vermeiden, habe ich eine weitere Leinwand im Hintergrund hinzugefügt. Dann hat sich die Technik verbessert, aber die Leinwand bleibt im Hintergrund. Sie ist in die Technologie hineingewachsen, und es ist jetzt schwer, sie wieder loszuwerden. Aber irgendwann werde ich sie entfernen und die Fensterplattform wird aus einer einzigen Leinwand bestehen.

Auch die "Felder" (umschaltbare Bildreiter), sind unabhängige Leinwände. Sie enthalten vorgefertigte Bilder und lassen sich daher schnellstmöglich wechseln. Wenn ich alles auf eine einzige Leinwand zeichnen würde, wäre der Bildwechsel unweigerlich langsamer. Nachdem ich darüber nachgedacht habe, bin ich zu dem Schluss gekommen, dass dies die beste Lösung ist.


3. Visual Constructor war und ist immer noch mein Ziel. Ich stehe kurz vor dem Beginn der Umsetzung. Es gibt ein Verständnis für seine Struktur. Es gibt alle Konzepte, die für seine Umsetzung notwendig sind. Ich weiß, wie man es macht. Alles, was ich brauche, ist Zeit.


ZS: Die Besonderheit meiner Entwicklung ist die Spontaneität. Ich war weder mit Interpertoren noch mit der HTML-Sprache vertraut und wusste nicht, wie sie funktionieren. Das hält mich aber nicht davon ab, ähnliche Dinge zu entwerfen und herzustellen. Ich denke, wenn es gut funktioniert, werde ich es auch weiterhin tun. :)

 
Реter Konow:

Auf den ersten Blick scheinen Sie den Speicher sehr verschwenderisch zu nutzen. Ich kann mich aber auch irren.

Idealerweise sollte Ihre Aufgabe nur eine Leinwand haben, die die Transparenz des Preisdiagramms unterstützt.

Die Leistung von MQL5 sollte ausreichen, um die gesamte Schnittstelle im laufenden Betrieb zu bilden, ohne fertige Blöcke im Speicher zu haben.

Allerdings schließe ich die Möglichkeit nicht aus, Speicherressourcen zu opfern, um die Leistung von schwerfälligen Schnittstellen zu erhöhen.

Ich sehe einen großen Vorteil in Ihrem bisherigen Ansatz:

Es wird für Sie einfacher sein, einen vollwertigen grafischen Konstruktor zu erstellen, da es einfacher ist, Markup-Code zu generieren, als den MQL-Code selbst.


Aber es ist eine gewaltige Aufgabe.
 
Nikolai Semko:

Auf den ersten Blick scheinen Sie den Speicher sehr verschwenderisch zu nutzen. Ich kann mich aber auch irren.

Im Idealfall sollte Ihre Aufgabe nur eine Leinwand haben, die die Transparenz des Preisdiagramms unterstützt.

Die Leistung von MQL5 sollte ausreichen, um die gesamte Schnittstelle im laufenden Betrieb zu bilden, ohne fertige Blöcke im Speicher zu haben.

Allerdings schließe ich die Möglichkeit nicht aus, Speicherressourcen zu opfern, um die Leistung von schwerfälligen Schnittstellen zu erhöhen.

Ich sehe einen großen Vorteil in Ihrem bisherigen Ansatz:

Es wird für Sie einfacher sein, einen vollwertigen grafischen Konstruktor zu erstellen, da es einfacher ist, Markup-Code und nicht den MQL-Code selbst zu generieren.


Aber es ist eine gewaltige Aufgabe.

Es gibt immer noch eine relativ geringe Speicherüberschreitung. Sie haben Recht. Elementobjekte wie Text oder Icon erhalten im Kernel "unverdienterweise" eine Anzahl von 235 Eigenschaften, während ihre eigenen Eigenschaften um ein Vielfaches geringer sind. Das Hauptelement, d. h. das Basisobjekt, sollte alle 235 Eigenschaften haben, aber Symbol- und Textobjekte haben weniger Eigenschaften. Dies führt zu einem Speicherüberlauf.

Die Idee ist, dass ich, wenn ich weitere 60 Zellen zur Reihe der Hauptelementobjekte hinzufüge, Text- und Symboleigenschaften in sie einfügen kann. Dadurch würde der Kern "breiter" werden, aber Sie könnten zwei Drittel der Objekte entfernen.

Dies würde zu einer erheblichen Einsparung von Arbeitsspeicher und zu einem Geschwindigkeitsgewinn bei der Erstellung des Kernels führen. Dies ist jedoch technisch schwierig zu realisieren. Es ist eine Menge Nacharbeit erforderlich. Bisher sind der Speicherverbrauch und die Erstellungszeit recht akzeptabel. Aber es gibt keine Grenzen der Perfektion...


Die Verwendung einer einzigen Leinwand ist keine gute Idee. Es ist viel einfacher, eine Leinwand für jedes Fenster und eine Leinwand für jedes Feld zu verwenden. Die allgemeine Leinwand muss viel öfter neu gezeichnet werden. Bei jedem Bildwechsel oder jeder Fensterverschiebung. Beim Scrollen... Es sollte berücksichtigt werden, dass das Neuzeichnen nicht immer schnell geht. Das liegt nicht an den Algorithmen, sondern an der "Raffinesse" der Grafiken. Lassen Sie mich das erklären:

Wenn Sie ein einfaches rechteckiges Etikett (z. B. ein Quadrat) zeichnen, ist es ein Zyklus über ein Array von Pixeln, wobei die richtigen Zellen mit dem richtigen Wert (Farbe) initialisiert werden.

Wenn Sie ein Quadrat mit einem Rahmen zeichnen, handelt es sich um zwei Zyklen auf einem Feld von Pixeln.

Wenn Sie ein Quadrat mit einem Rahmen und einem Symbol zeichnen, sind das drei Zyklen.

Wenn Sie ein Quadrat mit einem Rahmen zeichnen, der einen Oberflächenverlauf und ein Symbol mit einem Schatten hat, sind das vier oder mehr Zyklen auf dem Pixelarray.

Je steiler die Grafik also ist, desto mehr müssen Sie diese Pixelreihe in Zyklen "bügeln", um das richtige Bild zu erzeugen. Daher ist es umso besser, je weniger neu gezeichnet werden muss.

Eine Leinwand für alle Bilder führt dazu, dass Sie alles ständig neu zeichnen müssen. Daher ist das keine gute Lösung.


ZS: Die Aufgabe ist gewiss gigantisch, aber ich kann sie bewältigen. (Obwohl ich Hilfe bekommen werde.))

ZS: Danke für das Video, es ist inspirierend! :)

 
Реter Konow:


Ändern Sie die Größe des Fensters mit der Maus?
Wenn ja, erscheint dann ein rotes Quadrat?

 
Nikolai Semko:

Ändern Sie die Größe des Fensters mit der Maus?
Wenn ja, erscheint dann ein rotes Quadrat?

Ich verstehe nicht, über welche Quadrate wir hier reden.

Das dynamische Fenster kann mit der Maus in der Größe verändert werden. Wie könnte es anders sein?


ZS: Das dynamische Fenster hat zunächst eine volle Bildschirmgröße. Außerdem wird es auf die gewünschte Größe "zugeschnitten". Mit anderen Worten, die gesamte Dynamik wird in der maximalen Größe der bereits erstellten Bitmap realisiert.

 

Um das Thema der Rundung fortzusetzen.
Ich habe herausgefunden, dass moderne Intel-Prozessoren, die den erweiterten SSE4.1-Befehlssatz unterstützen, den RundungsbefehlROUND{PS, PD} haben. Ich bin sicher, AMD hat etwas Ähnliches.

https://ru.wikipedia.org/wiki/SSE4#SSE4a

http://o-ili-v.ru/wiki/SSE4

Bedeutet dies, dass der MQL5-Compiler diesen Befehl auf CPU-Ebene nicht verwendet? Da mein Intel Kaby Lake-Prozessor dieses Set unterstützt.

Und es gibt noch viel mehr, sogar die skalare Multiplikation von Vektoren.

SSE4 — Википедия
  • ru.wikipedia.org
SSE4 — новый набор команд микроархитектуры Intel Core, впервые реализованный в процессорах серии Penryn (не следует путать с SSE4A от AMD)[1]. Он был анонсирован 27 сентября 2006 года, однако детальное описание стало доступно только весной 2007 года. Более подробное описание новых возможностей процессоров для программистов можно найти на сайте...