Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1177

 
Alexey Viktorov:

Avez-vous essayé de glisser une chaîne de caractères comme #define str "long long string" ou même comme deux chaînes de caractères via la fonction + ou string.

Après tout, Comment est également limité dans la longueur de la chaîne, mais les variables peuvent être poussées au point de ne pas tenir sur l'écran en quelques lignes.

Merci, le raccourci fonctionne vraiment, le compilateur comprend mais n'accepte pas les fonctions décodées (je crois que c'est comme ça que ça s'appelle) avec @. Et l'ancien compilateur accepte de telles fonctions mais n'ajoute pas à la substitution d'importation en la prenant littéralement. Si j'importe les fonctions comme dans la documentation de la dll, c'est-à-dire "TRANS2QUIK_CONNECT" au lieu de "_TRANS2QUIK_CONNECT@16", elle renvoie 2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND). Je ne comprends pas la différence.
 
f1nik:
Merci, en effet le raccourci fonctionne, le compilateur comprend mais n'accepte pas les fonctions décodées (je crois que c'est comme ça que ça s'appelle) avec @. Et l'ancien compilateur accepte de telles fonctions mais n'ajoute pas aux remplacements d'importation en les prenant au pied de la lettre. Si j'importe les fonctions comme dans la documentation de la dll, c'est-à-dire "TRANS2QUIK_CONNECT" au lieu de "_TRANS2QUIK_CONNECT@16", elle renvoie 2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND). Je ne comprends pas la différence.
Ouvrez le fichier dll dans un éditeur hexadécimal, naviguez un peu et vous pourrez voir les noms symboliques des points d'entrée. Ou trouvez un explorateur de dll qui le fera pour vous, et affichera les dépendances en même temps.

Pas sûr que cela fonctionne d'ailleurs, si les points d'entrée ne sont pas stdcall, on ne peut pas se passer de padding.
 
f1nik:
Merci, la réduction fonctionne, le compilateur comprend mais n'accepte pas les fonctions décodées (je crois que c'est comme ça que ça s'appelle) avec @. Et l'ancien compilateur accepte de telles fonctions mais n'ajoute pas aux remplacements d'importation les prenant littéralement. Si j'importe les fonctions comme dans la documentation de la dll, c'est-à-dire "TRANS2QUIK_CONNECT" au lieu de "_TRANS2QUIK_CONNECT@16", elle renvoie 2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND). Je ne comprends pas la différence.

Je ne sais pas où c'est indiqué dans la documentation, mais le caractère générique doit être précédé d'une barre oblique. C'est pourquoi la ligne d'adresse doit ressembler à ceci : C:\folder\file

Essayez donc de l'écrire comme ceci :"_TRANS2QUIK_CONNECT\@16"

En fait, je ne suis pas très bon avec les .dll. Donc si ça ne marche pas, alors...

 

@Maxim Kuznetsov J'ai ouvert la dll dans WinHex et Dependency Walker il génère Ordinal, Hint, Function, Entry Point et il génère des noms de fonctions comme(_TRANS2QUIK_CONNECT@16) avec eux l'ancien compilateur fonctionne et renvoie les résultats de la dll. Voulez-vous dire ces noms symboliques ?

@Alexey Viktorov Je ne suis pas moi-même un expert en programmation, mais mes modestes connaissances étaient tout à fait suffisantes pour traiter mon idée. Le blindage ne fonctionne pas.

Trouvé générateur automatique de dll proxy en python https://github.com/mavenlin/Dll_Wrapper_Gen . J'ai pensé que cela fonctionnait pour moi en changeant seulement les noms de fonctions dans la dll construite. J'ai essayé de la construire sans changements, le compilateur jure sur les @ dans les noms de fonctions. Pièce cpp générée

#include <windows.h>
#include <stdio.h>
HINSTANCE mHinst = 0, mHinstDLL = 0;
UINT_PTR mProcs[68] = {0};

LPCSTR mImportNames[] = {"_TRANS2QUIK_CONNECT@16"};
BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) {
        mHinst = hinstDLL;
        if ( fdwReason == DLL_PROCESS_ATTACH ) {
                mHinstDLL = LoadLibrary( "ori_TRANS2QUIK.dll" );
                if ( !mHinstDLL )
                        return ( FALSE );
                for ( int i = 0; i < 68; i++ )
                        mProcs[ i ] = (UINT_PTR)GetProcAddress( mHinstDLL, mImportNames[ i ] );
        } else if ( fdwReason == DLL_PROCESS_DETACH ) {
                FreeLibrary( mHinstDLL );
        }
        return ( TRUE );
}

extern "C" __declspec(naked) void __stdcall _TRANS2QUIK_CONNECT@16_wrapper(){__asm{jmp mProcs[0*4]}}

Morceau du fichier def généré

LIBRARY TRANS2QUIK.dll
EXPORTS
        _TRANS2QUIK_CONNECT@16=_TRANS2QUIK_CONNECT@16_wrapper @1

Je comprends que_TRANS2QUIK_CONNECT@16 _wrapper est le nom des fonctions qui seront visibles à partir de la dll proxy. Alors je l'ai réduit àCONNECTER. La dll est construite, mais le terminal afficheTRANS2QUIK_QUIK_TERMINAL_NOT_FOUND. Je suppose que ce n'est pas pour mon cerveau. Je vais devoir vérifier manuellement le système de trading et y commander dll.

 
f1nik:

@Maxim Kuznetsov J'ai ouvert la dll dans WinHex et Dependency Walker il génère Ordinal, Hint, Function, Entry Point et il génère des noms de fonctions comme(_TRANS2QUIK_CONNECT@16) avec eux l'ancien compilateur fonctionne et renvoie les résultats de la dll. Voulez-vous dire ces noms symboliques ?

@Alexey Viktorov Je ne suis pas moi-même un expert en programmation, mais mes modestes connaissances étaient tout à fait suffisantes pour traiter mon idée. Le blindage ne fonctionne pas.

Trouvé générateur automatique de dll proxy en python https://github.com/mavenlin/Dll_Wrapper_Gen . J'ai pensé qu'il me suffirait de changer les noms des fonctions dans la dll assemblée. Il a construit un projet pour Visual Studio. J'ai essayé de le construire sans changement, le compilateur jure sur les @ dans les noms de fonctions. pièce cpp générée

Morceau du fichier def généré.

Je comprends que_TRANS2QUIK_CONNECT@16 _wrapper est le nom des fonctions qui seront visibles à partir de la dll proxy. Alors je l'ai réduit àCONNECTER. La dll est construite, mais le terminal afficheTRANS2QUIK_QUIK_TERMINAL_NOT_FOUND. Je suppose que ce n'est pas pour mon cerveau. Je vais devoir vérifier manuellement le système de trading et y commander dll.

Vous n'avez pas dit un mot sur la profondeur de bit du terminal et de la DLL. Et c'est important.

 

@Koldun Zloy Essayé Trans2QuikAPI_1.2 il est 32 bit avec mt4 et quik 7, et aussi Trans2QuikAPI_1.3_x64 avec mt5 et quik 8 il est comme 64 bit seulement. J'ai activé les transactions externes dans le quik lui-même. Je pense que je n'ai pas la bonne fonction à importer. Je l'ai écrit moi-même.

int _TRANS2QUIK_CONNECT@16(string lpcstrConnectionParamsString, int& pnExtendedErrorCode[], string lpstrErrorMessage, int dwErrorMessageSize);
В новом компиляторе mt4 можно только так

int _TRANS2QUIK_CONNECT(string lpcstrConnectionParamsString, int& pnExtendedErrorCode[], string lpstrErrorMessage, int dwErrorMessageSize);
В h файле который есть в архиве с dll написано так long TRANS2QUIK_API __stdcall TRANS2QUIK_CONNECT (LPSTR lpstConnectionParamsString,long* pnExtendedErrorCode, LPSTR lpstrErrorMessage, DWORD dwErrorMessageSize);

Type de types de données équivalents. S'il n'était pas correct, je ne pense pas qu'il aurait fonctionné avec l'ancien compilateur.

 
Quoi qu'il en soit, il est possible de connecter la dll. Si vous appelez d'abord une fonction décodée(_TRANS2QUIK_CONNECT@16), alors au moins deux fonctions non décodées fonctionnent. Merci à tous ceux qui ont répondu.
 
Comment puis-je contrôler la vitesse du test sur mt5 de manière programmatique ? Il n'est pas clairement écrit dans le manuel que Sleep() ne peut pas être utilisé dans le testeur, mais cela ne semble pas fonctionner...
Vous devez diminuer la vitesse des tests à un moment donné. Manuellement, il est difficile de saisir tous ces moments...
 
Bonjour, j'ai créé un panneau composé d'un fond et de boutons en MQL5. Lorsque vous faites glisser le panneau, seul l'arrière-plan se déplace et les boutons restent en place, et ce n'est qu'à l'action suivante que les boutons se déplacent derrière l'arrière-plan jusqu'à l'emplacement souhaité. Veuillez m'indiquer comment faire en sorte que les boutons et l'arrière-plan bougent simultanément. Merci d'avance !
 
Mikhail:
Bonjour, j'ai créé un panneau composé d'un fond et de boutons en MQL5. Lorsque je fais glisser le panneau, seul l'arrière-plan se déplace et les boutons restent là où ils sont, et ce n'est qu'au prochain tic qu'ils se déplacent derrière l'arrière-plan jusqu'à l'endroit souhaité. Veuillez m'indiquer comment faire bouger les boutons et l'arrière-plan simultanément. Merci d'avance !

s'agit-il du testeur ou de la version en ligne ?

Si vous êtes en ligne - regardez le code, quelque part l'événement de déplacement n'est pas acheminé normalement. Les panneaux d'ailleurs sur le site seulement cinq bibliothèques différentes, qu'est-ce que vous voulez dire ?

Et dans le testeur - il semble qu'il n'y ait aucun moyen, et pourquoi.