Développement d'une bibliothèque de fonctions API pour MetaTrader 4 - page 7

 
Bonjour, j'ai donc consulté un programmeur que je connais, et il m'a expliqué que si cette DLL n'a pas été écrite spécifiquement pour être utilisée dans Omega, il ne peut y avoir aucune garantie de fonctionnalité. Parce qu'Omega peut ne pas avoir les ressources dont nous avons besoin dans les paramètres d'appel de fonction de la DLL. Voici un exemple :
int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim) ;
cette ligne ne prend pas en charge les données comme "TDateTime *tim" dans Omega.
Cela signifie que seules les fonctions de début et de fin du terminal où aucun paramètre n'est défini fonctionnent. Lorsque les paramètres sont définis, nous devons savoir quels paramètres sont pris par la DLL, il serait bien d'avoir des exemples.
Je pense que vous devrez examiner un exemple en Delphi avec un programmeur qui peut vous dire exactement ce dont vous avez besoin, et ensuite chercher des outils Omega pour fournir les paramètres requis à la DLL. Si VOUS vouliez publier une version de la DLL spécifiquement pour Omega, cela faciliterait énormément son test et son utilisation rapides, je pense qu'il y aurait beaucoup d'utilisateurs avec Omega. Il y a déjà quelques utilisateurs intéressés. Voici un petit extrait de l'AIDE Omega :
Un point important est la liste des types de données supportés, voir ci-dessous.



Définition de fonction DLL

Avant de pouvoir appeler une fonction DLL à partir d'EasyLanguage, vous devez déclarer la DLL à l'aide de l'instruction DLL Function Declaration.

Syntaxe :

DefineDLLFunc : "DLLNAME.DLL", Return Type, "FunctionName", Parameters ;

DLLNAME.DLL est le nom de la DLL où réside la fonction, Return Type est le type d'expression que la fonction retournera, FunctionName est le nom de la fonction tel que défini dans la DLL, Parameters est la liste des paramètres attendus par la fonction (chaque paramètre séparé par une virgule).

Il est très important de se rappeler que les DLL 32 bits utilisent des fonctions déclarées exportées et sensibles à la casse en utilisant _cdecl, stdcall ou fastcall. Pour que les DLL soient compatibles avec EasyLanguage, les fonctions exportées doivent être créées en utilisant des lettres majuscules et doivent être déclarées comme _stdcall. Ces fonctions d'exportation doivent être répertoriées dans la section EXPORTS .DEF du fichier DLL. L'utilisation de "_declspec (dllexport)" à partir du prototype de fonction n'est pas suffisante pour que EasyLanguage puisse localiser les fonctions DLL exportées.

Par exemple, l'instruction suivante déclare une fonction nommée MessageBeep qui est située de façon permanente dans une DLL nommée USER32.DLL. Elle renvoie une valeur booléenne (vrai/faux) et attend un seul paramètre, int.

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

Types de données

EasyLanguage supporte de nombreux types de données valides qui peuvent être utilisés pour envoyer et recevoir des informations aux fonctions contenues dans les DLL. Voici une liste des types de données pris en charge par EasyLanguage :

Types de données fondamentaux :

BYTE
Type de données entier de 1 octet.

char
Type de données entières de 1 octet.

int
Type de données entier signé de 4 octets.

WORD
Type de données : nombre entier non signé de 2 octets.

long
Type de données : entier signé de 4 octets.

DWORD
Type de données : entier non signé de 4 octets.

float
Type de données à virgule flottante de 4 octets.

double
Type de données à virgule flottante de 8 octets.

BOOL
Type de données booléen de 4 octets.




Variantes :


UNSIGNED LONG
Identique à DWORD.

VOID
Signifie "Aucune valeur renvoyée".

Types de pointeurs :


LPBYTE
Pointeur vers un BYTE.

LPINT
Pointeur vers un int.

LPWORD
Pointeur vers un MOT.

LPLONG
Pointeur vers un LONG.

LPDWORD
Pointeur vers un DWORD.

LPFLOAT
Pointeur vers un flottant (en FAR).

LPDOUBLE
Pointeur vers un double (en double FAR).

LPSTR
Pointeur vers un caractère.


Tous les pointeurs sont des pointeurs 32 bits et EasyLanguage traite chacun d'entre eux de la même manière.

Il est également très important de se rappeler que toutes les valeurs dans EasyLanguage sont des flottants, sauf pour Open, High, Low et Close, qui sont des entiers. Pour contrôler ces prix, vous devez envoyer la fonction d'échelle de prix au symbole qui compose le graphique.

Par exemple, si un titre a une échelle de prix de 1/1000 et que le prix final était de 105,125, ce prix sera envoyé à la DLL sous la forme 105125. Pour que la DLL sache comment lire ce prix, vous devez envoyer la valeur dans le mot réservé PriceScale, qui dans ce cas renvoie la valeur 1 000.
 
Omega peut ne pas avoir les ressources dont vous avez besoin dans les paramètres de l'appel de fonction DLL. Voici un exemple :<br/ translate="no"> int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim) ;
dans cette ligne les données de type "TDateTime *tim" ne sont pas supportées par Omega.

Tout a un sens maintenant. Pour contourner ce problème, essayez de spécifier le type double dans Omega au lieu de TDateTime - c'est-à-dire int TikKot(char, double, double, double) ;
En fait, ces types sont facilement interchangeables et utilisent 8 octets de mémoire chacun. Bonne chance !
 
OK, merci. Qu'en est-il du type "char", Omega exige Numeric, mais la DLL a besoin de texte ? Est-il possible de le remplacer ?
 
OK, merci. Qu'en est-il du type "char", Omega exige Numeric, mais la DLL a besoin de texte ? Peut-il être remplacé par ? <br / translate="no">

Pourquoi ? C'est dans la description :
LPSTR
Pointeur vers un caractère.

C'est la même chose. Y a-t-il des exemples pour ces types de variables dans la documentation d'Omega ? Vous devez y chercher soigneusement des variantes similaires. Bonne chance !
 
Bonjour, j'ai trouvé le problème :
Ceci provient de l'aide DLL :

Note : Les DLL 32-bit utilisent des fonctions exportées sensibles à la casse déclarées à l'aide de _cdecl, _stdcall , ou fastcall. Pour que les DLL soient compatibles avec EasyLanguage, les fonctions exportées doivent être créées en utilisant toutes les majuscules et être déclarées comme _stdcall. Ces fonctions exportées doivent être répertoriées dans la section EXPORTS du fichier .DEF de la DLL. L'utilisation de "_declspec (dllexport)" à partir du prototype de la fonction ne suffit pas à EasyLanguage pour localiser les fonctions exportées d'une DLL.

Il est donc dit ici qu'Omega ne fonctionne qu'avec les fonctions qui sont écrites en GRANDES lettres. J'ai vérifié comment c'est écrit dans une autre DLL, vraiment seulement en GRANDES LETTRES.
Si vous modifiez l'appel des fonctions (noms en lettres majuscules), nous pourrons effectuer d'autres tests.
Personnellement, je suis très intéressé par votre produit et ma demande à vous est d'adapter la DLL à Omega. J'espère que ça va marcher... Bonne chance !
Si ce n'est pas le cas, postez ici, s'il vous plaît, je vais devoir travailler sur une autre solution d'automatisation des échanges. Merci.
 
<br / translate="no">Si vous modifiez l'appel de la fonction (noms en lettres majuscules) alors vous pouvez tester plus loin.
Personnellement, je suis très intéressé par votre produit et ma demande à vous est d'adapter la DLL à Omega. J'espère que ça va marcher... Bonne chance !

J'ai fait une variante avec de grandes lettres de fonction et je l'ai envoyée à votre boîte de réception. Bonne chance !
 
Merci beaucoup, je vais faire des tests et je posterai les résultats.