Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Code auslagern

Geschrieben

Hallo,

 

nehmen wir an man möchte Teile des mql-Codes in externen Code auslagern und dabei die Funktionalität von Backtest sowie direkte Orderausführung aus dem Terminal von MT4 erhalten.

 

Die Sache soll in dem Fall zwei Aspekte gleichzeitig erfüllen. Zum einen soll der Code vom Broker also von der MT4 Verzeichnisstruktur gelöst werden also ausgelagert werden (Schutz des geistigen Eigentums) und eine höhere Unabhängigkeit der Terminalsprachen (mql4/5...oa) ermöglichen. Zum anderen soll das ausgelagerte Programm anspruchsvollere Rechnungen durch eine schnellere Sprache wie c++ durchführen sowie Charts/Grafiken von Datenreihen eigenständig visualisieren.

 

Dazu hab ich ein paar grundsätzliche Fragen an die Profis:

 

- Kann man mql mit einem externen Programm so vernetzen, dass Backtest und Orderausführung aus dem Terminal heraus normal funktioniert? Soweit ich informiert bin geht dies über DLLs welche sich in der MT4 Verzeichnisstruktur befinden. Nehmen wir an man misstraut der Sicherheit innerhalb der MT-Verzeichnisstruktur. Ist es möglich dies aus der Verzeichnisstruktur auszulagern sodass der geistige Eigentum nicht innerhalb dieser liegt?

 

- Wie kann man sich eigentlich den Programmablauf mit externem Code vorstellen? Wechseln sich das mql-programm und das c++-programm ab, also als Beispiel: TICK triggert mql -> mql macht xyz und pausiert und triggert c++ -> c++ zieht sich Werte aus mql und berechnet irgendwas -> mql macht weiter und führt Order aus o.ä. Oder läuft das gar ganz anders?

 

Je mehr im c++ ausgelagert wäre desto besser, aber wie funktioniert das wenn man iATR... iCustom... Bid oder sonstwelche Variablen aus dem Terminal also mql ziehen will?

 

- Wäre es möglich das ein solches externe Programm Daten wiederum Grafisch (zb Datenreihe) darstellt, so das man neben dem MT4 Terminal eine eigenen "Chart" oder was auch immer hat was Datenreihen als zB Chart visualisiert?

 

 

Beste Grüße

Featured Replies

Geschrieben

Ich kann dir sagen was ich über DLLs schon gemacht habe:

- DLL stellt eine (oder mehrere) Funktion zur Verfügung

- MQL ruft diese Funktion auf und verwendet den Rückgabewert bzw. was auch immer über out-parameter zurückkommt.

 

Sprich der Ablauf ist ca. so wie du es beschrieben hast, nur das MQL nicht "pausiert" sondern der ganz normale Programmablauf eben durchläuft und auf die Funktion wartet wie bei jeder anderen Funktion auch. Die DLL kann sich auch (AFAIK) nicht selbstständig Werte aus MQL ziehen, du musst diese Werte als Parameter an die Funktion übergeben. Du kannst aber natürlich in der DLL globale Variablen haben, die sich Werte über Funktionsaufrufe hinweg speichern.

 

Theoretisch kann die DLL dann natürlich viel mehr machen als nur Dinge intern berechnen. Man könnte vermutlich über eine Schnittstelle zu einem externen Programm eine GUI realisieren, aber wenn es um speed etc. geht ist das vermutlich weniger sinnvoll.

Geschrieben
  • Autor

Das hört sich gut an, wenn die dll als "Funktion" fungiert steuert sie zeitweise das Geschehen somit wartet die ex4 auf die dll Funktion. Die GUI würde ich, wenn es mal soweit sein sollte, mit einer on/off variable steuern sodass man grob gesagt zwischen performance und visualisierung switchen kann.


Was den Aspekt der Entkopplung von Metatrader angeht habe ich gesehen, dass man die dll von egal wo auf der Platte einbinden kann
#import "Drive:\Directory\FileName.dll"
ähnlich hier: http://www.forexfactory.com/showthread.php?t=222560
somit wäre der Code zumindest raus aus der MT-Verzeichnisstruktur. Ob dies zwecks geistiger Eigentumsschutz nützt..., ich weiss es nicht vielleicht gibt es dazu noch die ein oder andere Meinung? Vielleicht müsste man von der dll, auf diese nun direkt von MT4 zugegriffen wird, zu einer weiteren dll, exe oder xyz weiterleiten um es wirklich von MT4 zu entkoppeln...?


Desweiteren stellt sich die Frage wie die dll an die Werte aus dem Terminal herankommt. Im Programmablauf ist zum Beispiel nicht immer im Vorfeld klar welche Werte gerade von der Logik benötigt werden. Bei digit point accountequity() denke ich geht es noch aber was wenn mal Close[5] und dann Close[325] aufgerufen werden soll. Analog dazu wäre das Problem bei Time[x] oder Indikatoren oder im extremfall gar Werten aus anderen Währungspaaren wie bei iHigh(WP[x],0,1).
Zu dem Thema habe ich durch einen Thread von 7bit herausgefunden (aber nicht verstanden), dass man stdcall zum exportieren braucht weil man sonst keine Schnittstelle bekommt. Int und double können mit pointers zum Speicherplatz der Arrays verwiesen werden und für den Zugriff auf die Bars im Chart kann man per ArrayCopyRates() die Sache hinbekommen. Es gibt bei der ff.com eine art Anleitung von 7bit http://www.forexfactory.com/showthread.php?t=219576. Verstanden habe ich gefühlte 10%.
cxalgo hat in dem anderen Thread die DLL-Injection als Methode genannt die Dinge aus MT4 in der dll zu definieren

http://www.tom-next.com/community/topic/70001-systementwicklung-langfristig-angehen/?p=154790

Wenn ich es richtig verstanden habe wird dadurch ein Prozess gezwungen auf ein anderen zuzugreifen...


Grüße

Bearbeitet von Forex1+

Geschrieben
  • Autor

... jetzt bin ich einigen neuen Stoff durchgegangen und vermute das die Geschichte mit der DLL-Injection definitiv durch Nutzung von Zeigern/Pointer also Direktzugriff auf den Arbeitsspeicher funktioniert. Der Lösungsweg wie ihn 7bit beschreibt hängt auch mit Zeigern/Pointer zusammen leider ist das Thema Zeiger noch nicht ganz zutraulich :-)

Geschrieben
  • Autor

Um nochmal auf die Funktion wie von Mythos beschrieben zurückzukommen.

Ich denke die Funktionen könnte man auch einfach nutzen mit oder ohne Rückgabewert um Werte wie int oder double zu übertragen mal ganz unabhängig von Berechnungen.

Kann man über die dll Funktionen eigentlich auch Arrays (oder gar Mehrdimensionale) übertragen? Man könnte dann als Beispiel jeden Bar eines Timeframes in eine Arrayhistory für Nutzung von historischen OHLC in die dll schleusen. Wenn man 1 Monat M1 möchte müsste das Array 28800 Werte beinhalten.

Und noch eine blöde Frage: Kann man auch umgekehrt also von einer dll aus eine Funktion im mql aufrufen? Wenn ja wären eigentlich alle Probleme gelöst denn so könnte man alle benötigten Werte aus MT auslesen lassen und übergibt nur dazu noch den gewünschten shift-wert von Kurs, Indi, etc.

 

Grüße

Bearbeitet von Forex1+

Geschrieben
  • Autor

Keiner mehr aus der Programmierecke aktiv?

Wie gesagt es geht mir um ein groben Überblick welche sinnvollen Möglichkeiten es überhaupt gäbe. Dann könnte ich einem ggf zukünftigen Freelancer wenigstens erklären was ich von Ihm möchte wink.gif Würde mich echt interessieren was ein Coder zu den Aspekten in #3 - #5 sagt.

 

ps: Übrigens habe ich lange Zeit die hier durch Hilfe entstandene txt-Bridge zur Codeauslagerung erfolgreich genutzt. Zwei MT Instanzen, EA und Skript welches sich selbst triggert. War schon ne sehr coole und stabile (ja wirklich) Lösung aber echt langsam (liebevoll txt-K(B)rücke genannt) und mit großen Einschränkungen was die Datenübertragung angeht, daher jetzt obiges Projekt...

Geschrieben

Keiner mehr aus der Programmierecke aktiv?

Wie gesagt es geht mir um ein groben Überblick welche sinnvollen Möglichkeiten es überhaupt gäbe. Dann könnte ich einem ggf zukünftigen Freelancer wenigstens erklären was ich von Ihm möchte wink.gif Würde mich echt interessieren was ein Coder zu den Aspekten in #3 - #5 sagt.

 

ps: Übrigens habe ich lange Zeit die hier durch Hilfe entstandene txt-Bridge zur Codeauslagerung erfolgreich genutzt. Zwei MT Instanzen, EA und Skript welches sich selbst triggert. War schon ne sehr coole und stabile (ja wirklich) Lösung aber echt langsam (liebevoll txt-K(B)rücke genannt) und mit großen Einschränkungen was die Datenübertragung angeht, daher jetzt obiges Projekt...

 

Würde mich im Prinzip auch interessieren. Werde mich, notgedrungen, auch in Richtung Automatisierung orientieren. "Txt"-Bridge funktioniert also in gewissen Rahmen. Ok, schon mal super. Weitere Fragestellungen zum Thema werde ich mal parallel einstellen. Möchte nicht Dein Treat hijacken.

Geschrieben
Bin wie gesagt nicht in Europa aber schon am Heimweg. AFAIK kann man nicht von DLL nach mt durchgreifen nur umgekehrt. Arrays übergeben sollte kein Problem sein. Bzgl. Geistigen Eigentum bin ich persönlich der Meinung das eine DLL allein schon unnötiger Aufwand ist, Aber ich kann mich auch irren.
Geschrieben

noch was zur DLL-injection die cxalgo erwähnt: ich glaube er meint hier nix anderes als den normalen aufruf einer dll. Das hat nix mit mehreren prozessen zu tun, eine DLL liefert die einfach ein set von funktionen die du in der dll frei definieren kannst.

 

bzgl. zeiger/pointer: ja das is für nicht-programmierer etwas schwer verständlich, aber was mt4 angeht, reicht es wenn du weißt das du arrays übergeben kannst :D

Geschrieben
  • Autor

Danke für die Infos. Das heißt es gibt eigentlich auch keine kompliziertere und bessere Methode als den normalen Aufruf über eine Funktion. Was mich nur wundert warum die gefundenen Anleitungen so kompliziert sind und viel mehr Code beinhalten als nötig ( zB

http://www.forexfactory.com/showthread.php?t=219576 oder https://www.mql5.com/en/articles/18 ).

 

Ich habe jetzt die Minmalvariante mit einer einfachen Varibale hinbekommen also eine einfache Addition in der dll, dies ist sehr viel weniger Code als bei den Anleitungen. Kann sein das es dann mit Arrays oder Strings besonders kompliziert wird das ist nun mein nächster Schritt.

Geschrieben

wenn du willst würden sich sicher viele freuen wenn du uns das minimalbeispiel zeigst. Mit welcher Programmiersprache arbeitest du in der DLL?

 

Warum manche Anleitungen komplizierter sind als nötig ist eine gute Frage, teils vermutlich um die verschiedenen Möglichkeiten aufzuzeigen.

Geschrieben
  • Autor

Ich mache das bewusst in C++ und will die Sprache jetzt auch weiter lernen also zumindest so viel ich eben für meine Zwecke benötige weil ich glaube das ich mit dieser Sprache die großmögliche Flexibilität für die Zukunft habe. Speed und Möglichkeiten sind einfach gigantisch zudem sehr Hardwarenah.

Bis jetzt habe ich erstmal nur eine Funktion in der dll die so eine Rechnung durchführt und den Wert zurückgibt

 

int V1 = 0;
V1 = A1 + A2;
return(V1);

 

im mql dann:

import "DLLv001.dll"
int Rechnung(int, int);

#import

int A1 = 20;
int A2 = 30;
int Ergebnis = Rechnung(A1, A2);

 

Bin dabei die ganzen Beispielcodes aus dem www aufzudröseln um dann auch Sachen mit Arrays und Strings etc zu verstehen und zu machen. Wird langsam... :-)

Bearbeitet von Forex1+

Geschrieben
  • Autor

ich mach das mit Microsoft Visual C++ 2010 Express und das rundherum ist aus einem anderen Forum hier der Link http://www.forexfabrik.de/topic/3516-dll-schreiben/?hl=import allerdings geht das nur für eine simple variable also die Sache mit arrays, strings etc versuche ich aus anderen Quellen herzuleiten bis jetzt noch ohne Ergebnis ;)

  • 1 Monat später...
Geschrieben
  • Autor

Hey Leute,

 

mir ist aufgefallen dass wenn ein EA mit DLL läuft bei den Windowsprozessen weiterhin nur terminal.exe *32 läuft. Ich frage mich aus reiner Unwissenheit wo jetzt eine DLL, die doch als eigenes Konstrukt in einer eigenen Sprache eine komplexe Berechnung durchführen soll, läuft? Irgendwie ist das bei Anwendungen oder Prozesse nicht zu erkennen.

 

Ein anderer Punkt, mir ist noch aufgefallen das die kompletten definierten Funktionen im Reiter Abhängigkeiten zu betrachten sind. Wie dies im Bezug auf "Schutz des geistigen Eigentums" einzordnen ist...?

post-3558-0-43225900-1449168535_thumb.png

Geschrieben
  • Autor

Ich gehe davon aus, dass die dlls nicht statisch geladen werden sonst würden unterschiedliche EAs ein gemeinsamen globalen Speicherbereich benutzen was doch Quatsch wäre. Oder ist ein extra Flag im Header nötig um dies zu steuern?

 

lg

Geschrieben

Soweit ich weiss steht dll auch nicht im Taskmanager da sie als lib nur Funktionen zur Verfügung stellen und eben keine Stand alone Anwendung ist, wenn du ein Normales Programm schreibst und per TCP / UDP mit MT4 Kommunizierst würde es anders aussehen.

Geschrieben
  • Autor

Danke ok dann müsste der Prozess terminal.exe *32 die CPU und RAM -Auslastung, verursacht durch Berechnungen in der DLL, also mit in sich tragen.

So verrückte Sachen wie Threading in der DLL würde dann wahrscheinlich auch unter dem Deckmantel der terminal.exe laufen... Solange das die Performance nicht beeinträchtig wäre es ja ok

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.