Deep Learning: integração MT5 com TensorFlow

 

Bom dia, amigos!

Estou querendo que um EA meu, desenvolvido no MT5, tome decisões com base na saída de uma rede neural profunda, previamente treinada no TensorFlow.

Como esse EA vai operar em escala de tempo muito curta, preciso que o cálculo da saída da rede neural seja muito rápido, preferencialmente com uso da GPU.  

Pensei nas seguintes alternativas de implementação:

1) Calcular a saída da rede em tempo real no próprio TensorFlow e integrar MQL5 com Python (via sockets, se estiverem em máquinas distintas, ou via named pipes, se estiverem na mesma máquina).

2) Implementar o cálculo da saída da rede diretamente em MQL5, de forma artesanal (trabalhoso e pouco flexível, né? Teria a mesma velocidade do TensorFlow,, cujos cálculos aritméticos se baseiam no Numpy? Teria como usar a GPU?)

3) Utilizar alguma biblioteca MQL5 que calcule a saída de uma rede neural profunda a partir da descrição de sua arquitetura (alguém conhece alguma? Caso exista, é eficiente? Usa GPU?)

A princípio, estou tendendo para a alternativa (1). Alguém tem alguma ideia melhor?

Qualquer contribuição (inclusive crítica) é bem vinda.

Obrigado. Abraços a todos!

 

Bom tarde Trader_Patinhas!

Bem legal este tópico!

Meu comentário terá mais perguntas do que respostas, rsrs

Vamos lá!

1 - O que te motivou a utilizar Deep Learning e não uma MLP de 1/2 camadas ocultas ou outros algoritmos de classificação?

2 - Por que você deseja utilizar a GPU para classificar apenas um novo exemplo?

3 - Apenas curiosidade, quantos exemplos você tem em seu dataset?

4 - Outra curiosidade, qual o tamanho da sua camada de entrada?

5 - A sua classe é discreta ou contínua?

6 - Quando você diz em escala de tempo muito curta, é tiro curto ou você está tentando prever o próximo tick?

7 - Você pode dar mais detalhes sobre a arquitetura de sua rede?

 

Sobre as alternativas que você propôs:

O maior problema está no treinamento da rede, se a rede já está treinada e você encontrou um bom classificador, não tem necessidade de utilizar a GPU, a não ser que você queira treinar a rede novamente.

Por questões de facilidade e teste, eu começaria com REST, sockets.

Eu iria para a alternativa 2 para tentar minimizar o tempo de resposta, mas isso implica em realizar uma boa implementação e entender todos os detalhes da rede utilizada no TF. Estou supondo também que o sistema como um todo está performando bem ou pelo menos me dando indícios disso. Pro treinamento, deixaria pro TF por conta de utilizar a GPU para treinar.

Se eu não me engano, a biblioteca ALGlib apresenta algumas implementações de redes neurais, acredito que ela não dê suporte a GPU não.

Em suma, eu começaria pelo mais simples e iria avançando conforme eu tivesse bons resultados ou indícios. Medir latências e outros tempos de resposta também é interessante para saber se estamos no rumo certo para deixar o sistema como um todo em produção.

Abs.

 
Olá,

Fiz algo parecido.

Criei uma DLL que faz o meio de campo entre o MT5 e um Rest (usando flask e que faz toda a aprendizagem de máquina).

Está funcionando até bem aqui, estou selecionando as melhores features para ter uma precisão melhor.

Abraços 
 
Romeu Bertho:

Bom tarde Trader_Patinhas!

Bem legal este tópico!

Meu comentário terá mais perguntas do que respostas, rsrs

Vamos lá!

1 - O que te motivou a utilizar Deep Learning e não uma MLP de 1/2 camadas ocultas ou outros algoritmos de classificação?

2 - Por que você deseja utilizar a GPU para classificar apenas um novo exemplo?

3 - Apenas curiosidade, quantos exemplos você tem em seu dataset?

4 - Outra curiosidade, qual o tamanho da sua camada de entrada?

5 - A sua classe é discreta ou contínua?

6 - Quando você diz em escala de tempo muito curta, é tiro curto ou você está tentando prever o próximo tick?

7 - Você pode dar mais detalhes sobre a arquitetura de sua rede?

 

Sobre as alternativas que você propôs:

O maior problema está no treinamento da rede, se a rede já está treinada e você encontrou um bom classificador, não tem necessidade de utilizar a GPU, a não ser que você queira treinar a rede novamente.

Por questões de facilidade e teste, eu começaria com REST, sockets.

Eu iria para a alternativa 2 para tentar minimizar o tempo de resposta, mas isso implica em realizar uma boa implementação e entender todos os detalhes da rede utilizada no TF. Estou supondo também que o sistema como um todo está performando bem ou pelo menos me dando indícios disso. Pro treinamento, deixaria pro TF por conta de utilizar a GPU para treinar.

Se eu não me engano, a biblioteca ALGlib apresenta algumas implementações de redes neurais, acredito que ela não dê suporte a GPU não.

Em suma, eu começaria pelo mais simples e iria avançando conforme eu tivesse bons resultados ou indícios. Medir latências e outros tempos de resposta também é interessante para saber se estamos no rumo certo para deixar o sistema como um todo em produção.

Abs.

Oi Romeu.

Desculpe-me, acabei me esquecendo de acompanhar essa thread que eu mesmo abri.

Implementei com sucesso a solução 1. Descartei a solução 2 porque o projeto certamente requererá desenvolvimento/aprimoramento contínuo e implementar o processamento dos modelos em MQL5 me obrigaria a um retrabalhar o EA a cada ajuste de variáveis de entrada/saída e/ou arquitetura do modelo, enquanto que com uso do scikit-learn e do TensorFlow/Keras, esses ajustes ficam muito mais simples e flexíveis e podem ficar fora do robô, além de essas bibliotecas já terem uma implementação extremamente eficiente e madura (baixíssimo risco de bugs).  

Sobre suas perguntas, a resposta a quase todas elas é que tenho feito experimentos com quase todas essas possibilidades (diversos modelos preditivos, desde simples classificadores bayesianos até redes CNN e LSTM, diferentes datasets e conjuntos de features, diferentes escalas de tempo, sinais de saída discretos e contínuos, diferentes estratégias de trading a partir desses sinais, etc.), de modo que tudo isso ainda está em aberto no momento, daí a minha necessidade de flexibilidade e agilidade no desenvolvimento, que justificou minha opção pela alternativa 1.

Quanto à pergunta 2, vc tem razão no comentário de que o uso de GPU provavelmente não será um fator relevante, pois o treinamento e validação dos modelos eu tenho feito (e pretendo continuar fazendo) sempre fora do ambiente Metatrader. Dentro do EA eu pretendo executar somente classificações e regressões mesmo. Mas mesmo assim eu tinha interesse nessa resposta porque, dentro do meu plano de voo, estão a possibilidade de usar ensembles (combinar respostas de vários modelos diferentes) e também o monitoramento simultâneo de um grande número de ativos (talvez com modelos treinados especificamente para cada um, ou para certos grupos), de modo que a velocidade de classificação/regressão pode vir a se tornar importante para mim no futuro, caso se mostre vantajoso o uso simultâneo de uma grande quantidade de modelos preditivos. Mas agora já tenho essa resposta: na minha implementação o TensorFlow chamado de dentro do Metatrader está usando GPU numa boa, com o mesmo desempenho que quando chamado do lado de fora.

Abraço!

 
ipsec:
Olá,

Fiz algo parecido.

Criei uma DLL que faz o meio de campo entre o MT5 e um Rest (usando flask e que faz toda a aprendizagem de máquina).

Está funcionando até bem aqui, estou selecionando as melhores features para ter uma precisão melhor.

Abraços 

Oi ipsec.

Eu já tinha testado com sucesso comunicação por socket e por named pipes sem uso de DLL. Atualmente uso named pipes. Qualquer esquema de troca de dados com um ambiente externo funcionará bem, desde que a conexão seja boa e que o tempo de comunicação seja desprezível para os propósitos do robô. 

Um alerta: já li em algum lugar que os servidores VPS da Metatrader não permitem usar DLL. Então, se vc pretender um dia rodar o robô na VPS Metatrader, precisará se livrar dessa DLL. Mas se usar Google/Amazon/Azure pode manter a DLL (eu tenho usado Amazon e Azure). 

 
Trader_Patinhas:

Oi ipsec.

Eu já tinha testado com sucesso comunicação por socket e por named pipes sem uso de DLL. Atualmente uso named pipes. Qualquer esquema de troca de dados com um ambiente externo funcionará bem, desde que a conexão seja boa e que o tempo de comunicação seja desprezível para os propósitos do robô. 

Um alerta: já li em algum lugar que os servidores VPS da Metatrader não permitem usar DLL. Então, se vc pretender um dia rodar o robô na VPS Metatrader, precisará se livrar dessa DLL. Mas se usar Google/Amazon/Azure pode manter a DLL (eu tenho usado Amazon e Azure). 


Olá Trader_Patinhas,


Realmente é um problema usar DLL, mas ainda não me aprofundei em usar sockets ou named pipes.

Coloquei para treinar por 1 dia para ver o resultado e foi promissor. A aprendizagem ocorreu bem e parei próximo de 20000 epochs de treinamento.




Agora vou colocar para treinar 1 ano. Vai demorar muito convergir, mas faz parte

Enquanto ele treina esse vou dar uma olhada no named pipes para ver se acelero algo.

Vi que adicionaram suporte a python no MT5 (e do tensorflow) só ainda não sei como utlizar.

Abraços.

 
ipsec:


Olá Trader_Patinhas,

Realmente é um problema usar DLL, mas ainda não me aprofundei em usar sockets ou named pipes.

Coloquei para treinar por 1 dia para ver o resultado e foi promissor. A aprendizagem ocorreu bem e parei próximo de 20000 epochs de treinamento.

Agora vou colocar para treinar 1 ano. Vai demorar muito convergir, mas faz parte

Enquanto ele treina esse vou dar uma olhada no named pipes para ver se acelero algo.

Vi que adicionaram suporte a python no MT5 (e do tensorflow) só ainda não sei como utlizar.

Abraços.


Você pode criar um script MQL, basta escolher a opção de python caso use o assistente de criação e ou criar um arquivo com a extensão .py diretamente na pasta de scripts da sua instalação MQL.
rodei alguns códigos, e não notei nenhum delay com relação ao ambiente que tenho montado em minha maquina, ate mesmo pq o MetaTrader so serve como uma IDE, mesmo pq o script roda na sua instalação. Porem é possível rodar dentro do terminal o que de certa forma deixa o processo menos burocrático, é possível criar um serviço que fica rodando dentro do terminal e assim elimina a possibilidade de ter que ter um gráfico aberto ;) ... acredito que ai que entra o pulo do GATO, rsrsrrsrsrrsrs.....


Att,
Jonathan

 
ipsec:


Enquanto ele treina esse vou dar uma olhada no named pipes para ver se acelero algo.

Vi que adicionaram suporte a python no MT5 (e do tensorflow) só ainda não sei como utlizar.

Abraços.

Oi ipsec,

Vou te deixar dois links que me ajudaram a chegar na minha implementação atual, usando named pipes sem nenhuma DLL:

https://www.mql5.com/en/articles/503

https://stackoverflow.com/questions/48542644/python-and-windows-named-pipes

O primeiro constrói um exemplo de um cliente MQL5 falando via named pipes com um servidor em C++.

O segundo mostra um exemplo com cliente e servidor ambos em Python.

Bastam algumas pequenas "costuras" pra vc fazer o cliente MQL5 do primeiro exemplo falar com o servidor Python do segundo exemplo.

Obs: até onde estudei, parece que não há jeito de fazer o MQL5 ser o lado "servidor" do named pipe (sem DLL). O lado MQL5 tem que ser o ciente e o lado Python tem que ser o servidor.

Quanto ao Tensorflow, basta fazer como o @Jonathan_Pereira falou acima: salva o teu script python que usa o TensorFlow lá na pasta de scripts, pra que ele apareça no menu do terminal e depois executa ele num gráfico, do mesmo jeito que vc faz com um script MQL5.

Abraços

Communicating With MetaTrader 5 Using Named Pipes Without Using DLLs
Communicating With MetaTrader 5 Using Named Pipes Without Using DLLs
  • www.mql5.com
Many developers face the same problem - how to get to the trading terminal sandbox without using unsafe DLLs. One of the easiest and safest method is to use standard Named Pipes that work as normal file operations. They allow you to organize interprocessor client-server communication between programs. Although there is an already published...
 
Jonathan Pereira:


Você pode criar um script MQL, basta escolher a opção de python caso use o assistente de criação e ou criar um arquivo com a extensão .py diretamente na pasta de scripts da sua instalação MQL.
rodei alguns códigos, e não notei nenhum delay com relação ao ambiente que tenho montado em minha maquina, ate mesmo pq o MetaTrader so serve como uma IDE, mesmo pq o script roda na sua instalação. Porem é possível rodar dentro do terminal o que de certa forma deixa o processo menos burocrático, é possível criar um serviço que fica rodando dentro do terminal e assim elimina a possibilidade de ter que ter um gráfico aberto ;) ... acredito que ai que entra o pulo do GATO, rsrsrrsrsrrsrs.....


Att,
Jonathan

Jonathan, 

Tem como rodar um script (seja mql5 ou python) sem estar vinculado a nenhum gráfico?

Isso seria ótimo, pois eliminaria processamento desnecessário. Como faz isso?

Outra dúvida:

Quando rodamos scripts em gráficos diferentes, cada um roda numa thread distinta, o que permite que rodem em paralelo numa CPU multicore.

No caso de scripts desvinculados de gráfico, dá pra rodar vários scripts simultaneamente de modo que cada um rode numa thread distinta?

Abraços

 
Jonathan Pereira:


Você pode criar um script MQL, basta escolher a opção de python caso use o assistente de criação e ou criar um arquivo com a extensão .py diretamente na pasta de scripts da sua instalação MQL.
rodei alguns códigos, e não notei nenhum delay com relação ao ambiente que tenho montado em minha maquina, ate mesmo pq o MetaTrader so serve como uma IDE, mesmo pq o script roda na sua instalação. Porem é possível rodar dentro do terminal o que de certa forma deixa o processo menos burocrático, é possível criar um serviço que fica rodando dentro do terminal e assim elimina a possibilidade de ter que ter um gráfico aberto ;) ... acredito que ai que entra o pulo do GATO, rsrsrrsrsrrsrs.....


Att,
Jonathan

Olá Jonathan,


Mas como você chama as funções de dentro de um EA ou de um Service?


Por exemplo:

Meu script pyprint.py contem:


def pyname(name):

  return "Python print " + name


Eu gostaria de chamar de dentro do meu EA assim (dentro do OnInit por exemplo):


string name = "ipsec";

pyname(name);


E ele me retornar o "Python print ipsec".


Se fosse dentro de um service seria melhor ainda.


Obrigado.

 
Trader_Patinhas:

Jonathan, 

Tem como rodar um script (seja mql5 ou python) sem estar vinculado a nenhum gráfico?

Isso seria ótimo, pois eliminaria processamento desnecessário. Como faz isso?

Outra dúvida:

Quando rodamos scripts em gráficos diferentes, cada um roda numa thread distinta, o que permite que rodem em paralelo numa CPU multicore.

No caso de scripts desvinculados de gráfico, dá pra rodar vários scripts simultaneamente de modo que cada um rode numa thread distinta?

Abraços


Boa noite,

Tem sim, basta criar um serviço e ou se tiver um script basta arrasta-lo para a pasta de serviço e compilar lá dentro.


Após compilado ele aparece no terminal e la é posivel colocar pra rodar sem a necessidade de estar anexado a um gráfico.

//+------------------------------------------------------------------+
//| Service program start function                                   |
//+------------------------------------------------------------------+
void OnStart()
 {
  while(!IsStopped())
   {
    Print("serviço rodando");
    Sleep(10000);
   }

 }
//+------------------------------------------------------------------+



Razão: