Chamando funções da dll e retornando resultados - página 6

 
Aquele f1-forum
Mike = Terranin = eu :) E eu já lhe dei o emulador no fórum Alpari. A MTS não me interessa muito, se você soubesse quantos deles caíram no meu emulador... :)
 
2 mike
:)) Isso foi o que eu pensei. Se você estiver interessado, você pode ver meu sistema aqui
http://forum.alpari-idc.ru/viewtopic.php?t=45555
É um pouco confuso, é claro...
Se você quiser, descreverei o sistema, como você me ajudou com o emulador.
 
OK, se você quiser compartilhar, então para murdoc (at) newmail.ru. Vou fazer o teste e informá-lo sobre os resultados.
 
Renat:<br / translate="no"> Por _default_ qualquer importação de uma DLL é _completamente_ proibida_. Esta é a proteção.
Se você quiser usar DLL externas, basta ativar o botão "Confirmar cada chamada de função DLL" e ver o que é chamado lá. Isto também é proteção. Assim como a proteção de todas as operações de arquivos embutidos com acesso apenas aos diretórios /histórico e /files.

Se alguma pessoa oferece o Expert Advisor ao público com sua DLL, o usuário confia ou não nessa DLL. Se ele não confiar, não fará o download. Se confiar, terá que marcar a caixa "Permitir a importação de funções DLL", caso contrário o especialista não funcionará. Os nomes das funções que você está chamando também não serão úteis ao Expert Advisor, porque para saber o que uma função faz, você terá que desmontar a DLL, e nem todos serão capazes de fazer isso. E nesta DLL você pode fazer muitas coisas desagradáveis, e o terminal MT não pode impedi-lo. Portanto, a "proteção" é muito relativa e não é uma proteção real neste contexto. Acho que era isto que o Mike queria dizer.

A possibilidade de chamada de funções de DLLs de usuários no MT 4 Expert Advisors é posicionada como um substituto da API que está presente no MT 3. Portanto, mesmo assim, há uma oportunidade de transformar o terminal MT 4 em um datafeed e fazer pedidos, o que foi uma das razões (a julgar por vários tópicos nos fóruns) pela qual o API foi removido. Mas a API permaneceu, é muito desconfortável, muitos usuários falam sobre ela e ela lembra a situação a partir da piada: ".... Não me importo, desde que você se canse disso". E este tópico é uma confirmação disso. O autor não recebeu nenhuma resposta específica e informativa a suas perguntas. Estas perguntas também são relevantes para mim, as respostas são ainda mais relevantes :-).
Talvez eu também não seja um programador experiente, mas no atual sistema Expert Advisor<->DLL, você, por definição, não pode ter uma solução simples e bonita. Para ser mais exato, dentro do escopo da MQL4 pode haver uma bela solução, mas dentro do escopo de integração do terminal MT4 com software personalizado não é nada, para dizer de forma branda. Existem outras soluções mais funcionais, você só precisa encontrá-las :-). Por exemplo, podemos criar uma DLL com funções como na mtapi.dll, mas ela interagirá não com o servidor do centro de negociação, mas com o terminal do cliente. Neste caso, tanto os interesses do desenvolvedor serão preservados (sem o terminal MT4 a DLL não poderá operar) e as pessoas, que são capazes de criar algo mais complexo que a MQL4 Expert Advisors, terão uma boa oportunidade de integrar seu próprio software (incluindo sua própria astúcia) com o sistema comercial. Se tal variante tiver sido considerada e discutida, por favor, me dê um link (não encontrei tal variante). Caso contrário, eu gostaria de saber a opinião dos desenvolvedores sobre este assunto.

P.S. A seqüência "possibilidade de usar o API do cliente" na descrição do terminal comercial é muito atraente. Foi isso que me atraiu no MetaTrader, e fiquei muito decepcionado com a falta de API na versão 4 do terminal. Espero que os desenvolvedores de um lado e os usuários de API do outro venham a se comprometer. A situação atual (chamando funções DLL da ekperts) é insatisfatória.
 
Encontrei um problema, é claro que posso ser muito lento e não acertado.....

Eu tenho um dll compilado para VC++
há uma função:

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

no Expert Advisor, a seguinte declaração:
#importar "some.dll
processo vazio_arr(double in[], double& out[], int size);

arrays são declarados a seguir:

duplo arr1[100];
duplo arr2[100];

então inicializo a primeira matriz e passo ambas para a função
process_arr(arr1,arr2,100);

tudo é passado, mas a função recusa-se a devolvê-lo

Depois de retornar da função, eu produzo o valor do teste:
Imprimir(arr2[1]);
e a seguinte entrada aparece no registro
2005.09.19 18:30:03 arrtest EURUSD,H1: 2147483647
este não é o ponto, o que a 2^31.... tem a ver com isso?
funciona da mesma forma com qualquer outro elemento da matriz.
embora sob o depurador antes de sair da função os valores na matriz de saída sejam como deveriam ser (perto do preço - ~1,2)
 
O número 2147483647 está muito próximo de zero, ao que parece.
2^31-1 para ser exato, que deve ser como zero.
 
void __stdcall process_arr(double *in, double *out, int size); <br / translate="no">
Aqui está a declaração no Expert Advisor:
#importar "some.dll
processo vazio_arr(double in[], double& out[], int size);


Apenas uma sugestão (porque eu não estou familiarizado com MQL): é & realmente necessário para o segundo parâmetro?
processo vazio_arr(double in[], double& out[], int size);
 
para Rosh, isso é verdade, mas estamos falando do tipo duplo, e aí a representação numérica é "ligeiramente" diferente, e 2^31 está bem longe de 0.... :(

para a VicK, o ampersand é a questão, graças a ele posso realmente mudar o conteúdo da matriz...
a segunda matriz é uma matriz com valores de retorno
 
para a VicK, o ampersand é a questão, graças a ele posso realmente mudar o conteúdo da matriz... <br / translate="no"> a segunda matriz é uma matriz com valores de retorno


Neste caso, não há essência no ampersand (eu mesmo acabei de experimentá-lo), e você pode mudar o conteúdo da matriz graças a outra coisa :-). Você olhou para o exemplo da DLL no diretório? Lá tudo funciona bem. Faça-o da mesma forma.
 
parece que o ampersand não faz nenhuma diferença se lidarmos com uma matriz do tipo duplo[]
mas tudo funciona bem com int[]. Tenho uma suspeita de que aqui começa a sentir o cheiro de bug.... :(
Eu gostaria de saber os comentários dos desenvolvedores

se esta coisa viesse com o código fonte, ninguém se incomodaria, mas... Vá em frente, estou pedindo ajuda.
Razão: