Executar script python como serviço

 

Já tive sucesso rodando script python anexado a gráfico e também já tive sucesso rodando script mql5 como serviço do terminal (sem vínculo com nenhum gráfico).

Porém, não encontrei nenhuma forma de rodar um script python como serviço. Tenho sempre que abrir um gráfico qualquer, sem nenhuma utilidade, só pra poder rodar python.

Eu queria poder executar um script python como serviço, sem precisar vinculá-lo a nenhum gráfico. Alguém já conseguiu? Isso é possível?

 
Trader_Patinhas:

Já tive sucesso rodando script python anexado a gráfico e também já tive sucesso rodando script mql5 como serviço do terminal (sem vínculo com nenhum gráfico).

Porém, não encontrei nenhuma forma de rodar um script python como serviço. Tenho sempre que abrir um gráfico qualquer, sem nenhuma utilidade, só pra poder rodar python.

Eu queria poder executar um script python como serviço, sem precisar vinculá-lo a nenhum gráfico. Alguém já conseguiu? Isso é possível?

@Trader_Patinhas, já fiz algumas tentativas e não há essa possibilidade, o que poderia ser feito para um uso continuo do script python seria um while true (sim eu sei que isso é porco), pegando os ativos que estão na janela de observação, como no pyhton não tem os handlers de eventos do MQL(OnTick, On bla bla), rsrsrsrs, da pra criar um timer na mão para ficar checando os ativos.
Enfim é uma alternativa a qual eu estava pensando para poder usar "como serviço", porem é necessário estar com uma janela aberta.

 
Jonathan Pereira:

@Trader_Patinhas, já fiz algumas tentativas e não há essa possibilidade, o que poderia ser feito para um uso continuo do script python seria um while true (sim eu sei que isso é porco), pegando os ativos que estão na janela de observação, como no pyhton não tem os handlers de eventos do MQL(OnTick, On bla bla), rsrsrsrs, da pra criar um timer na mão para ficar checando os ativos.
Enfim é uma alternativa a qual eu estava pensando para poder usar "como serviço", porem é necessário estar com uma janela aberta.

Para negociar ativos e ler informações do mercado eu uso um EA escrito em mql5 mesmo. Só o modelo preditivo que é implementado em Python.

Meu script python implementa um listener, usando named pipe, que recebe informações do EA, calcula o resultado do modelo preditivo e retorna as respostas.

Eu já usava esse mesmo esquema anteriormente, mas com o script python rodando fora do MT5 (na mesma máquina).

Recentemente saiu uma versão do MT5 que permite rodar scripts python, então botei em produção uma nova versão do robô em que o script python roda dentro do MT5, atrelado a uma janela gráfica extra que fica aberta exclusivamente para ele.

O que eu queria era me livrar de ter que ficar com essa segunda janela aberta só para hospedar o script python.

 

Alguém poderia me dizer se há uma forma de pegar um sinal de compra/venda de um indicador no mt5 e pegar no codigo via python? a comunicação está ok porem  não consigo pegar esse sinal de ordem via python.

 
rgullit7:

Alguém poderia me dizer se há uma forma de pegar um sinal de compra/venda de um indicador no mt5 e pegar no codigo via python? a comunicação está ok porem  não consigo pegar esse sinal de ordem via python.

Nunca tentei fazer isso. Acho que não tem como pegar o sinal do indicador direto no python não.

Mas, se vc tiver o código-fonte do indicador, vc pode, dentro do evento OnCalculate, transmitir informações do indicador para o seu script python por fora do Metatrader usando serviços do sistema operacional, como sockets ou named pipes (existe suporte para ambos tanto no mql5 quanto no python).

Se não tiver o código-fonte do indicador, vc pode fazer um EA que lê o sinal do indicador e transmite por uma dessas duas vias para o seu script python (haja gambiarra! vai ficar horroroso, mas vai funcionar direitinho).

Eu imagino que no futuro próximo os desenvolvedores do MT5 deverão adicionar mais funcionalidades no suporte a python, como ler indicadores e fazer negociação, mas, se vc precisa disso agora, acho que não vale a pena esperar, pois esse futuro próximo pode estar mais distante do que eu imagino.

 
Trader_Patinhas:

Nunca tentei fazer isso. Acho que não tem como pegar o sinal do indicador direto no python não.

Mas, se vc tiver o código-fonte do indicador, vc pode, dentro do evento OnCalculate, transmitir informações do indicador para o seu script python por fora do Metatrader usando serviços do sistema operacional, como sockets ou named pipes (existe suporte para ambos tanto no mql5 quanto no python).

Se não tiver o código-fonte do indicador, vc pode fazer um EA que lê o sinal do indicador e transmite por uma dessas duas vias para o seu script python (haja gambiarra! vai ficar horroroso, mas vai funcionar direitinho).

Eu imagino que no futuro próximo os desenvolvedores do MT5 deverão adicionar mais funcionalidades no suporte a python, como ler indicadores e fazer negociação, mas, se vc precisa disso agora, acho que não vale a pena esperar, pois esse futuro próximo pode estar mais distante do que eu imagino.

Negociação já é possível 
 
Jonathan Pereira:
Negociação já é possível 

Caramba, é mesmo! Fui lá ver agora. Eu estava desatualizado!

Pelo que vejo, parece que, pra viabilizar uma substituição total do mql5 por python num EA, além de ler indicadores, só está faltando tratar os eventos e ler o book. Ou já faz isso também e eu não vi?

 
Trader_Patinhas:

Caramba, é mesmo! Fui lá ver agora. Eu estava desatualizado!

Pelo que vejo, parece que, pra viabilizar uma substituição total do mql5 por python num EA, além de ler indicadores, só está faltando tratar os eventos e ler o book. Ou já faz isso também e eu não vi?

Não trata eventos e nem tem funções de indicadores, mas vou falar uma coisa que notei, recentemente fiz alguns algoritmos gananciosos em Python e resolvi reescrever em MQL5, é incrível a diferença de velocidade de execução no MQL5. Mas sem querer puxar sardinha para um ou outro, quando a execução fica 100% no lado do Python ele se comporta como se fosse um “serviço” já que a plataforma fica aberta sem gráfico. 
Eu estou implantando um programa em Python que gerencia abertura fechamento de ordens, para testar um modelo preditivo que venho elaborando, havia feito via sockets mas dá muito trabalho manter esses códigos todos espalhados, como essa estratégia não é um HFT vejo que não há problemas deixar tudo por conta do Python, mas vejo que se precisar de velocidade precisa estar no MQL5, pois não há discussão de como uma linguagem compilada é muito mais veloz do que uma interpretada.
Apenas esboçando a ideia: é deixar um loop infinito que fica gerando as predições e vendo a acurácia dos resultados, caso necessário ele já refaz o processo de treinamento.
 
Jonathan Pereira:
Não trata eventos e nem tem funções de indicadores, mas vou falar uma coisa que notei, recentemente fiz alguns algoritmos gananciosos em Python e resolvi reescrever em MQL5, é incrível a diferença de velocidade de execução no MQL5. Mas sem querer puxar sardinha para um ou outro, quando a execução fica 100% no lado do Python ele se comporta como se fosse um “serviço” já que a plataforma fica aberta sem gráfico. 
Eu estou implantando um programa em Python que gerencia abertura fechamento de ordens, para testar um modelo preditivo que venho elaborando, havia feito via sockets mas dá muito trabalho manter esses códigos todos espalhados, como essa estratégia não é um HFT vejo que não há problemas deixar tudo por conta do Python, mas vejo que se precisar de velocidade precisa estar no MQL5, pois não há discussão de como uma linguagem compilada é muito mais veloz do que uma interpretada.
Apenas esboçando a ideia: é deixar um loop infinito que fica gerando as predições e vendo a acurácia dos resultados, caso necessário ele já refaz o processo de treinamento.

>> recentemente fiz alguns algoritmos gananciosos em Python e resolvi reescrever em MQL5, é incrível a diferença de velocidade de execução no MQL5

Claro, pois Python é interpretada. Se você for escrever algoritmos com loops alinhados, etc., vc tá lascado! Em MQL5 vai ficar centenas de vezes mais rápido.

Pra usar Python com eficiência, o miolo mais pesado (os loops mais internos) do seu algoritmo têm que estar dentro de bibliotecas compiladas e otimizadas como numpy, pandas, scikit-learn, tensorflow, pytorch, etc.

A linguagem é pra ser usada como um "script", que sequencia e itera algoritmos mais pesados implementados de forma eficiente dentro de bibliotecas externas. Se 99% do processamento ficar dentro do numpy, pandas, etc., Python fica quase tão rápido quanto C++ (e bem mais simples de programar e manter).

>> quando a execução fica 100% no lado do Python ele se comporta como se fosse um “serviço” já que a plataforma fica aberta sem gráfico

Opa, não entendi. Vc roda python com a plataforma aberta sem gráfico? Eu adoraria fazer isso! Como vc faz isso, se não dá pra implementar serviço em python?

>> Apenas esboçando a ideia: é deixar um loop infinito que fica gerando as predições e vendo a acurácia dos resultados, caso necessário ele já refaz o processo de treinamento.

Também tenho pensado nisso. Mas atualmente uso os volumes do book entre minhas variáveis preditivas e aparentemente não consigo lê-las direto no python (e retirá-las do modelo reduz a acurácia).

 
Trader_Patinhas:

>> recentemente fiz alguns algoritmos gananciosos em Python e resolvi reescrever em MQL5, é incrível a diferença de velocidade de execução no MQL5

Claro, pois Python é interpretada. Se você for escrever algoritmos com loops alinhados, etc., vc tá lascado! Em MQL5 vai ficar centenas de vezes mais rápido.

Pra usar Python com eficiência, o miolo mais pesado (os loops mais internos) do seu algoritmo têm que estar dentro de bibliotecas compiladas e otimizadas como numpy, pandas, scikit-learn, tensorflow, pytorch, etc.

A linguagem é pra ser usada como um "script", que sequencia e itera algoritmos mais pesados implementados de forma eficiente dentro de bibliotecas externas. Se 99% do processamento ficar dentro do numpy, pandas, etc., Python fica quase tão rápido quanto C++ (e bem mais simples de programar e manter).

>> quando a execução fica 100% no lado do Python ele se comporta como se fosse um “serviço” já que a plataforma fica aberta sem gráfico

Opa, não entendi. Vc roda python com a plataforma aberta sem gráfico? Eu adoraria fazer isso! Como vc faz isso, se não dá pra implementar serviço em python?

>> Apenas esboçando a ideia: é deixar um loop infinito que fica gerando as predições e vendo a acurácia dos resultados, caso necessário ele já refaz o processo de treinamento.

Também tenho pensado nisso. Mas atualmente uso os volumes do book entre minhas variáveis preditivas e aparentemente não consigo lê-las direto no python (e retirá-las do modelo reduz a acurácia).

"Claro, pois Python é interpretada. Se você for escrever algoritmos com loops alinhados, etc., vc tá lascado! Em MQL5 vai ficar centenas de vezes mais rápido."

Sim, é indiscutível a velocidade de uma linguagem compilada versus uma interpretada, além do mais MQL5 é quase um C++, eu não posso falar muito pois tenho uma admiração enorme por toda a família C, rsrsrsrsrs...Então quando eu rodo o Python para coletar dados e ou abrir/fechar uma ordem ele abre o terminal cliente MetaTrader pois é necessário fazer um mt5.initialize().

Abaixo um pequeno trecho de código que uso para coletar dados para usar no modelo preditivo, mas isso se aplica a qualquer outra funcionalidade da biblioteca Python.

    import MetaTrader5 as mt5

    if not mt5.initialize():
        print("initialize() failed")
        mt5.shutdown()

    rates = mt5.copy_rates_from_pos("WINM20", mt5.TIMEFRAME_M3, 0, 100)
    mt5.shutdown()
    series = pd.DataFrame(rates)
    series['time'] = pd.to_datetime(series['time'], unit='s')
    series = series.set_index(['time'])
    series = series['open'].to_numpy()

Como te falei a minha ideia é deixar a conexão aberta e ficar extraindo dados em um loop eterno, fiz um testes esses dias e funcionou perfeitamente. Seria maravilhoso se houvesse a possibilidade de receber os eventos no lado do Python. Mas enfim da maneira que esta já da pra fazer muita coisa interessante.
Não sei ao certo como vc coleta os dados de volume no book, mas...mas.., rsrsrs, acredito eu que seja com um CopyTicks e ou CopyTicksRange, se for, na biblioteca MetaTrader5 tem métodos que fazem isso (copy_ticks_from e copy_ticks_range).

 
Jonathan Pereira:

"Claro, pois Python é interpretada. Se você for escrever algoritmos com loops alinhados, etc., vc tá lascado! Em MQL5 vai ficar centenas de vezes mais rápido."

Sim, é indiscutível a velocidade de uma linguagem compilada versus uma interpretada, além do mais MQL5 é quase um C++, eu não posso falar muito pois tenho uma admiração enorme por toda a família C, rsrsrsrsrs...Então quando eu rodo o Python para coletar dados e ou abrir/fechar uma ordem ele abre o terminal cliente MetaTrader pois é necessário fazer um mt5.initialize().

Abaixo um pequeno trecho de código que uso para coletar dados para usar no modelo preditivo, mas isso se aplica a qualquer outra funcionalidade da biblioteca Python.

Como te falei a minha ideia é deixar a conexão aberta e ficar extraindo dados em um loop eterno, fiz um testes esses dias e funcionou perfeitamente. Seria maravilhoso se houvesse a possibilidade de receber os eventos no lado do Python. Mas enfim da maneira que esta já da pra fazer muita coisa interessante.
Não sei ao certo como vc coleta os dados de volume no book, mas...mas.., rsrsrs, acredito eu que seja com um CopyTicks e ou CopyTicksRange, se for, na biblioteca MetaTrader5 tem métodos que fazem isso (copy_ticks_from e copy_ticks_range).

Os dados do book são acessados pela função MarketBookGet(). Aparentemente não há nada parecido na integração com Python.

Mas ainda não entendi como vc consegue rodar o python desvinculado da janela gráfica. Como vc faz isso?

Vc roda fora do Metatrader? Só se for isso!

Razão: