Desenvolveu uma biblioteca de funções API para o MetaTrader 4 - página 7

 
Boa tarde, então consultei um programador que conheço, e ele explicou que se esta DLL não foi escrita especificamente para uso em Omega, não pode haver garantia de funcionalidade. Porque a Omega pode não ter os recursos necessários nos parâmetros de chamada de função da DLL. Aqui está um exemplo:
int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
esta linha não suporta dados como "TDateTime *tim" em Omega.
Isso significa que somente as funções de início e fim do terminal onde não há parâmetros definidos funcionam. Onde os parâmetros são definidos, precisamos saber quais parâmetros são tomados pela DLL, seria bom ter exemplos.
Eu acho que você terá que olhar um exemplo em Delphi com um programador que pode lhe dizer exatamente o que você precisa, e então procurar por ferramentas Omega para entregar os parâmetros necessários para a DLL. Se VOCÊ quisesse lançar uma versão da DLL especificamente para Omega, isso tornaria imensamente mais fácil de testar e usar rapidamente, eu acho que haveria muitos usuários com Omega. Já existem alguns usuários interessados. Aqui está um pequeno extrato da Omega HELP:
Um ponto importante é a lista de tipos de dados suportados, veja abaixo.



Definição da Função DLL

Antes de chamar uma função DLL do EasyLanguage, você deve declarar a DLL usando a instrução Declaração de Função DLL.

Sintaxe:

DefineDLLFunc: "DLLNAME.DLL", Return Type, "FunctionName", Parâmetros;

DLLNAME.DLL é o nome da DLL onde a função reside, Return Type é o tipo de expressão que a função retornará, FunctionName é o nome da função como definido na DLL, Parameters é a lista de parâmetros esperados pela função (cada parâmetro separado por vírgula).

É muito importante lembrar que as DLLs de 32 bits utilizam funções declaradas exportadas, sensíveis a casos, utilizando _cdecl, stdcall, ou fastcall. Para que as DLLs sejam compatíveis com EasyLanguage, as funções exportadas devem ser criadas usando letras maiúsculas e devem ser declaradas como _stdcall. Estas funções de exportação devem ser listadas dentro da seção EXPORTS .DEF do arquivo DLL. Usar "_declspec (dllexport)" do protótipo de função não é suficiente para o EasyLanguage localizar as funções DLL exportadas.

Por exemplo, a seguinte instrução declara uma função chamada MessageBeep que está permanentemente localizada em uma DLL chamada USER32.DLL. Ele retorna um valor booleano (verdadeiro/falso) e espera um único parâmetro, int.

DefineDLLFunc: "USER32.DLL", bool, "MessageBeep", int;

Tipos de dados

EasyLanguage suporta muitos tipos de dados válidos que podem ser usados para enviar e receber informações para funções contidas em DLLs. Aqui está uma lista de tipos de dados suportados pelo EasyLanguage:

Tipos de dados fundamentais:

BYTE
1 byte inteiro de tipo de dados.

char
1 byte inteiro tipo de dado.

int
4 bytes assinados tipo de dados inteiros.

PALAVRA
2 bytes tipo de dados inteiros não assinados.

longo
4 byte tipo de dados inteiros assinados.

DWORD
4 bytes tipo de dados inteiros não assinados.

float
4 byte tipo de dados de ponto flutuante.

duplo
8 bytes tipo de dados de ponto flutuante.

BOOL
4 byte tipo de dados booleanos.




Variantes:


LONGO UNIDO
O mesmo que DWORD.

VOID
Significa "Nenhum valor retornado".

Tipos de Ponteiros:


LPBYTE
Ponteiro para um BYTE.

LPINT
Apontador para um int.

LPWORD
Ponteiro para uma PALAVRA.

LPLONG
Apontador para um LONG.

LPDWORD
Apontador para uma DWORD.

LPFLOAT
Ponteiro para um flutuador (in float FAR).

LPDOUBLE
Apontador para um duplo (em FAR duplo).

LPSTR
Apontador para um char.


Todos os indicadores são indicadores de 32 bits e o EasyLanguage lida com cada um deles da mesma maneira.

É também muito importante lembrar que todos os valores no EasyLanguage são flutuantes, exceto os valores Aberto, Alto, Baixo e Fechado, que são números inteiros. Para controlar estes preços, você deve enviar a função de escala de preços para o símbolo que compõe o gráfico.

Por exemplo, se um título tem uma escala de preços de 1/1000 e o preço final foi 105,125, esse preço será enviado para a DLL como 105125. Para que a DLL saiba ler este preço, você deve enviar o valor na palavra reservada PriceScale, que neste caso retorna o valor 1.000.
 
A Omega pode não ter os recursos necessários nos parâmetros da chamada de função DLL. Aqui está um exemplo :<br/ translate="no"> int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
nesta linha os dados do tipo "TDateTime *tim" não são suportados pela Omega.

Tudo isso faz sentido agora. Para contornar este problema, tente especificar o tipo duplo em Omega ao invés de TDateTime - ou seja, int TikKot(char, double, double, double);
Na verdade, estes tipos são facilmente intercambiáveis e usam 8 bytes de memória cada um. Boa sorte!
 
OK, obrigado. E quanto ao tipo "char", Omega requer Numérico, mas a DLL precisa de texto? É possível substituí-lo?
 
OK, obrigado. E quanto ao tipo "char", Omega requer Numérico, mas a DLL precisa de texto? Pode ser substituído por ? <br / translate="no">

Por quê? Está na descrição:
LPSTR
Apontador para um char.

É a mesma coisa. Existem exemplos para estes tipos de variáveis na documentação Omega? Você precisa procurar cuidadosamente por variantes similares. Boa sorte!
 
Boa tarde, encontrei o problema:
Isto é da ajuda das DLLs:

Nota: As DLLs de 32 bits utilizam funções exportadas sensíveis a maiúsculas e minúsculas declaradas utilizando _cdecl, _stdcall , ou fastcall. Para que as DLLs sejam compatíveis com o EasyLanguage, as funções exportadas devem ser criadas usando todas as letras maiúsculas e ser declaradas como _stdcall. Estas funções exportadas devem ser listadas dentro da seção EXPORTAÇÕES do arquivo .DEF da DLL. Usar "_declspec (dllexport)" do protótipo da função não é suficiente para que o EasyLanguage localize as funções exportadas de uma DLL.

Assim, diz aqui que a Omega só trabalha com aquelas funções que estão escritas em letras grandes. Eu verifiquei como está escrito em outra DLL, na verdade apenas em CARTAS GRANDES.
Se você mudar a chamada de funções (nomes em letras maiúsculas), então podemos testar mais.
Pessoalmente, estou muito interessado em seu produto e meu pedido a você é de adequar a DLL à Omega. Espero que funcione... Boa sorte!
Se você não postar aqui, por favor, terei que trabalhar em outra solução de automação comercial. Obrigado.
 
<br / translate="no"> Se você mudar a função chamada (nomes em letras maiúsculas), então você pode testar mais.
Pessoalmente, estou muito interessado em seu produto e meu pedido a você é de adequar a DLL à Omega. Espero que funcione... Boa sorte!

Eu fiz uma variante com grandes cartas funcionais e a enviei para sua caixa de entrada. Boa sorte!
 
Muito obrigado, eu estarei testando e publicarei os resultados.