Discussão do artigo "WebSocket para MetaTrader 5: conexões assíncronas no lado do cliente usando a API do Windows"

 

Novo artigo WebSocket para MetaTrader 5: conexões assíncronas no lado do cliente usando a API do Windows foi publicado:

Neste artigo, descreve-se em detalhe o desenvolvimento de uma biblioteca DLL personalizada, destinada a simplificar conexões assíncronas no lado do cliente pelo protocolo WebSocket para programas MetaTrader.

No artigo "WebSocket para MetaTrader 5: uso da API do Windows", foi mostrado o uso da API do Windows para implementar um cliente WebSocket em aplicações MetaTrader 5. A implementação apresentada ali se limitava ao modo síncrono.

Neste artigo, voltaremos a examinar o uso da API do Windows para criar um cliente WebSocket para programas MetaTrader 5, com o objetivo de viabilizar funcionalidade assíncrona no lado do cliente. Na prática, isso exige a criação de uma DLL personalizada, que exporta funções adequadas para integração com aplicações MetaTrader 5.

Assim, este artigo aborda o desenvolvimento da DLL e, em seguida, será apresentada uma demonstração de seu uso em um programa MetaTrader 5.

WebSocket para MetaTrader 5: conexões assíncronas no lado do cliente com a API do Windows


Autor: Francis Dube

 
Este é um excelente artigo. Você me incentivou a compartilhar minha biblioteca do IOCP, quando tiver tempo. Ótimo trabalho, obrigado por compartilhar.
 

Olá, também considero esse artigo excelente.

Estou desenvolvendo um EA que utiliza vários indicadores. Inicialmente, optei por funcionalizar os cálculos do indicador para que pudessem ser usados em um gráfico de indicador, bem como no EA. Ao testar no testador de estratégia, descobri que a função Barras retorna um valor diferente entre o indicador em execução no modo visual e o valor determinado pelo EA. Você sabe como informar esse e outros bugs que encontrei no MLQ5 aos desenvolvedores?

A solução simples era usar o iCustom, que eu usava anteriormente no MQL4. No entanto, a versão do MQL5 só permite o CopyBuffer no primeiro gráfico do indicador e muitos dos meus indicadores têm vários buffers plotados.

As soluções que consigo imaginar são usar os WebSockets para a comunicação entre vários indicadores e o EA, pipes nomeados para fazer o mesmo ou separar os indicadores em gráficos de buffer único, o que envolverá um aumento significativo no processamento devido à multiplicidade de cálculos idênticos, além de ser um pesadelo tentar manter uma dúzia ou mais de indicadores sincronizados para garantir cálculos precisos.

Como o WebSockets é assíncrono, quais são as implicações do fato de o ea receber dezenas de fluxos de dados dos indicadores quase simultaneamente? Ele consegue acompanhar ou haveria transbordamentos?

Qualquer sugestão será muito apreciada.

Obrigado por sua resposta


CapeCoddah

 
CapeCoddah testador de estratégia, descobri que a função Barras retorna um valor diferente entre o indicador em execução no modo visual e o valor determinado pelo EA. Você sabe como informar esse e outros bugs que encontrei no MLQ5 aos desenvolvedores?

A solução simples era usar o iCustom, que eu usava anteriormente no MQL4. No entanto, a versão do MQL5 só permite o CopyBuffer no primeiro gráfico do indicador e muitos dos meus indicadores têm vários buffers plotados.

As soluções que consigo imaginar são usar os WebSockets para a comunicação entre vários indicadores e o EA, pipes nomeados para fazer o mesmo ou separar os indicadores em gráficos de buffer único, o que envolverá um aumento significativo no processamento devido à multiplicidade de cálculos idênticos, além de ser um pesadelo tentar manter uma dúzia ou mais de indicadores sincronizados para garantir cálculos precisos.

Como o WebSockets é assíncrono, quais são as implicações de o ea receber dezenas de fluxos de dados dos indicadores quase simultaneamente? Ele pode acompanhar ou haveria transbordamentos?

Qualquer sugestão será muito apreciada.

Obrigado por sua resposta


CapeCoddah

Olá, você diz:

A solução simples era usar o iCustom, que eu usava anteriormente na MQL4. No entanto, a versão MQL5 só permite CopyBuffer no primeiro gráfico do indicador e muitos dos meus indicadores têm vários buffers plotados.

Isso não é correto. Você pode copiar qualquer buffer que desejar. Todas as três sobrecargas da função CopyBuffer permitem que você copie qualquer buffer que especificar. Usando a primeira versão (mostrada abaixo) como exemplo:

int  CopyBuffer(
   int       indicator_handle,     // alça do indicador
   int       buffer_num,           // número do buffer do indicador
   int       start_pos,            // posição inicial
   int       count,                // quantidade a ser copiada
   double    buffer[]              // matriz de destino para copiar
   );

O segundo parâmetro 'buffer_num' permite que você especifique qual buffer copiar - começando no índice 0 como primeiro buffer, 1 para o segundo buffer etc., permitindo que você copie qualquer buffer que desejar do seu indicador personalizado. Um exemplo disso é o iMACD incorporado, que tem 2 buffers (
0 - MAIN_LINE, 1 - SIGNAL_LINE). Sugiro que você se concentre no indicador iCustom para resolver seu problema antes de tentar WebSockets ou Sockets de qualquer tipo. É uma solução muito mais simples, que não requer bibliotecas externas, como DLLs C++ etc. Sempre tente usar a linguagem MQL5 o máximo possível e evite DLLs, a menos que seja absolutamente necessário. Eu desenvolvo em C, C++, C# e outros, e posso dizer, por experiência própria, que a melhor abordagem é usar a MQL5 (uma linguagem extremamente poderosa, apesar de suas limitações, como qualquer outra linguagem).

Informe-me sobre seu progresso. Se você tiver algum problema com o 'CopyBuffer', fique à vontade para perguntar. Se estiver se aventurando na MQL5 a partir da MQL4, algumas coisas são feitas de forma diferente, portanto, seu conhecimento da MQL4 pode não ser diretamente transferível. Mas continue, a MQL5 é muito melhor, significativamente mais poderosa e mais rápida.

Boa sorte.

 

Pode ser útil ver um exemplo de código em:

Base de código

Brooky Trend Strength para MT5

Ryan L Johnson, 2025.04.29 19:52

Esse indicador chama 3 outros indicadores de subjanela. Todos os arquivos estão na pasta Indicators.
A mesma premissa básica se aplica a um EA.
 
Ryan L Johnson #:

Pode ser útil ver alguns exemplos de código em:

A mesma premissa básica se aplica a um EA.

Essa é uma excelente ideia.

 

Agradeço a ambos pela resposta à minha pergunta. Devo ter perdido as definições de funções sobrecarregadas e só li sobre a primeira. Vocês sabem se o Terminal é inteligente o suficiente para processar em paralelo as chamadas iCustom para maximizar a utilização do processador, já que pretendo variar o parâmetro do símbolo para cada um dos 28 pares e pretendo ter várias chamadas iCustom, como a Brooky Trend Strength.

Algum de vocês pode me dizer onde posso postar comentários sobre bugs no MQ5 e também onde posso fazer sugestões para os administradores do Mq. Encontrei alguns, mais recentemente a diferença de barras entre o terminal e o testador de estratégia. Além disso, tenho uma configuração de 3 telas com a tela principal na extrema esquerda. Estou tentando mover um painel, como o Navigator ou o Market. O ponteiro de arrastar do mouse está no lado esquerdo da tela, mas o painel de arrastar está no meio. Acho que o Terminal ou o Windows está enlouquecendo quando o mouse move um pixel e, em seguida, alterna as telas para mover o painel um pixel e vice-versa

 
CapeCoddah testador de estratégia.

A função Bars() apresenta problemas quando há dados de preço ausentes, enquanto a função rates_total não apresenta. Se me lembro bem do que li no passado, o Bars() pode ser corrigido fazendo referência a registros de data e hora. Talvez valha a pena fazer uma pesquisa.

CapeCoddah #:
Tenho uma configuração de 3 telas com a tela principal na extrema esquerda. Tentar mover um painel, como os painéis Navigator ou Market, da esquerda para a direita é muito tedioso. O ponteiro do mouse de arrastar está na tela mais à esquerda, mas o painel de arrastar está no meio. Acho que o Terminal ou o Windows está enlouquecendo quando o mouse move um pixel e, em seguida, alterna as telas para mover o painel um pixel e vice-versa

Eu realmente não sei o que fazer com isso. Tenho três computadores, cada um com seu próprio monitor e terminal. Sei que o Windows geralmente tem configurações de exibição de vários monitores, incluindo picture-in-picture, talvez como uma solução alternativa.

Alguém que tenha vários monitores reais em uma única máquina pode entrar em contato comigo, por favor?

 

Ótimas informações!!!

Meu problema é que os dois são idênticos no Terminal, mas no STrategy Tester Visualize, Bars é um maior, o que me levou a fazer bobagem por não ter lido a documentação até o fim. Vou pegar sua opinião e usá-la no iCustom. Presumo que deve haver um endereço iCustom separado para cada combinação de especificações de símbolo e tempo.

Além disso, existe alguma maneira de um EA exibir texto na tela do Strategy Tester? No Mq4, ele fazia isso automaticamente, mas agora não. Eu uso muitos objetos de classe para exibir informações e colocar uma segunda cópia no modelo torna o Strategy Tester ainda mais lento.

Na tela de 3 painéis, acho que o problema é que o terminal não atualiza corretamente o local do monitor quando o mouse se move da tela 2 para a tela 1.

Tenho dois minicomputadores que suportam três monitores cada um, portanto, tenho as três telas conectadas aos dois minicomputadores e uso HDMI1 para um computador e HDMI2 para o outro. Funciona muito bem com TVs Fire de 43 polegadas, embora seja necessário verificar se os controles remotos estão configurados corretamente para controlar apenas um monitor (ligue para o suporte da Amazon). A única desvantagem é que o botão liga/desliga desliga todos os monitores e, às vezes, preciso puxar o plugue para sincronizar a energia.


CapeCoddah

 
CapeCoddah STrategy Tester Visualize, as Barras são um pouco maiores, o que me levou a cometer um erro por não ter lido a documentação até o fim. Vou pegar sua opinião e usá-la no iCustom. Presumo que deve haver um endereço iCustom separado para cada combinação de especificações de Símbolo e Tempo.

  1. Um único arquivo de indicador em um único diretório pode ser reutilizado por várias instâncias de iCustom().
  2. Um único identificador de indicador pode ser reutilizado por várias instâncias de CopyBuffer().
  3. Agora entendo por que você está usando Bars(), já que rates_total sozinho é limitado a um único período de tempo. Presumivelmente, você está usando Bars() em um loop separado para cada período de tempo.

CapeCoddah #:
Além disso, existe alguma maneira de um EA exibir o texto na tela no Strategy Tester? No Mq4, ele fazia isso automaticamente, mas agora não. Eu uso muitos objetos de classe para exibir informações e colocar uma segunda cópia no modelo torna o Strategy Tester ainda mais lento.
Não que eu saiba. Você já está usando o único método que eu conheço da página de ajuda do MT5 Testing Visualization.
CapeCoddah #:
No monitor de 3 painéis, acho que o problema é que o terminal não atualiza corretamente o local do monitor quando o mouse se move da tela 2 para a tela 1.
Infelizmente, não tenho como testar isso com minha própria configuração. Você está esticando uma única tela do terminal MT5 em todos os monitores? Já vi outras pessoas resolverem problemas dessa forma.