Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1177

 
Alexey Viktorov:

Avete provato a infilare una stringa come #define str " long long string" o anche come due stringhe tramite + o la funzione stringa.

Dopotutto, Comment è anche limitato nella lunghezza della stringa, ma le variabili possono essere spinte così tanto da non adattarsi al monitor in poche righe.

Grazie, la stenografia funziona davvero, il compilatore capisce ma non accetta le funzioni decodificate (credo si chiami così) con @. E il vecchio compilatore accetta tali funzioni ma non aggiunge la sostituzione di importazione prendendola alla lettera. Se importo le funzioni come nella documentazione della dll, cioè "TRANS2QUIK_CONNECT" invece di "_TRANS2QUIK_CONNECT@16", restituisce 2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND). Non capisco la differenza.
 
f1nik:
Grazie, in effetti la stenografia funziona, il compilatore capisce ma non accetta le funzioni decodificate (credo si chiami così) con @. E il vecchio compilatore accetta tali funzioni ma non aggiunge sostituzioni di importazione prendendole alla lettera. Se importo le funzioni come nella documentazione della dll, cioè "TRANS2QUIK_CONNECT" invece di "_TRANS2QUIK_CONNECT@16", restituisce 2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND). Non capisco la differenza.
Aprite il file dll nell'editor esadecimale, navigate un po' e potrete vedere i nomi simbolici dei punti di ingresso. Oppure trovate qualche dll explorer che lo faccia per voi, e mostri le dipendenze allo stesso tempo.

Non sono sicuro che funzionerà a proposito, se i punti di ingresso non sono stdcall, non si può fare a meno del padding.
 
f1nik:
Grazie, la riduzione funziona, il compilatore capisce ma non accetta le funzioni decodificate (credo si chiami così) con @. E il vecchio compilatore accetta tali funzioni ma non aggiunge sostituzioni di importazione prendendole alla lettera. Se importo le funzioni come nella documentazione della dll, cioè "TRANS2QUIK_CONNECT" invece di "_TRANS2QUIK_CONNECT@16", restituisce 2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND). Non capisco la differenza.

Non so dove sia scritto nella documentazione, ma il carattere jolly deve essere preceduto da una barra. Ecco perché la linea dell'indirizzo dovrebbe essere così: C:\cartellafile

Quindi provate a scriverlo così:"_TRANS2QUIK_CONNECT_@16"

In realtà, non sono molto bravo con le .dll. Quindi, se questo non funziona, allora...

 

@Maxim Kuznetsov Ho aperto dll in WinHex e Dependency Walker genera Ordinal, Hint, Function, Entry Point e genera nomi di funzioni come(_TRANS2QUIK_CONNECT@16) con loro il vecchio compilatore funziona e restituisce risultati dll. Intende questi nomi simbolici?

@Alexey Viktorov Io stesso non sono un esperto di programmazione, ma le mie modeste conoscenze erano sufficienti per gestire la mia idea. La schermatura non funziona.

Trovato generatore automatico di dll proxy in python https://github.com/mavenlin/Dll_Wrapper_Gen . Pensavo che funzionasse per me fondamentalmente cambiare solo i nomi delle funzioni nel dll costruito. Provato a costruirlo senza modifiche il compilatore giura su @ nei nomi delle funzioni. Pezzo cpp generato

#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]}}

Pezzo del file def generato

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

Ho capito che_TRANS2QUIK_CONNECT@16 _wrapper è il nome delle funzioni che saranno visibili dalla dll proxy. Così l'ho ridotto aCONNECT. La dll è costruita, ma il terminale mostraTRANS2QUIK_QUIK_TERMINAL_NOT_FOUND. Credo che non sia per il mio cervello. Dovrò controllare il sistema di trading manualmente e ordinare dll lì.

 
f1nik:

@Maxim Kuznetsov Ho aperto dll in WinHex e Dependency Walker genera Ordinal, Hint, Function, Entry Point e genera nomi di funzioni come(_TRANS2QUIK_CONNECT@16) con loro il vecchio compilatore funziona e restituisce risultati dll. Intende questi nomi simbolici?

@Alexey Viktorov Io stesso non sono un esperto di programmazione, ma le mie modeste conoscenze erano sufficienti per gestire la mia idea. La schermatura non funziona.

Trovato generatore automatico di dll proxy in python https://github.com/mavenlin/Dll_Wrapper_Gen . Ho pensato che mi avrebbe funzionato essenzialmente per cambiare solo i nomi delle funzioni nella dll assemblata. Ha costruito un progetto per Visual Studio. Provato a costruirlo senza modifiche il compilatore giura su @ nei nomi delle funzioni. generato pezzo cpp

Pezzo di file def generato.

Ho capito che_TRANS2QUIK_CONNECT@16 _wrapper è il nome delle funzioni che saranno visibili dalla dll proxy. Così l'ho ridotto aCONNECT. La dll è costruita, ma il terminale mostraTRANS2QUIK_QUIK_TERMINAL_NOT_FOUND. Credo che non sia per il mio cervello. Dovrò controllare manualmente il sistema di trading e ordinare dll lì.

Non avete detto una parola sulla profondità di bit del terminale e della DLL. E questo è importante.

 

@Koldun Zloy Provato Trans2QuikAPI_1.2 è 32 bit con mt4 e quik 7, e anche Trans2QuikAPI_1.3_x64 con mt5 e quik 8 è come 64 bit solo. Ho abilitato le transazioni esterne in quik stesso. Ho pensato che ho sbagliato funzione per importare. L'ho scritto io stesso.

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);

Tipo di tipi di dati equivalenti. Se non fosse stato giusto, non credo che avrebbe funzionato con il vecchio compilatore.

 
Comunque, è possibile collegare la dll. Se si chiama prima una funzione decodificata(_TRANS2QUIK_CONNECT@16), allora almeno due funzioni non decodificate funzionano. Grazie a tutti quelli che hanno risposto.
 
Come posso controllare programmaticamente la velocità di prova su mt5? Non è scritto chiaramente nel manuale che Sleep() non può essere usato nel tester, ma non sembra funzionare...
È necessario diminuire la velocità dei test in un certo momento. Manualmente è difficile catturare tutti questi momenti...
 
Salve, ho creato un pannello che consiste di sfondo e pulsanti in MQL5. Quando si trascina il pannello, solo lo sfondo si muove e i pulsanti rimangono al loro posto, e solo al prossimo tick i pulsanti si spostano dietro lo sfondo nella posizione desiderata. Per favore, consigliate come far muovere contemporaneamente i pulsanti e lo sfondo. Grazie in anticipo!
 
Mikhail:
Salve, ho creato un pannello composto da sfondo e pulsanti in MQL5. Quando trascino il pannello, solo lo sfondo si muove e i pulsanti rimangono dove sono, e solo al prossimo tick si spostano dietro lo sfondo nel posto desiderato. Per favore, consigliate come far muovere contemporaneamente i pulsanti e lo sfondo. Grazie in anticipo!

stiamo parlando del tester o dell'online?

Se online - guarda il codice, da qualche parte l'evento move non viene instradato normalmente. Pannelli a proposito sul sito solo cinque librerie diverse, cosa vuoi dire?

E nel tester - sembra che non ci sia modo, e perché.