Mein ultimatives Ziel ist es, mehrere MT45-Plattformen verwenden zu können, um eine in C # geschriebene benutzerdefinierte Anwendung zu füttern.
Eingegebene Code MT5 | | \MT5 - Blackbox C # programlt; --- MT5\ | | MT5
Im Moment macht Black Box nichts. Ich arbeite gerade an der Kommunikation.
Ich habe die Client.cs und Server.cs erfolgreich miteinander zu reden. Wenn ich PipeServer in eine DLL auslege und versuche, in MT5 zu laden, erhalte ich die Fehlermeldung ”SendString” in ”PipeServer.dll” nicht. Ich habe alles versucht, woran ich denken kann. Ich habe zahlreiche Online-Artikel gelesen und bin immer noch im Kreis unterwegs.
C # -Code für PipeServer: (Beachte nicht alle Kommentare. Es erleichtert nur das Wechseln zwischen DLL und Exe.)
Eingefügter Code mit System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Pipes; using System.IO; using System.Diagnostics; using System.Runtime.InteropServices; using RGiesecke.DllExport; Namespace PipeServer {public class Server {//static void Main (Zeichenfolge # 91; # 93; args) # 91; DllExport (SendString, CallingConvention = CallingConvention.StdCall) # 93; public static void SendString (string args) {using (NamedPipeServerStream pipeServer = neuer NamedPipeServerStream (testpipe, PipeDirection.InOut)) {//Console.WriteLine (NamedPipeServerStream-Objekt erstellt)./Warten Sie, bis ein Client eine Verbindung hergestellt hat/Console.Write(Warten auf Clientverbindung ...); pipeServer.WaitForConnection ();/Console.WriteLine(Client verbunden.);/bool Disconnect = false; try {//Benutzereingabe lesen und an den Client-Prozess senden. using (StreamWriter sw = neuer StreamWriter (pipeServer)) {//string temp;/while (pipeServer.IsConnected! Disconnect)/{sw.AutoFlush = true;/Console.Write(Enter text:);/temp = Console.ReadLine ();/if (temp == exit) Disconnect = true;/Disconnect = true; sw.WriteLine (args);/}}}/Fange die IOException, die ausgelöst wird, wenn/die Pipe gebrochen oder getrennt ist. ch (IOException e) {Console.WriteLine (ERROR: {0}, e.Message); }}}}}
C # -Code für den PipeClient:
Eingefügter Code mit System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Pipes; using System.IO; using System.Diagnostics; Namespace PipeClient {öffentliche Klasse Client {static void Main (Zeichenfolge # 91; # 93; args) {using (NamedPipeClientStream pipeClient = neuer NamedPipeClientStream (., testpipe, PipeDirection.InOut)) {//Verbinden Sie sich mit der Pipe oder warten Sie bis die Pipe ist verfügbar. Console.Write (Versuch, eine Verbindung zur Pipe herzustellen ...); pipeClient.Connect (); Console.WriteLine (Verbunden mit Pipe.); Console.WriteLine (Derzeit sind {0} Pipe-Server-Instanzen geöffnet., PipeClient.NumberOfServerInstances); while (pipeClient.IsConnected) {using (StreamReader sr = neuer StreamReader (pipeClient)) {//Den gelesenen Text in der Konsolenzeichenfolge anzeigen temp; while ((temp = sr.ReadLine ())! = ) {Console.WriteLine (vom Server empfangen: {0}, temp); }}}} Console.Write (Drücken Sie die Eingabetaste, um fortzufahren ...); Console.ReadLine (); }}}
MQL5-Code für EASkript:
Eingefügter Code/ ----------------------------------------- --------------------- /| TestPipeServer.mq5 |/| Copyright, NONE |/| |/ ------------------------------------------- ------------------- /# property script_show_inputs #import PipeServer.dll statisch void SendString (string args); #import/ ----------------------------------------- --------------------- /| Skriptprogramm-Startfunktion |/ ------------------------------------------- ------------------- void OnStart () {Drucken (Test richtig geladen); SendString (Test);/Wenn ich diesen Funktionsaufruf auskommentiere, funktioniert das Skript}/ ----------------------------- ---------------------------------
Beim Testen von C # - C # wird ein Durchsatz von über 165.000 TicksSekunde erzielt, ohne dass die Leistung verändert wird. Dies ist einer der Hauptgründe, warum ich eine DLL-Lösung verwenden möchte. Auch die Entwicklung in C # ist weniger restriktiv. Ich verstehe zwar, dass es Möglichkeiten gibt, nativen MQL5-Code zu verwenden, aber das ist nicht der Pfad, den ich verfolge.
Meine allgemeine Frage ist also, wie rufe ich meinen SendString (string someParameter) richtig auf?
Es ist im Moment egal, welchen Datentyp ich sende. Es kann ein Int, Double oder String sein. Ich möchte nur die Funktionalität zum Laufen bringen.
Jede Hilfe oder Anregung wäre sehr dankbar, damit ich aufhören kann
Vielen Dank,
Jason