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

 
A propósito, agora o que Min oferece é mais parecido com o que você pode comprar do que antes. <br / translate="no"> Purely imho :)

Obrigado! Ansioso por ofertas comerciais. Boa sorte!
 
É difícil chamá-lo de um API. Biblioteca + EA. Funciona MUITO lentamente.
 
...
 
Pergunta para o desenvolvedor da biblioteca: por que a velocidade de obter citações quando se usa sua biblioteca é ainda mais lenta do que quando se trabalha com arquivos temporários? Qual é então a vantagem de usar a memória compartilhada? <br/ translate="no">.

O que você quer dizer com rapidez na obtenção de citações? Se está recebendo carrapatos, já escrevi que trabalhar com carrapatos de citações, mesmo diretamente no MT4, é difícil.
A biblioteca não foi originalmente projetada para capturar carrapatos. Tem a ver com o fato de que o sistema pode simplesmente desligar quando o mercado está muito ativo, porque não consegue acompanhar os carrapatos. É por isso que a biblioteca tem um software de proteção integrado contra avalanche de carrapatos.
As vantagens de utilizar a memória compartilhada são a alta confiabilidade de tal sistema e a ausência de entupimento do disco rígido. Além disso, vários programas podem acessar a biblioteca, e eles não precisam "saber" a localização exata dos arquivos temporários. Boa sorte!
 
Quando o mercado é muito ativo, o sistema pode simplesmente congelar por causa da incapacidade de acompanhar os carrapatos. É por isso que na biblioteca há uma proteção de software embutida contra avalanche de carrapatos.


parece que o autor exagerou :)
pelo que entendi, se a EA estiver dentro da função start() (e enviar informações sobre um carrapato para o cliente API de lá), então a MT não dará um novo carrapato até que a EA deixe a função start(). É por isso que não está claro como pode ocorrer uma avalanche de carrapatos?

se a EA for ligada em loop e receber carrapatos via RefreshRates, então primeiro ela deve sair do API do cliente, e então a chamada de RefreshRates ocorrerá. É por isso que aqui também não há lugar para congelamento.

A vantagem de usar memória compartilhada é a alta confiabilidade de um sistema desse tipo

soa bem, mas não é a única forma de comunicação entre processos.
então o tópico "Qual é o objetivo do uso de memória compartilhada?" não está resolvido :)

imho, MMF é bom apenas em um caso quando você precisa bombear grandes quantidades de dados entre processos - a velocidade de bombeamento é de ~150Mb/seg. (alguns meses atrás eu tive que fazer tal mecanismo apenas com MMF, porque de acordo com testes esta é a maneira mais rápida).

nesta tarefa (parâmetros de transferência para OrderSend etc.) - é como um pássaro através de uma pena, mais fácil de criar uma janela e usar SendMessage com wm_copydata.
 
parece sólido, mas não é a única forma de comunicação interprocessada. <br / translate="no"> então o tópico "...Qual o lado positivo de usar memória compartilhada então?" não está resolvido :)

Acho que não estou argumentando que o algoritmo utilizado seja o melhor. Essa é a beleza da programação, que tal problema pode ser resolvido de pelo menos uma dúzia de maneiras. Variante com arquivos temporários também estava funcionando plenamente. Minha tarefa era desenvolver um substituto confiável, viável e totalmente funcional para o MT3 API. Agora a biblioteca trabalha com o programa prático de comércio por cerca de meio ano. E o principal problema aqui não foi a obtenção de velocidade máxima, mas a confiabilidade e resposta adequada a um grande número de situações de emergência. Portanto, obrigado por seus comentários, eles são bastante apropriados, mas isso é "outra história". Boa sorte!
 
Olá, então o principal problema no momento é a conexão:

Incluir a biblioteca de importação Mforex2.lib no projeto (para Delpi - basta descrever as funções da biblioteca),
Especificar o arquivo de cabeçalho Mforex.h no programa principal (por exemplo: #incluir "Mforex".h" - somente para o Builder C++);

Estes 2 pontos são misteriosos para mim porque o programa Omega está pronto, todos os outros arquivos que coloquei como descrito, função prescrita para iniciar o MT4, e no início recebi a mensagem de que é necessário prescrever o caminho exato, mas também prescrevi o caminho. Eu não sei o que fazer a seguir.
 
Incluir na biblioteca de importação do projeto Mforex2.lib (para Delpi - descrever apenas funções da biblioteca),<br/ translate="no"> Especificar no arquivo principal do cabeçalho do programa Mforex.h (por exemplo: #incluir "Mforex".h" - somente para o Builder C++);
Estes 2 pontos são um mistério para mim porque o programa Omega está pronto, todos os outros arquivos que coloquei como descrito, prescrevi a função para iniciar o MT4, e na inicialização recebi uma mensagem de que é necessário prescrever o caminho exato, mas também prescrevi o caminho. Eu não sei o que fazer a seguir.

A Omega tem a possibilidade de importar funções a partir de DLLs externas. Portanto, você deve especificar a Mforex2.dll como a biblioteca externa. Ao mesmo tempo, este arquivo deve estar no "campo de visão" dos programas Omega. Nos procedimentos de chamada, especificar o nome das funções importadas da DLL, conforme indicado na documentação. Note também que a Omega "não conhece" as definições do arquivo Mforex.h. Isto é, por exemplo, ao chamar a função de abrir uma posição, você precisa especificar o código de operação para, digamos, Sell - 1, em vez de OP_SELL, etc. Para mais detalhes, consulte a documentação DevKit, que descreve a forma como o ômega funciona com bibliotecas externas.
Boa sorte!
 
<br / translate="no"> É possível importar funções a partir de DLLs externas em Omega. Portanto, a Mforex2.dll deve ser especificada como uma biblioteca externa. Ao mesmo tempo, este arquivo deve estar "à vista" dos programas Omega. Nos procedimentos de chamada, especificar o nome das funções importadas da DLL, conforme indicado na documentação. Note também que a Omega "não conhece" as definições do arquivo Mforex.h. Isto é, por exemplo, ao chamar a função de abrir uma posição, você precisa especificar o código de operação para, digamos, Sell - 1, em vez de OP_SELL, etc. Para mais detalhes, consulte a documentação DevKit, que descreve a forma como o ômega funciona com bibliotecas externas.
Boa sorte!


Por isso, prescrevi o seguinte em Omega:

DefinirDLLfunc: "Mforex2.dll", int, "Start"; {DLL call}
_gbp = Start(); {função de inícioterminal}

Mas você diz que aqui deveríamos escrever algo mais em vez de "Start()", eu entendi bem?
 
<br/ translate="no"> Então eu prescrevi o seguinte em Omega:

DefineDLLfunc: "Mforex2.dll", int, "Start"; {call DLL}
_gbp = Start(); {terminal start function}

Mas você diz que ao invés de "Start()" você deve escrever algo mais, estou certo?

Estou respondendo a mim mesmo: você não deveria escrever outra coisa em vez de "Start()" - isso mesmo, Omega inicia o MT4 sem nenhum problema.

Mas é um pouco mais complicado na função de abertura de posição, então eu prescrevi a função:

Entrada: Symbol(NumericSimple), Order(NumericSimple), Lot(NumericSimple),
price(NumericSimple), sl(NumericSimple), tp(NumericSimple);


DefineDLLfunc: "Mforex2.dll", int, "NewPos",char, int, int, double, double, double;

_NewPos = NewPos(Symbol, Order, Lot, price, sl, tp);

Logicamente tudo se encaixa na descrição do fabricante, mas na prática há problemas: tudo é definido em números...