Entwicklung einer Bibliothek von API-Funktionen für MetaTrader 4 - Seite 7

 
Guten Tag, ich habe mich mit einem Programmierer, den ich kenne, beraten, und er hat mir erklärt, dass, wenn diese DLL nicht speziell für die Verwendung in Omega geschrieben wurde, keine Garantie für die Funktionalität gegeben werden kann. Denn Omega verfügt möglicherweise nicht über die benötigten Ressourcen in den Funktionsaufrufparametern der DLL. Hier ist ein Beispiel:
int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
diese Zeile unterstützt keine Daten wie "TDateTime *tim" in Omega.
Das bedeutet, dass nur die Funktionen für den Start und das Ende des Terminals funktionieren, für die keine Parameter festgelegt wurden. Wo Parameter gesetzt werden, müssen wir wissen, welche Parameter von der DLL genommen werden, es wäre schön, wenn wir Beispiele hätten.
Ich denke, Sie müssen sich ein Beispiel in Delphi mit einem Programmierer ansehen, der Ihnen genau sagen kann, was Sie brauchen, und dann nach Omega-Tools suchen, um die erforderlichen Parameter an die DLL zu liefern. Wenn SIE eine Version der DLL speziell für Omega herausgeben wollten, würde dies das schnelle Testen und die Nutzung ungemein erleichtern. Ich denke, es gäbe viele Benutzer mit Omega. Es gibt bereits einige interessierte Nutzer. Hier ist ein kleiner Auszug aus der Omega-Hilfe:
Ein wichtiger Punkt ist die Liste der unterstützten Datentypen, siehe unten.



DLL-Funktionsdefinition

Bevor Sie eine DLL-Funktion aus EasyLanguage heraus aufrufen können, müssen Sie die DLL mit der Anweisung DLL-Funktionsdeklaration deklarieren.

Syntax:

DefineDLLFunc: "DLLNAME.DLL", Rückgabetyp, "Funktionsname", Parameter;

DLLNAME.DLL ist der Name der DLL, in der sich die Funktion befindet, Rückgabetyp ist der Typ des Ausdrucks, den die Funktion zurückgibt, Funktionsname ist der Funktionsname, wie er in der DLL definiert ist, Parameter ist die Liste der von der Funktion erwarteten Parameter (jeder Parameter durch Komma getrennt).

Es ist sehr wichtig, daran zu denken, dass 32-Bit-DLLs exportierte, unter Berücksichtigung der Groß- und Kleinschreibung deklarierte Funktionen mit _cdecl, stdcall oder fastcall verwenden. Damit DLLs mit EasyLanguage kompatibel sind, müssen exportierte Funktionen in Großbuchstaben erstellt und als _stdcall deklariert werden. Diese Exportfunktionen müssen im Abschnitt EXPORTS .DEF der DLL-Datei aufgeführt sein. Die Verwendung von "_declspec (dllexport)" im Funktionsprototyp reicht nicht aus, damit EasyLanguage die exportierten DLL-Funktionen finden kann.

Die folgende Anweisung deklariert beispielsweise eine Funktion namens MessageBeep, die sich dauerhaft in einer DLL namens USER32.DLL befindet. Sie gibt einen booleschen Wert (wahr/falsch) zurück und erwartet einen einzigen Parameter, int.

DefineDLLFunc: "USER32.DLL", bool, "MessageBeep", int;

Datentypen

EasyLanguage unterstützt viele gültige Datentypen, die zum Senden und Empfangen von Informationen an in DLLs enthaltene Funktionen verwendet werden können. Hier ist eine Liste der Datentypen, die von EasyLanguage unterstützt werden:

Grundlegende Datentypen:

BYTE
1 Byte Ganzzahl-Datentyp.

char
1 Byte ganzzahliger Datentyp.

int
Datentyp 4 Byte Ganzzahl mit Vorzeichen.

WORD
Datentyp 2 Byte Ganzzahl ohne Vorzeichen.

long
Datentyp 4 Byte Ganzzahl mit Vorzeichen.

DWORD
Datentyp 4 Byte Ganzzahl ohne Vorzeichen.

float
4-Byte-Gleitkommadatentyp.

double
8-Byte-Gleitkommadatentyp.

BOOL
4 Byte boolescher Datentyp.




Varianten:


UNSIGNED LONG
Dasselbe wie DWORD.

VOID
Bedeutet "Kein Rückgabewert".

Zeigertypen:


LPBYTE
Zeiger auf ein BYTE.

LPINT
Zeiger auf einen int.

LPWORD
Zeiger auf ein WORD.

LPLONG
Zeiger auf einen LONG.

LPDWORD
Zeiger auf ein DWORD.

LPFLOAT
Zeiger auf einen Float (in float FAR).

LPDOUBLE
Zeiger auf ein Double (in double FAR).

LPSTR
Zeiger auf ein Zeichen.


Alle Zeiger sind 32-Bit-Zeiger und EasyLanguage behandelt sie alle auf die gleiche Weise.

Es ist auch sehr wichtig, sich daran zu erinnern, dass alle Werte in EasyLanguage Fließkommazahlen sind, mit Ausnahme von Open, High, Low und Close, die Ganzzahlen sind. Um diese Preise zu steuern, müssen Sie die Funktion Preisskala an das Symbol senden, aus dem der Chart besteht.

Wenn zum Beispiel ein Wertpapier eine Preisskala von 1/1000 hat und der Endpreis 105,125 beträgt, wird dieser Preis als 105125 an die DLL gesendet. Damit die DLL weiß, wie sie diesen Preis lesen kann, müssen Sie den Wert im reservierten Wort PriceScale senden, das in diesem Fall den Wert 1.000 zurückgibt.
 
Omega verfügt möglicherweise nicht über die benötigten Ressourcen in den Parametern des DLL-Funktionsaufrufs. Hier ein Beispiel :<br/ translate="no"> int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
in dieser Zeile werden Daten vom Typ "TDateTime *tim" von Omega nicht unterstützt.

Jetzt ergibt alles einen Sinn. Um dieses Problem zu umgehen, versuchen Sie, den Double-Typ in Omega anstelle von TDateTime anzugeben - d.h. int TikKot(char, double, double, double);
Eigentlich sind diese Typen leicht austauschbar und verwenden jeweils 8 Byte Speicher. Viel Glück!
 
OK, danke. Was ist mit dem Typ "char", Omega erfordert Numeric, aber die DLL braucht Text? Ist es möglich, sie zu ersetzen?
 
OK, danke. Was ist mit dem Typ "char", Omega erfordert Numeric, aber die DLL braucht Text? Kann es ersetzt werden durch ? <br / translate="no">

Warum? Das steht in der Beschreibung:
LPSTR
Zeiger auf ein Zeichen.

Das ist das Gleiche. Gibt es in der Omega-Dokumentation Beispiele für diese Arten von Variablen? Sie müssen dort sorgfältig nach ähnlichen Varianten suchen. Viel Glück!
 
Guten Tag, ich habe das Problem gefunden:
Dies ist aus der DLL-Hilfe:

Hinweis: 32-Bit-DLLs verwenden exportierte Funktionen, die mit _cdecl, _stdcall oder fastcall deklariert werden, unter Berücksichtigung der Groß-/Kleinschreibung. Damit DLLs mit EasyLanguage kompatibel sind, sollten exportierte Funktionen in Großbuchstaben erstellt und als _stdcall deklariert werden. Diese exportierten Funktionen müssen im Abschnitt EXPORTS der DEF-Datei der DLL aufgeführt sein. Die Verwendung von "_declspec (dllexport)" im Funktionsprototyp reicht nicht aus, damit EasyLanguage die exportierten Funktionen einer DLL finden kann.

Hier steht also, dass Omega nur mit Funktionen arbeitet, die in großen Buchstaben geschrieben sind. Ich habe überprüft, wie es in einer anderen DLL geschrieben ist, wirklich nur in GROSSBUCHSTABEN.
Wenn Sie den Aufruf der Funktionen ändern (Namen in Großbuchstaben), können wir weitere Tests durchführen.
Ich persönlich bin sehr an Ihrem Produkt interessiert und meine Bitte an Sie ist, die DLL an Omega anzupassen. Ich hoffe, es wird funktionieren... Viel Glück!
Wenn nicht, dann posten Sie bitte hier, ich muss an einer anderen Lösung zur Handelsautomatisierung arbeiten. Ich danke Ihnen.
 
<br / translate="no"> Wenn Sie den Funktionsaufruf (Namen in Großbuchstaben) ändern, können Sie weiter testen.
Ich persönlich bin sehr an Ihrem Produkt interessiert und meine Bitte an Sie ist, die DLL an Omega anzupassen. Ich hoffe, es wird funktionieren... Viel Glück!

Ich habe eine Variante mit großen Funktionsbuchstaben erstellt und an Ihren Posteingang geschickt. Viel Glück!
 
Vielen Dank, ich werde den Test durchführen und die Ergebnisse veröffentlichen.
Grund der Beschwerde: