Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1177

 
Alexey Viktorov:

Você já tentou deslizar uma corda como #define strings "long long string" ou até mesmo como duas cordas via + ou função string.

Afinal, o Comentário também é limitado no comprimento do fio, mas as variáveis podem ser empurradas de tal forma que não cabem no monitor em algumas linhas.

Obrigado, o estenógrafo realmente funciona, o compilador entende, mas não aceita funções decodificadas (acho que é assim que é chamado) com @. E o antigo compilador aceita tais funções, mas não acrescenta à substituição de importações, tomando-a literalmente. Se eu importar funções como na documentação dll, ou seja, "TRANS2QUIK_CONNECT" ao invés de "_TRANS2QUIK_CONNECT@16", ele retorna 2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND). Eu não entendo a diferença.
 
f1nik:
Obrigado, de fato o estenógrafo funciona, o compilador entende, mas não aceita funções decodificadas (acho que é assim que é chamado) com @. E o antigo compilador aceita tais funções, mas não acrescenta nada para substituir as importações, levando-as literalmente. Se eu importar funções como na documentação dll, ou seja, "TRANS2QUIK_CONNECT" ao invés de "_TRANS2QUIK_CONNECT@16", ele retorna 2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND). Eu não entendo a diferença.
Abra o arquivo dll no editor hexadecimal, navegue um pouco e você poderá ver os nomes simbólicos dos pontos de entrada. Ou encontre algum explorador dll que faça isso para você, e exiba as dependências ao mesmo tempo.

A propósito, não sei se funcionará, se os pontos de entrada não forem chamados, não se pode passar sem estofamento.
 
f1nik:
Obrigado, a redução funciona, o compilador entende, mas não aceita funções decodificadas (acho que é assim que é chamado) com @. E o antigo compilador aceita tais funções, mas não acrescenta para a importação substituições, levando-as literalmente. Se eu importar funções como na documentação dll, ou seja, "TRANS2QUIK_CONNECT" ao invés de "_TRANS2QUIK_CONNECT@16", ele retorna 2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND). Eu não entendo a diferença.

Não sei onde diz isso na documentação, mas o curinga deve ser precedido por uma barra. Portanto, a linha de endereço deve ser assim: C: arquivo

Então tente escrevê-lo assim:"_TRANS2QUIK_CONNECT\@16".

Na verdade, eu não sou muito bom com .dlls. Então, se isso não funcionar, então...

 

@Maxim Kuznetsov abri a dll em WinHex e Dependency Walker gerando Ordinal, Hint, Function, Entry Point e gerando nomes de funções como(_TRANS2QUIK_CONNECT@16) com eles o antigo compilador funciona e retorna os resultados da dll. Você se refere a estes nomes simbólicos?

@Alexey Viktorov Não sou especialista em programação, mas meu modesto conhecimento foi suficiente para lidar com minha idéia. A blindagem não funciona.

Encontrado o gerador automático de dll proxy em python https://github.com/mavenlin/Dll_Wrapper_Gen . Pensei que funcionava para mim basicamente mudar apenas os nomes das funções na dll construída. Tentei construí-la sem mudanças, o compilador jura em @ nos nomes das funções. Peça gerada cpp

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

Pedaço do arquivo def gerado

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

Entendo que_TRANS2QUIK_CONNECT@16 _wrapper é o nome das funções que serão visíveis na dll do proxy. Por isso, reduzi paraCONNECT. A dll é construída, mas o terminal mostraTRANS2QUIK_QUIK_TERMINAL_NOT_FOUND. Acho que não é para o meu cérebro. Terei que verificar o sistema comercial manualmente e encomendar a dll lá.

 
f1nik:

@Maxim Kuznetsov abri a dll em WinHex e Dependency Walker gerando Ordinal, Hint, Function, Entry Point e gerando nomes de funções como(_TRANS2QUIK_CONNECT@16) com eles o antigo compilador funciona e retorna os resultados da dll. Você se refere a estes nomes simbólicos?

@Alexey Viktorov Não sou especialista em programação, mas meu modesto conhecimento foi suficiente para lidar com minha idéia. A blindagem não funciona.

Encontrado o gerador automático de dll proxy em python https://github.com/mavenlin/Dll_Wrapper_Gen . Pensei que funcionaria essencialmente para mim mudar apenas os nomes das funções na dll montada. Ele construiu um projeto para estúdio visual. Tentei construí-lo sem mudanças, o compilador jura em @ em nomes de funções. peça cpp gerada

Pedaço de arquivo def gerado

Entendo que_TRANS2QUIK_CONNECT@16 _wrapper é o nome das funções que serão visíveis na dll do proxy. Por isso, reduzi paraCONNECT. A dll é construída, mas o terminal mostraTRANS2QUIK_QUIK_TERMINAL_NOT_FOUND. Acho que não é para o meu cérebro. Terei que verificar o sistema comercial manualmente e encomendar a dll lá.

Você não disse uma palavra sobre a profundidade de bits do terminal e DLL. E isto é importante.

 

@Koldun Zloy Tried Trans2QuikAPI_1.2 é 32 bit com mt4 e quik 7, e também Trans2QuikAPI_1.3_x64 com mt5 e quik 8 é como 64 bit apenas. Eu possibilitei transações externas no próprio quik. Pensei que tinha a função errada de importar. Eu mesmo o escrevi.

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 de dados equivalentes. Se não fosse correto, não creio que teria funcionado com o antigo compilador.

 
De qualquer forma, é possível conectar a dll. Se você chamar primeiro uma função decodificada(_TRANS2QUIK_CONNECT@16), então pelo menos duas funções não decodificadas funcionam. Obrigado a todos que responderam.
 
Como posso controlar programticamente a velocidade de teste no mt5? Não está escrito claramente no manual que Sleep() não pode ser usado no testador, mas parece não funcionar...
Você precisa diminuir a velocidade dos testes em um determinado momento. Manualmente, é difícil pegar todos esses momentos...
 
Olá! Eu criei um painel que consiste de fundo e botões em MQL5. Quando arrasto o painel, somente o fundo se move e os botões permanecem no lugar, e somente no próximo tick os botões se movem atrás do fundo para o local desejado. Favor aconselhar como fazer botões e fundo se moverem simultaneamente. Obrigado de antemão!
 
Mikhail:
Olá! criei um painel composto de fundo e botões em MQL5. Quando arrasto o painel, somente o fundo se move e os botões ficam onde estão, e somente no próximo tique se movem atrás do fundo para o lugar desejado. Favor aconselhar como fazer botões e fundo se moverem simultaneamente. Obrigado de antemão!

estamos falando do testador ou on-line?

Se estiver online - veja o código, em algum lugar o evento da mudança não é roteado normalmente. A propósito, painéis no site apenas cinco bibliotecas diferentes, o que você quer dizer?

E no testador - parece que não há como, e por quê.

Razão: