Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1177

 
Alexey Viktorov:

¿Has probado a deslizar una cadena como #define str " cadena larga larga" o incluso como dos cadenas a través de la función + o string.

Al fin y al cabo, Comment también está limitado en la longitud de la cadena, pero las variables se pueden meter tanto que no caben en el monitor en unas pocas líneas.

Gracias, la taquigrafía realmente funciona, el compilador sí entiende pero no acepta funciones decodificadas(creo que se llama así) con @. Y el compilador antiguo acepta tales funciones pero no añade a la sustitución de la importación tomándola literalmente. Si importo las funciones como en la documentación de la dll, es decir, "TRANS2QUIK_CONNECT" en lugar de "_TRANS2QUIK_CONNECT@16", devuelve 2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND). No entiendo la diferencia.
 
f1nik:
Gracias, efectivamente la taquigrafía funciona, el compilador sí entiende pero no acepta funciones decodificadas (creo que se llama así) con @. Y el antiguo compilador acepta tales funciones pero no añade a la importación sustituciones tomándolas literalmente. Si importo las funciones como en la documentación de la dll, es decir, "TRANS2QUIK_CONNECT" en lugar de "_TRANS2QUIK_CONNECT@16", devuelve 2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND). No entiendo la diferencia.
Abra el archivo dll en el editor hexadecimal, navegue un poco y podrá ver los nombres simbólicos de los puntos de entrada. O encuentra algún explorador de dlls que lo haga por ti, y muestre las dependencias al mismo tiempo.

Por cierto, no es seguro que funcione, si los puntos de entrada no son stdcall, no se puede prescindir del relleno.
 
f1nik:
Gracias, la reducción sí funciona, el compilador sí entiende pero no acepta funciones decodificadas (creo que se llama así) con @. Y el antiguo compilador acepta tales funciones pero no añade a la importación sustituciones tomándolas literalmente. Si importo las funciones como en la documentación de la dll, es decir, "TRANS2QUIK_CONNECT" en lugar de "_TRANS2QUIK_CONNECT@16", devuelve 2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND). No entiendo la diferencia.

No sé dónde lo dice la documentación, pero el comodín debe ir precedido de una barra. Por eso, la línea de dirección debería ser así: C:\N-carpeta-archivo

Así que intenta escribirlo así:"_TRANS2QUIK_CONNECT\@16"

En realidad, no soy muy bueno con las .dlls. Así que si eso no funciona, entonces...

 

@Maxim Kuznetsov Abrí la dll en WinHex y Dependency Walker genera Ordinal, Hint, Function, Entry Point y genera nombres de funciones como(_TRANS2QUIK_CONNECT@16) con ellos el viejo compilador funciona y devuelve resultados de la dll. ¿Se refiere a estos nombres simbólicos?

@Alexey Viktorov Yo mismo no soy un experto en programación, pero mis modestos conocimientos fueron suficientes para manejar mi idea. El blindaje no funciona.

Encontrado generador automático de dll de proxy en python https://github.com/mavenlin/Dll_Wrapper_Gen . Me funcionó básicamente cambiar solo los nombres de las funciones en la dll construida. Intenté construirla sin cambios el compilador jura @ en los nombres de las funciones. Pedazo de cpp generado

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

Parte del archivo def generado

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

Entiendo que_TRANS2QUIK_CONNECT@16 _wrapper es el nombre de las funciones que serán visibles desde el proxy dll. Así que lo reduje aCONNECT. La dll está construida, pero el terminal muestraTRANS2QUIK_QUIK_TERMINAL_NOT_FOUND. Supongo que no es para mi cerebro. Tendré que comprobar el sistema de comercio manualmente y ordenar dll allí.

 
f1nik:

@Maxim Kuznetsov Abrí la dll en WinHex y Dependency Walker genera Ordinal, Hint, Function, Entry Point y genera nombres de funciones como(_TRANS2QUIK_CONNECT@16) con ellos el viejo compilador funciona y devuelve resultados de la dll. ¿Se refiere a estos nombres simbólicos?

@Alexey Viktorov Yo mismo no soy un experto en programación, pero mis modestos conocimientos fueron suficientes para manejar mi idea. El blindaje no funciona.

Encontrado generador automático de dll de proxy en python https://github.com/mavenlin/Dll_Wrapper_Gen . Pensé que esencialmente me funcionaría cambiar sólo los nombres de las funciones en la dll montada. Construyó un proyecto para visual studio. Intenté construirlo sin cambios el compilador jura por la @ en los nombres de las funciones. pedazo de cpp generado

Pieza de archivo def generada

Entiendo que_TRANS2QUIK_CONNECT@16 _wrapper es el nombre de las funciones que serán visibles desde el proxy dll. Así que lo reduje aCONNECT. La dll está construida, pero el terminal muestraTRANS2QUIK_QUIK_TERMINAL_NOT_FOUND. Supongo que no es para mi cerebro. Tendré que comprobar el sistema de comercio manualmente y ordenar dll allí.

No has dicho ni una palabra sobre la profundidad de bits del terminal y la DLL. Y esto es importante.

 

@Koldun Zloy Probado Trans2QuikAPI_1.2 es de 32 bits con mt4 y quik 7, y también Trans2QuikAPI_1.3_x64 con mt5 y quik 8 es como de 64 bits solamente. He habilitado las transacciones externas en el propio quik. Pensé que tenía una función incorrecta para importar. Lo escribí yo mismo.

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

Tipos de datos equivalentes. Si no estuviera bien, no creo que hubiera funcionado con el antiguo compilador.

 
De todos modos, es posible conectar la dll. Si se llama primero a una función decodificada(_TRANS2QUIK_CONNECT@16), entonces funcionan al menos dos no decodificadas. Gracias a todos los que han respondido.
 
¿Cómo puedo controlar la velocidad de la prueba en mt5 programáticamente? No está claramente escrito en el manual que Sleep() no se puede utilizar en el probador, pero parece que no funciona...
Es necesario disminuir la velocidad de las pruebas en un momento determinado. Manualmente es difícil captar todos esos momentos...
 
Hola! He creado un panel que consta de fondo y botones en MQL5. Al arrastrar el panel, sólo se mueve el fondo y los botones permanecen en su sitio, y sólo en el siguiente tick los botones se mueven detrás del fondo hasta la ubicación deseada. Por favor, indíqueme cómo hacer que los botones y el fondo se muevan simultáneamente. Gracias de antemano.
 
Mikhail:
Hola, he creado un panel con fondo y botones en MQL5. Cuando arrastro el panel, sólo se mueve el fondo y los botones se quedan donde están, y sólo en el siguiente tick se mueven detrás del fondo hasta el lugar deseado. Por favor, indíqueme cómo hacer que los botones y el fondo se muevan simultáneamente. Gracias de antemano.

¿hablamos del probador o de internet?

Si está en línea - mire el código, en algún lugar el evento de movimiento no se enruta normalmente. Paneles por cierto en el sitio sólo cinco bibliotecas diferentes, ¿qué quieres decir?

Y en el probador - parece que no hay manera, y por qué.