Erstellen einer grafischen Benutzeroberfläche für MQLs im grafischen Modus. - Seite 5

 

Hier ist ein Beispiel für ein einfaches Formular, das in 10 Minuten mit einem EA in Sharpe gezeichnet wurde. Das Formular empfängt Ticks vom Chart, direkt von EA wie von der nativen DLL, ohne Sockets, Dateien und andere Dinge. Und das Formular ist der Tabelle beigefügt. Es gibt ein Problem mit der Anlage, das gelöst werden muss. Es ist aber auch möglich, sie nicht anzubringen, wie auch immer Sie das wollen.

 
Алексей Барбашин:

Hier ist ein Beispiel für ein einfaches Formular, das in 10 Minuten mit einem EA in Sharpe gezeichnet wurde. Das Formular empfängt Ticks vom Chart, direkt von EA wie von der nativen DLL, ohne Sockets, Dateien und andere Dinge. Und das Formular ist der Tabelle beigefügt. Es gibt ein Problem mit der Anlage, das gelöst werden muss. Aber es kann nicht angebracht werden - was auch immer Sie wollen.

Sagen Sie mir, welchen Compiler von GitHub Sie verwendet haben. Oder haben Sie scharf kompilierte Dokumente von Hand bearbeitet? Ich brauche es nicht. Es ist einfacher, C++ DLL in gemischtem Code (managed + unmanaged) zu schreiben.

 
Yuriy Asaulenko:

Sagen Sie mir, welchen Compiler von GitHub Sie verwendet haben. Oder haben Sie die Sharded-Kompilierung von Hand bearbeitet? Das ist keine gute Idee. Es ist einfacher, C++ DLL in gemischtem Code (managed + unmanaged) zu schreiben.

Wie ich im vorigen Beitrag schrieb, wird alles mit VS-internen Tools durchgeführt. Ich verwende VS 2017 Community. Gleich zu Beginn des Projekts wird die DllExport-Bibliothek mit Nuget verbunden. Nach der Kompilierung des Projekts muss nichts mehr von Hand ergänzt werden, von dem Wort TOTALLY.

Die Vorlage vonR. Giesecke kann ich nicht empfehlen. Hier ist ein echtes Tamburin dabei, wenn es überhaupt möglich ist, zu starten. Mit dieser Bibliothek werden Sie den Unterschied nicht einmal bemerken. Ihre DLL selbst wird während der normalen Kompilierung "nativ".

 
Алексей Барбашин:

Wie ich im vorigen Beitrag schrieb, wird alles mit VS-internen Tools durchgeführt. Ich verwende VS 2017 Community. Gleich zu Beginn des Projekts wird die DllExport-Bibliothek mit Nuget verbunden. Nach der Kompilierung des Projekts muss nichts mehr von Hand nachbearbeitet werden, ab dem Wort ALLES.

Ja, ja, genau mit Nuget. Es funktionierte nicht für mich, aber es war ein Nicht-Standard-DLL für die Interaktion mit der C-API, + mehr Callback-Funktionen. Ich weiß nicht, aus irgendeinem Grund hatte ich es als einen Compiler in Erinnerung, oder das war eine andere Lösung.

Und in diesem Fall ist die Lösung wirklich gut und einfach.

 
Алексей Барбашин:

Warum die linke? Alles wird mit den VS-internen Tools erledigt. Nuget verfügt über die DllExport-Bibliothek, die die Klasse System.Runtime.InteropServices einmal ändert, und dann wird alles normal kompiliert. Es ist also kein Tamburintanz erforderlich, und es werden keine Wrapper benötigt. Das Erstellen von Formularen ist in c# viel einfacher, als sie in eine zusätzliche Datei zu schreiben, wie Maxim vorschlägt. Ich respektiere Maxim und seine Arbeit, aber in diesem Fall steht uns die Netzwelt ohne zusätzliche Schwierigkeiten offen.

Das ist interessant, haben Sie es selbst überprüft? Ich habe MT4 - C++dll - C#dll Verbindung gemacht, ich konnte C#dll nicht direkt laden.

https://www.nuget.org/packages/DllExport/ ist es?

DllExport 1.6.0
DllExport 1.6.0
  • www.nuget.org
The open implementation of unmanaged exports for .NET ( DllExport )        Source code and all details here: https://github.com/3F/DllExport                To configure projects via current package:        ========================================================        DllExport -action Configure -dxp-version 1.6.0...
 
Алексей Барбашин:

Wie ich im vorigen Beitrag schrieb, wird alles mit VS-internen Tools durchgeführt. Ich verwende VS 2017 Community. Gleich zu Beginn des Projekts wird die DllExport-Bibliothek mit Nuget verbunden. Nach der Kompilierung des Projekts muss nichts mehr von Hand ergänzt werden, von dem Wort TOTALLY.

Die Vorlage vonR. Giesecke kann ich nicht empfehlen. Hier ist ein echtes Tamburin dabei, wenn es überhaupt möglich ist, zu starten. Mit dieser Bibliothek werden Sie den Unterschied nicht einmal bemerken. Ihre DLL wird während der normalen Kompilierung "nativ".

Tzek, können Sie das näher erläutern? Die Aufgabe für das Beispiel besteht darin, ein Panel in C# zu erstellen, das Informationen vom EA erhält und ihm Befehle sendet. Wie kann man dllexport dafür verwenden?

Es ist nicht nötig, alles genau zu erklären, nur Schritte, was und wie reagiert es aufeinander?

 
Alexey Volchanskiy:

Das ist interessant, haben Sie das selbst überprüft? Ich habe MT4 - C++dll - C#dll verknüpft und konnte C#dll nicht direkt laden.

https://www.nuget.org/packages/DllExport/ ist es?

Natürlich habe ich es überprüft. Ich habe oben ein Beispiel für die Erstellung einer DLL mit Formular gegeben.

 
Алексей Барбашин:

Natürlich habe ich das. Ich habe oben ein Beispiel für dll mit einem Formular gegeben.

Ist dieses Bild ein Beispiel?

In Ordnung, ich kümmere mich selbst darum.

 
Alexey Volchanskiy:

Tezka, können Sie das näher erläutern? Die Aufgabe für das Beispiel ist es, ein Panel in C# zu erstellen, das Informationen von der EA erhält und ihr Befehle sendet. Wie kann man dllexport dafür verwenden?

Es ist nicht nötig, alles genau zu erklären, nur Schritte, was und wie reagiert es miteinander?

1. Ein Projekt in c# Klassenbibliothek erstellen (net Framework)

2. Fügen Sie die DllExport-Bibliothek aus NuGet zum Projekt hinzu. Es ist besser, sie vom Server herunterzuladen. Legen Sie die Batch-Datei in den Projektordner.

3. Wir haben die Bibliothek über die Befehlszeile gestartet (es gibt ein Video auf dem Hub) und die System.Runtime.InteropServices.

Zu diesem Zeitpunkt sind alle Vorbereitungen abgeschlossen. Neustart des Projekts

4. Erstellen Sie eine Exportfunktion und fügen Sie den Modifikator [DllExport]y davor ein. Wenn Schritt 3 korrekt ausgeführt wird, wird sich der Compiler nicht über den Modifikator beschweren

5. Fügen Sie das Formular zum Projekt hinzu und gestalten Sie es nach Bedarf.

6. Fügen Sie der Klasse der exportierten Funktionen (erstellt in Schritt 1) eine Funktion zum Öffnen des Formulars hinzu, z. B. Start

7. Erstellen Sie eine Funktion zum Öffnen eines Formulars, z. B. OpenDialog, wie es in der Hauptfunktion beim Erstellen einer Anwendung auf einem Windows-Formular geschieht.

8. Erstellen Sie in der Funktion Start einen Thread, für den wir die Funktion OpenDialog als ausführbare Methode angeben

9. Erstellen Sie einen EA/Indikator/Skript und verbinden Sie die DLL wie gewohnt. ))

10. die Funktion Start aus mql aufrufen

Das Formular wird in einem separaten Thread gestartet und hält den Prozess in mql nicht an, wie es ein normaler modaler Dialog tun würde.

Der Datentransfer von mql zu einem Formular erfolgt auf die gleiche Weise wie der Datentransfer zwischen Klassen und Threads der Anwendung selbst.

1. Erstellen Sie eine Funktion in einer zu exportierenden Klasse, die von mql aufgerufen wird, um Daten zu übertragen; zum Beispiel SendTick.

Denken Sie daran, dass mql nur die Klassenmethoden (Funktionen) sieht, die den Modifikator [DllExport] installiert haben.

2. Erstellen Sie einen Ereignisdelegaten in dieser Klasse mit Parametern

3. In dem Formular müssen wir das Ereignis der exportierten Klasse abonnieren

4. Wenn wir die SendTick-Methode von mql aufrufen, rufen wir das erstellte Ereignis auf und übergeben die Parameter

5. Im Formular erstellen wir einen Event-Handler, der das Ereignis abfängt und die Daten an das Formular sendet oder etwas anderes tut.

Das ist alles. Es ist nichts weiter erforderlich.

Nur für den Fall, dass das Formular und die Exportklasse in verschiedenen Threads arbeiten, benötigen wir einen Datenverarbeitungsdelegaten aus dem angrenzenden Thread, um Informationen in das Formular einzutragen.

Wenn Sie Erfolg haben, teilen Sie bitte das "Ergebnis" und Ihre Eindrücke von der Einfachheit mit. )))

Das "Schwierigste" an der ganzen Sache wird die Installation der Bibliothek sein. )))

 
Alexey Volchanskiy:

Ist dieses Bild ein Beispiel?

Ich verstehe, ich werde es selbst herausfinden.

Alexey, ich habe das Bild genau beschrieben. )) Wenn Sie weitere Fragen haben, fragen Sie mich, ich werde versuchen, sie zu beantworten!