Aufrufen von Funktionen aus der DLL und Rückgabe von Ergebnissen - Seite 6

 
Das f1-forum
Mike = Terranin = ich :) Und den Emulator habe ich dir schon im Alpari-Forum gegeben. MTS interessiert mich nicht besonders, wenn Sie wüssten, wie viele davon auf meinem Emulator abgestürzt sind... :)
 
2 Mikrofon
:)) Das habe ich auch gedacht. Wenn Sie Interesse haben, können Sie sich mein System hier ansehen
http://forum.alpari-idc.ru/viewtopic.php?t=45555
Es ist natürlich ein ziemliches Durcheinander...
Wenn Sie wollen, beschreibe ich Ihnen das System, denn Sie haben mir mit dem Emulator geholfen.
 
OK, wenn Sie teilen möchten, dann an murdoc (at) newmail.ru. Ich werde es auf meinem Testgerät ausprobieren und Ihnen die Ergebnisse mitteilen.
 
Renat:<br / translate="no"> In der _Standardeinstellung_ ist jeder Import aus einer DLL _vollständig_ verboten_. Das ist der Schutz.
Wenn Sie eine externe DLL verwenden möchten, aktivieren Sie einfach die Schaltfläche "Bestätigen Sie jeden DLL-Funktionsaufruf" und sehen Sie, was dort aufgerufen wird. Auch das ist ein Schutz. Sowie Schutz aller eingebetteten Dateioperationen mit Zugriff nur auf die Verzeichnisse /history und /files.

Wenn jemand den Expert Advisor mit seiner DLL der Öffentlichkeit anbietet, kann der Benutzer dieser DLL vertrauen oder nicht. Wenn er ihr nicht vertraut, wird er sie nicht herunterladen. Wenn er ihr vertraut, muss er das Kästchen " Import von DLL-Funktionen zulassen" ankreuzen, sonst wird der Experte nicht funktionieren. Die Namen der Funktionen, die Sie aufrufen, sind für den Expert Advisor ebenfalls nicht hilfreich, denn um zu wissen, was eine Funktion tut, müssen Sie die DLL zerlegen, und nicht jeder ist dazu in der Lage. Und in dieser DLL kann man eine Menge böser Dinge tun, und das MT-Terminal kann das nicht verhindern. Der Begriff "Schutz" ist also sehr relativ und stellt in diesem Zusammenhang keinen wirklichen Schutz dar. Ich glaube, das hat Mike gemeint.

Die Möglichkeit, Funktionen von Benutzer-DLLs in MT 4 Expert Advisors aufzurufen, ist als Ersatz für die in MT 3 vorhandene API gedacht. Es besteht also die Möglichkeit, das MT 4-Terminal in einen Datafeed zu verwandeln und Orders zu platzieren, was einer der Gründe war (wenn man nach verschiedenen Themen in den Foren urteilt), warum die API entfernt wurde. Aber die API ist geblieben, sie ist sehr unangenehm, viele Nutzer sprechen darüber, und es erinnert an die Situation aus dem Witz: ".... Das ist mir egal, Hauptsache, du hast es satt". Und dieses Thema ist eine Bestätigung dafür. Der Autor hat keine konkreten und informativen Antworten auf seine Fragen erhalten. Diese Fragen sind auch für mich relevant, die Antworten sind sogar noch relevanter :-).
Vielleicht bin ich auch kein erfahrener Programmierer, aber im aktuellen Expert Advisor<->DLL-System kann man per Definition keine einfache und schöne Lösung haben. Um genau zu sein, im Rahmen von MQL4 mag es eine schöne Lösung sein, aber im Rahmen der Integration von MT4-Terminal mit kundenspezifischer Software ist es nichts, um es gelinde auszudrücken. Es gibt andere, funktionellere Lösungen, man muss sie nur finden :-). Wir können zum Beispiel eine DLL mit Funktionen wie in mtapi.dll erstellen, die aber nicht mit dem Server des Handelszentrums, sondern mit dem Client-Terminal interagiert. In diesem Fall bleiben sowohl die Interessen der Entwickler gewahrt (ohne MT4-Terminal kann die DLL nicht funktionieren) als auch die Leute, die in der Lage sind, etwas Komplexeres als MQL4 Expert Advisors zu entwickeln, haben eine gute Möglichkeit, ihre eigene Software (einschließlich ihrer eigenen Benutzeroberfläche) in das Handelssystem zu integrieren. Wenn eine solche Variante erwogen und diskutiert wurde, geben Sie mir bitte einen Link (ich bin nicht auf eine solche Variante gestoßen). Wenn nicht, würde ich gerne die Meinung der Entwickler zu diesem Thema erfahren.

P.S. Die Zeile "Möglichkeit der Nutzung der Client-API" in der Beschreibung des Handelsterminals ist sehr attraktiv. Das hat mich am MetaTrader gereizt, und ich war sehr enttäuscht über das Fehlen einer API in Version 4 des Terminals. Ich hoffe, dass die Entwickler auf der einen Seite und die API-Nutzer auf der anderen Seite einen Kompromiss finden werden. Der derzeitige Stand der Dinge (Aufruf von DLL-Funktionen aus ekperts) ist unbefriedigend.
 
Ich bin auf ein Problem gestoßen, es kann natürlich sein, dass ich zu langsam bin und es nicht richtig verstanden habe.....

Ich habe eine dll für VC++ kompiliert
gibt es eine Funktion:

void __stdcall process_arr(double *in, double *out, int size);

im Expert Advisor die folgende Erklärung:
#import "some.dll"
void process_arr(double in[], double& out[], int size);

Arrays werden als nächstes deklariert:

double arr1[100];
double arr2[100];

dann initialisiere ich das erste Array und gebe beide an die Funktion
process_arr(arr1,arr2,100);

alles wird übergeben, aber die Funktion weigert sich, es zurückzugeben

Nach der Rückkehr von der Funktion gebe ich den Testwert aus:
Print(arr2[1]);
und der folgende Eintrag erscheint im Protokoll
2005.09.19 18:30:03 arrtest EURUSD,H1: 2147483647
Das ist nicht der Punkt, was hat 2^31.... damit zu tun?
funktioniert es genauso mit jedem anderen Element des Arrays.
obwohl unter dem Debugger vor dem Verlassen der Funktion die Werte im Out-Array so sind, wie sie sein sollten (nahe am Preis - ~1,2)
 
Die Zahl 2147483647 ist anscheinend sehr nahe bei Null.
2^31-1, um genau zu sein, was gleich Null sein sollte.
 
void __stdcall process_arr(double *in, double *out, int size); <br / translate="no">
Hier ist die Erklärung im Expert Advisor:
#import "some.dll"
void process_arr(double in[], double& out[], int size);


Nur eine Anregung (da ich mich mit MQL nicht auskenne): ist & für den zweiten Parameter wirklich notwendig?
void process_arr(double in[], double& out[], int size);
 
zu Rosh, das ist wahr, aber wir sprechen über den Double-Typ, und dort ist die Zahlendarstellung "etwas" anders, und 2^31 ist ziemlich weit von 0.... :(

zu VicK, das kaufmännische Und ist der springende Punkt, dank ihm kann ich den Inhalt des Arrays tatsächlich ändern...
das zweite Array ist ein Array mit Rückgabewerten
 
zu VicK, das kaufmännische Und ist der springende Punkt, dank ihm kann ich den Inhalt des Arrays tatsächlich ändern... <br / translate="no"> das zweite Array ist ein Array mit Rückgabewerten


In diesem Fall hat das kaufmännische Und keinen Sinn (ich habe es gerade selbst ausprobiert), und Sie können den Inhalt des Arrays dank etwas anderem ändern :-). Haben Sie sich das DLL-Beispiel im Verzeichnis angesehen? Dort funktioniert alles einwandfrei. Tun Sie es auf dieselbe Weise.
 
es sieht so aus, als ob Ampersand keinen Unterschied macht, wenn wir mit Array vom Typ double[] arbeiten
aber alles funktioniert gut mit int[]. Ich habe den Verdacht, dass hier beginnt zu riechen bug.... :(
Ich würde gerne die Kommentare der Entwickler kennen

Wenn das Ding mit Quellcode geliefert würde, würde sich niemand die Mühe machen, aber... Nur zu, ich rufe um Hilfe.
Grund der Beschwerde: