Erstellen Sie Ihre eigene MetaTrader-Erweiterung (dll) - Seite 3

 

Wirklich eine C++ Frage...externe DLL für MT4

Hallo zusammen,

ich habe eine externe DLL, die ich in C++ geschrieben habe. Allerdings bin ich noch ziemlich neu in C++, so dass ich denke, dass dies der Grund für mein Problem sein könnte. Ich habe eine andere Version, die ich in C# geschrieben habe, die gut funktioniert, außer um C#-DLLs durch MQL aufrufbar zu machen, muss ich sie ändern, und diese Änderung scheint kleine Speicherlecks zu verursachen. Ich hoffe, dass mir hier jemand mit der C++-Version helfen kann. Hier ist die Geschichte:

Ich habe langsam verschiedene Bibliotheken für die Programmierung von Handelsstrategien entwickelt. Eines der Dinge, die ich zu tun versuche, ist die Entwicklung eines konsistenten Satzes von Diensten für verschiedene Dinge wie Protokollierung, Sperren (thread-sicherer Zugriff auf Ressourcen) und Ereignisbenachrichtigung. Im Grunde versuche ich also, MQL an den Stiefeln hochzuziehen und ein moderneres Programmierparadigma zu entwickeln. Jedenfalls arbeite ich derzeit an einer Bibliothek, die es EAs ermöglicht, Benachrichtigungen über verschiedene Handelsereignisse (platziert, ausgeführt, geschlossen) zu erhalten. Diese Ereignisse können das Ergebnis von Geschäften sein, die von dem EA, der das Ereignis abonniert, oder von anderen EAs getätigt wurden. Um dies zu erreichen, verwende ich eine externe DLL, die im Grunde die Kommunikation zwischen EAs über die Weitergabe von Nachrichten erleichtert. Es gibt einen veröffentlichenden EA, der nur nach neuen Handelsereignissen sucht, und wenn eines eintritt, stellt er eine Nachricht in eine Warteschlange für den abonnierenden EA (jeder Abonnent hat seine eigene Warteschlange).

Das Problem ist also folgendes... Solange nur eine Nachricht zu einem Zeitpunkt weitergegeben wird, funktioniert alles gut. Offensichtlich ist das aber überhaupt nicht akzeptabel. Wenn mehr als eine Nachricht zu einem Zeitpunkt übergeben wird, was ich finde, ist, dass die erste Nachricht beschädigt wird (es hält die Nachricht als "1" zurück, wenn stattdessen es etwas wie "FILLED,1005167" sein sollte). Die zweite Nachricht ist in Ordnung, aber die erste nicht. Ich habe noch nicht getestet, ob mehr als zwei Meldungen möglich sind, aber vermutlich würde das gleiche Problem auftreten.

Ich würde mich freuen, wenn jemand eine Antwort darauf wüsste, was ich falsch mache, und mein Problem aufklären könnte. Ein paar Anmerkungen: 1) Ich werde diesen Code irgendwann unter Apache 2.0 veröffentlichen, und daher wird diese Quelldatei auch unter Apache 2.0 veröffentlicht... Ich beabsichtige, sie für die Community freizugeben, wenn sie einigermaßen reibungslos funktioniert. 2) Ich habe hier wiederholt 'Warteschlange' gesagt, aber wenn Sie sich den Quellcode ansehen, werden Sie sehen, dass ich stattdessen einen Vektor verwende und ihn im Grunde wie einen Stapel benutze. Ursprünglich hatte ich eine Warteschlange, änderte sie aber in einen Vektor, nur für den unwahrscheinlichen Fall, dass ich mit der STL-Warteschlange etwas falsch mache, dessen ich mir nicht bewusst war. Kein solches Glück. Die eigentliche Implementierung wird eine Warteschlange sein, aber für jetzt weder Warteschlange noch Vektor sind korrekt für mich arbeiten.

Vielen Dank im Voraus für jede Einsicht.

Brandon Wilhite

Dateien:
 

Da ich hier war, dachte ich, ich würde meine Erfahrungen teilen. Was Sie vorhaben, ist sicherlich machbar, und ich habe es selbst schon oft gemacht.

Als ich anfing, DLLs für MT4 zu schreiben, konnte ich sie nie in C++ zum Laufen bringen. Ich glaube, das Problem war/ist, dass meine Projekteinstellungen in Visual Studio immer falsch waren (es gibt so d@$% viele von ihnen). Erst kürzlich fand ich ein Beispiel von CodeGuru, das ich tatsächlich kompilieren und verwenden konnte. Jetzt habe ich dieses Projekt im Grunde genommen entsorgt und verwende es als Vorlage.

In der Zwischenzeit habe ich C#-DLLs geschrieben und dieses hervorragende Tool hier verwendet. Es nimmt im Grunde die IL und ändert sie so, dass sie von nicht verwaltetem Code aufgerufen werden kann. Das einzige Problem ist, dass MT4 ein Speicherleck zu haben scheint, wenn man dies tut. Ich habe noch nicht endgültig herausgefunden, ob das an MT4 liegt oder an der Änderung der AWL, aber es passiert.

Als Nächstes werde ich entweder lernen, Wrapper für C++ zu schreiben, und/oder ich werde einfach weitermachen und C++ lernen. Hoffentlich wird dadurch das Speicherproblem gelöst.

Wie dem auch sei, was Sie vorhaben, ist definitiv machbar. Ich habe es geschafft, einige ziemlich komplizierte DLLs für MT4 in C# zu schreiben, darunter Dinge wie Remoting, Raw Sockets, http, WinForms. So ziemlich alles, was man mit .NET machen kann, kann auf diese Weise von MT4 aus aufgerufen werden (was auch immer Sie wollen, ich habe es wahrscheinlich schon gemacht). Und es ist sehr zuverlässig. Das einzige Problem ist der relativ langsame Speicherverlust.

Magick:
Danke Patrick

Das ist eine sehr interessante Idee, den FTP zu nutzen.

Ich möchte jedoch in der Lage sein, mit MT zu interagieren - um die Tick- und Kerzeninformationen an die .net-App zu senden, und diese App kommuniziert zurück an MT, wann gehandelt werden soll.

Ich fand dies, dass ich dachte, könnte helfen - Simplified Wrapper und Interface Generator

Allerdings bin ich ein eher Anfänger Programmierer, und nicht vollständig zu schätzen, was in mit einem C ++ Wrapper mittlere Schicht beteiligt ist.

Ich wäre an Ihrer Meinung interessiert, wenn Sie denken, dass dies ein nützliches Werkzeug sein könnte, um eine Brücke zwischen C++ und .net zu schlagen?
 
bwilhite:
Da ich hier war, dachte ich, ich würde meine Erfahrungen teilen. Was Sie vorhaben, ist sicherlich machbar, und ich habe es selbst schon oft gemacht.

Als ich anfing, DLLs für die Verwendung in MT4 zu schreiben, konnte ich sie nie in C++ zum Laufen bringen. Ich denke, das Problem war/ist, dass meine Projekteinstellungen in Visual Studio immer falsch waren (es gibt so d@$% viele von ihnen). Erst kürzlich fand ich ein Beispiel von CodeGuru, das ich tatsächlich kompilieren und verwenden konnte. Jetzt habe ich dieses Projekt im Grunde genommen entsorgt und verwende es als Vorlage.

In der Zwischenzeit habe ich C#-DLLs geschrieben und dieses hervorragende Tool hier verwendet. Es nimmt im Grunde die IL und ändert sie so, dass sie von nicht verwaltetem Code aufgerufen werden kann. Das einzige Problem ist, dass MT4 ein Speicherleck zu haben scheint, wenn man dies tut. Ich habe noch nicht endgültig herausgefunden, ob das an MT4 liegt oder an der Änderung der AWL, aber es passiert.

Als Nächstes werde ich entweder lernen, Wrapper für C++ zu schreiben, und/oder ich werde einfach weitermachen und C++ lernen. Hoffentlich wird dadurch das Speicherproblem gelöst.

Wie auch immer, was Sie tun wollen, ist definitiv machbar. Ich habe es geschafft, einige ziemlich komplizierte DLLs für MT4 in C# zu schreiben, einschließlich Dinge wie Remoting, Raw Sockets, http, WinForms. So ziemlich alles, was man mit .NET machen kann, kann auf diese Weise von MT4 aus aufgerufen werden (was auch immer Sie wollen, ich habe es wahrscheinlich schon gemacht). Und es ist sehr zuverlässig. Das einzige Problem ist das relativ langsame Speicherleck.

bwilhite Sie sind ein Lebensretter! Das sieht nach einem tollen Tool aus. Haben Sie zufällig ein C#-Projekt, das die Kommunikation mit MT von C# aus demonstriert? Ich möchte, dass meine .net-Anwendung MT mitteilt, wann gehandelt werden soll. Oder vielleicht können Sie einen Link empfehlen, der helfen könnte. Jede Hilfe wäre mir sehr willkommen.

 

Vielen herzlichen Dank!

 

Dll

Hallo ,

Kann die DLL verwendet werden, um Bestellungen über eine Excel-Tabelle zu senden und zu empfangen?

Wo kann ich diesen Aspekt der DLL lernen.

Mit freundlichen Grüßen

Latino

 
codersguru:
Jeder, der daran interessiert ist, seine eigene MetaTrader-Erweiterung (dll) zu erstellen, kann diese Seite besuchen:

Erstellen Sie Ihre eigene MetaTrader-Erweiterung (dll) - Teil 1

Erstellen Sie Ihre eigene MetaTrader-Erweiterung (dll) - Teil 2

Es wird einen weiteren Teil (oder 2) geben, den ich gerade schreibe!

Ich hoffe, Sie genießen sie!

Bitte, aktualisieren Sie Ihren Kurs auf Visual C++ 2008 Express Edition

 
bwilhite:
Da ich hier war, dachte ich, ich würde meine Erfahrungen teilen. Was Sie tun wollen, kann sicherlich getan werden, und ich habe es viele Male selbst getan.

Als ich anfing, DLLs für die Verwendung in MT4 zu schreiben, konnte ich sie nie in C++ zum Laufen bringen. Ich denke, das Problem war/ist, dass meine Projekteinstellungen in Visual Studio immer falsch waren (es gibt so d@$% viele von ihnen). Erst kürzlich fand ich ein Beispiel von CodeGuru, das ich tatsächlich kompilieren und verwenden konnte. Jetzt habe ich dieses Projekt im Grunde genommen entsorgt und verwende es als Vorlage.

In der Zwischenzeit habe ich C#-DLLs geschrieben und dieses hervorragende Tool hier verwendet. Es nimmt im Grunde die IL und ändert sie so, dass sie von nicht verwaltetem Code aufgerufen werden kann. Das einzige Problem ist, dass MT4 ein Speicherleck zu haben scheint, wenn man dies tut. Ich habe noch nicht endgültig herausgefunden, ob das an MT4 liegt oder an der Änderung der AWL, aber es passiert.

Als Nächstes werde ich entweder lernen, Wrapper für C++ zu schreiben, und/oder ich werde einfach weitermachen und C++ lernen. Das wird hoffentlich das Speicherproblem lösen.

Wie auch immer, was Sie tun wollen, ist definitiv machbar. Ich habe es geschafft, einige ziemlich komplizierte DLLs für MT4 in C# zu schreiben, einschließlich Dinge wie Remoting, Raw Sockets, http, WinForms. So ziemlich alles, was man mit .NET machen kann, kann auf diese Weise von MT4 aus aufgerufen werden (was auch immer Sie wollen, ich habe es wahrscheinlich schon gemacht). Und es ist sehr zuverlässig. Das einzige Problem ist das relativ langsame Speicherleck.

Konnten Sie jemals die Quelle dieses langsamen Lecks identifizieren, bwilhite? Ich würde Ihre Hilfe in diesem Bereich sehr zu schätzen wissen, wenn Sie noch dazu bereit sind. Im Moment bin ich auf der Suche nach einer einfachen mql dll, mit der ich Nachrichten über Sockets senden und empfangen kann. Ich bin mit den Grundlagen von c# vertraut, also wenn ich einen Weg finden könnte, die Vorteile zu nutzen, umso besser.

Danke!

 
Magick:
bwilhite Sie sind ein Lebensretter! Das sieht nach einem tollen Tool aus. Haben Sie zufällig ein C#-Projekt, das die Kommunikation mit MT von C# aus demonstriert? Ich möchte, dass meine .net-Anwendung MT mitteilt, wann gehandelt werden soll. Oder vielleicht können Sie einen Link empfehlen, der helfen könnte. Jede Hilfe würde sehr geschätzt werden.

Hatten Sie mit diesem Magick schon Erfolg? Das ist genau das, was ich auch machen möchte - die .net App soll MT sagen, wann und was gehandelt werden soll. Bitte lassen Sie mich wissen, ob Sie eine Lösung gefunden haben.

Ich schätze auch bwihite und würde gerne mehr von ihm hören. Haben Sie Beispiele für c# dlls, die Sie zur Verfügung stellen könnten?

Vielen Dank!

 

Ich habe an meiner eigenen DLL gearbeitet und stoße auf den Fehler 127.

.cpp-Datei enthält (neben anderen Dingen):

MT4_EXPFUNC char* _stdcall DLLtest() {

return("testing!");

}

[/CODE]

header file contains:

#define MT4_EXPFUNC __declspec(dllexport)

MT4 file:

[CODE]

#import "mydll.dll"

string DLLtest();

Natürlich ist das nicht ALLES, was sie enthält, aber das ist die relevante Information. Nach meinem Verständnis habe ich alles, um zu versuchen, die Funktion von MT4 aus aufzurufen.

Aus irgendeinem Grund "sieht" es einfach nicht, dass sie existiert. Ich dachte, es läge daran, dass meiner DLL eine .def-Datei fehlte, aber selbst nachdem ich sie manuell erstellt habe, funktioniert sie immer noch nicht. Außerdem glaube ich, dass die MT4_EXPFUNC-Zeile bedeutet, dass die Funktion sowieso exportiert wird, so dass eine .def-Datei unnötig ist. Die ganze Sache kompiliert gut, der EA läuft gut, bis ich versuche, die Funktion aufzurufen (da er sie nicht sehen kann) und dann stoppt er.

Ich bin mit meinem Latein am Ende. Ich dachte wirklich, es wäre ein .def-Problem, aber je mehr ich darüber nachdenke, glaube ich nicht, dass es das ist.

Übrigens verwende ich Visual C++ 2008 Express...

Danke für jeden Hinweis,

-Jason

 

Ich habe die gleiche 127 Fehler mit Visual C++ 2008 Express. Noch keine Lösung, wenn ich eine finde, werde ich sie posten.

Grund der Beschwerde: