Appeler des fonctions à partir de la dll et renvoyer des résultats - page 6

 
Ce f1-forum
Mike = Terranin = moi :) Et je vous ai déjà donné l'émulateur sur le forum Alpari. Les MTS ne m'intéressent pas beaucoup, si vous saviez combien d'entre eux ont planté sur mon émulateur... :)
 
2 micro
:)) C'est ce que je pensais. Si vous êtes intéressé, vous pouvez voir mon système ici
http://forum.alpari-idc.ru/viewtopic.php?t=45555
C'est un peu le bordel, bien sûr...
Si vous voulez, je décrirai le système, comme vous m'avez aidé avec l'émulateur.
 
OK, si vous voulez partager, alors à murdoc (at) newmail.ru. Je vais l'exécuter sur mon testeur et vous faire part des résultats.
 
Renat:<br / translate="no"> Par _défaut_, toute importation à partir d'une DLL est _complètement_ interdite. C'est la protection.
Si vous voulez utiliser une DLL externe, il suffit d'activer le bouton "Confirmer chaque appel de fonction DLL" et de voir ce qui est appelé là. C'est aussi une protection. Ainsi que la protection de toutes les opérations sur les fichiers intégrés avec un accès uniquement aux répertoires /history et /files.

Si une personne offre le conseiller expert au public avec sa DLL, l'utilisateur peut faire confiance à cette DLL ou non. S'il ne lui fait pas confiance, il ne le téléchargera pas. S'il lui fait confiance, il devra cocher la case "Autoriser l'importation de fonctions DLL", sinon l'expert ne fonctionnera pas. Les noms des fonctions que vous appelez ne seront pas non plus utiles au conseiller expert, car pour savoir ce que fait une fonction, vous devrez désassembler la DLL, et tout le monde ne sera pas en mesure de le faire. Et dans cette DLL, vous pouvez faire beaucoup de choses désagréables, et le terminal MT ne peut pas l'empêcher. La "protection" est donc très relative et ne constitue pas une véritable protection dans ce contexte. Je pense que c'est ce que Mike voulait dire.

La possibilité d'appeler des fonctions à partir de DLL utilisateur dans MT 4 Expert Advisors est positionnée comme un remplacement de l'API qui est présente dans MT 3. Donc, tout de même, il y a une possibilité de transformer le terminal MT 4 en un datafeed et de placer des ordres, ce qui était l'une des raisons (à en juger par divers sujets sur les forums) pour lesquelles l'API a été supprimée. Mais l'API est restée, elle est très inconfortable, de nombreux utilisateurs en parlent, et cela rappelle la situation de la blague : "....". Je m'en fiche, du moment que tu en as marre". Et ce sujet en est la confirmation. L'auteur n'a pas reçu de réponses spécifiques et informatives à ses questions. Ces questions me concernent aussi, les réponses sont encore plus pertinentes :-).
Je ne suis peut-être pas non plus un programmeur expérimenté, mais dans le système actuel Expert Advisor<->DLL, vous ne pouvez pas, par définition, avoir une solution simple et belle. Pour être plus précis, dans le cadre de MQL4, il peut y avoir une belle solution, mais dans le cadre de l'intégration du terminal MT4 avec un logiciel personnalisé, ce n'est rien, pour ne pas dire plus. Il existe d'autres solutions plus fonctionnelles, il suffit de les trouver :-). Par exemple, nous pouvons créer une DLL avec des fonctions comme dans mtapi.dll, mais elle interagira non pas avec le serveur du centre de traitement, mais avec le terminal client. Dans ce cas, les intérêts du développeur seront préservés (sans terminal MT4, la DLL ne pourra pas fonctionner) et les personnes capables de créer quelque chose de plus complexe que les Expert Advisors MQL4 auront une bonne occasion d'intégrer leur propre logiciel (y compris leur propre interface) au système de trading. Si une telle variante a été envisagée et discutée, veuillez me donner un lien (je n'ai pas rencontré une telle variante). Si ce n'est pas le cas, j'aimerais connaître l'avis des développeurs à ce sujet.

P.S. La chaîne "possibilité d'utiliser l'API client" dans la description du terminal de trading est très attrayante. C'est ce qui m'a attiré vers MetaTrader, et j'ai été très déçu par le manque d'API dans la version 4 du terminal. J'espère que les développeurs d'un côté et les utilisateurs d'API de l'autre arriveront à un compromis. L'état actuel des choses (appel de fonctions DLL à partir d'ekperts) n'est pas satisfaisant.
 
J'ai rencontré un problème, bien sûr, je suis peut-être trop lent et je n'ai pas bien compris ......

J'ai une dll compilée pour VC++.
il y a une fonction :

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

il existe une telle déclaration dans le conseiller expert :
#import "some.dll"
void process_arr(double in[], double& out[], int size) ;

Les tableaux sont déclarés ensuite :

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

puis j'initialise le premier tableau et je passe les deux dans la fonction
process_arr(arr1,arr2,100) ;

tout est passé, mais la fonction refuse de le retourner

Après le retour de la fonction, j'édite la valeur de test :
Imprimer(arr2[1]) ;
et l'entrée suivante apparaît dans le journal
2005.09.19 18:30:03 arrtest EURUSD,H1 : 2147483647
ce n'est pas le sujet, qu'est-ce que 2^31.... a à voir avec ça ?
cela fonctionne de la même manière avec tout autre élément du tableau.
bien que sous le débogueur, avant de quitter la fonction, les valeurs dans le tableau de sortie sont comme elles devraient être (proches du prix - ~1.2).
 
Le nombre 2147483647 est très proche de zéro, semble-t-il.
2^31-1 pour être exact, ce qui devrait être comme zéro.
 
void __stdcall process_arr(double *in, double *out, int size) ; <br / translate="no">
Voici la déclaration dans l'Expert Advisor :
#import "some.dll"
void process_arr(double in[], double& out[], int size) ;


Juste une suggestion (parce que je ne suis pas familier avec MQL) : est-ce que & est vraiment nécessaire pour le deuxième paramètre ?
void process_arr(double in[], double& out[], int size) ;
 
pour Rosh, c'est vrai, mais nous parlons du type double, et là la représentation des nombres est "légèrement" différente, et 2^31 est assez loin de 0..... :(

pour VicK, l'esperluette est tout l'intérêt, grâce à elle je peux réellement changer le contenu du tableau...
le deuxième tableau est un tableau de valeurs de retour
 
pour VicK, l'esperluette est tout l'intérêt, grâce à elle je peux réellement changer le contenu du tableau... <br / translate="no">le deuxième tableau est un tableau avec des valeurs de retour


Dans ce cas, il n'y a pas d'essence dans l'esperluette (je viens de l'essayer moi-même), et vous pouvez changer le contenu du tableau grâce à autre chose :-). Avez-vous regardé l'exemple de DLL dans le répertoire ? Tout y fonctionne bien. Faites-le de la même manière.
 
il semble que l'esperluette ne fasse aucune différence si nous traitons avec un tableau de type double[].
mais tout fonctionne bien avec int[]. J'ai le sentiment qu'ici commence à sentir le bug..... :(
J'aimerais connaître les commentaires des développeurs

si ce truc était livré avec le code source, personne ne s'en soucierait, mais... Allez-y, j'appelle à l'aide.
Raison: