Discussão do artigo "WebSocket para o MetaTrader 5: Usando a API do Windows"

 

Novo artigo WebSocket para o MetaTrader 5: Usando a API do Windows foi publicado:

Neste artigo vamos usar WinHttp.dll com o intuito de criar um cliente WebSocket para os programas MetaTrader 5. Em última instância, o cliente deve ser implementado como uma classe e testado em interação com o WebSocket API da Binary.com.

Abaixo, mostramos a criação de um novo símbolo personalizado após o lançamento do EA.

EA demo

Autor: Francis Dube

 
Isto é tão legal, especialmente parece suportar também um websocket seguro.
Funciona para o MT4 também?

Ótimo artigo, obrigado.
 
Esta biblioteca tem função para o envio de ping e pong?
 

A biblioteca (winhttp.dll) não expõe nenhuma função para pings ou pongs. Embora a documentação se refira a uma opção de configuração que rege como a conexão é mantida viva. Acredito que a biblioteca envia os pings automaticamente quando uma conexão está ociosa.

 
#include<websocket.mqh>
#include<JAson.mqh>
#define  BINANCE_URL "fstream.binance.com:443/ws"


CWebsocket       websocket;    //websocket client
CJAVal           m_jv;         //utility json object


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
//--- create timer
   EventSetTimer(1);

//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//--- destroy timer
   EventKillTimer();

}

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer() {

   if(!websocket.Connect(BINANCE_URL)) {
      Print(websocket.LastErrorMessage()," : ",websocket.LastError());
      return;
   } else {
      Print("Connected");
   }

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

Estou apenas tentando verificar se ele se conecta, mas está dando erro na conexão

Erro: Win32 Erro API 6 : 6

Alguma idéia do porquê de seu lançamento do erro?

Obrigado

 
Dark Ryd3r verificar se ele se conecta, mas está dando erro na conexão

Erro: Win32 Erro API 6 : 6

Alguma idéia do porquê de seu lançamento do erro?

Obrigado

Estou tendo o mesmo problema no mql5 quando usado para conectar a um host local 127.0.0.0.1 . Entretanto, quando tentei usá-lo no mql4, funcionou normalmente !!!!.

Também há um problema no uso do WinHttpSocketReceive() no evento OnTimer . ele simplesmente causa o congelamento do terminal .

Eu construí meu próprio servidor WS usando o nodeJS Express e a biblioteca WS, e consegui enviar para o servidor e receber do servidor quando adicionei a função Receive no gerenciador de eventos onClick , isto é por causa do fato de que winhttp.sll::WinHttpSocketReceive() funciona de forma assíncrona

o que significa que ele não retorna até receber alguns dados do servidor . Portanto, usá-lo diretamente no onTimer() sem ter o servidor para enviar dados bloqueará a linha para sempre e fará com que o terminal congele.






Então o WinHttpSocketReceive() funciona bem quando há um dado do servidor . Mas por outro lado, quando a mesma função é usada dentro do OnTimer(), o gerenciador de eventos congela o terminal. Alguém tem uma pista de como evitar isso?

 
É um método/função de "bloqueio", nada a ser corrigido aqui.
 
Soewono Effendi #:
É um método/função de "bloqueio", nada a ser corrigido aqui.

Sim, eu sei que é uma função síncrona que bloqueia o fio, no entanto fui capaz de gerenciá-lo de forma assíncrona adicionando o WINHTTP_FLAG_ASYNC à função WinnHttpOpen() e ele não bloqueia o resto do código, no entanto enfrentei outro problema que surgiu ao adicionar WINHTTP_FLAG_ASYNC que é de acordo com a msdn , temos que usar o WinHttpSetStatusCallBack() o que leva o ponteiro a uma função de Call back que recebe os resultados .

Eu usei typedef para definir o ponteiro para a função desta maneira

typedef void(*WINHTTP_STATUS_CALLBACK)(HINTERNET,DWORD&,DWORD,BYTE &[],DWORD);

então eu importei o WinHttpSetStatusCallBack() da winhttp.dll de acordo com a msdn

https://docs.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp-winhttpsetstatuscallback

#import

  WINHTTP_STATUS_CALLBACK WinHttpSetStatusCallback(HINTERNET hInternet,WINHTTP_STATUS_CALLBACK lpfnInternetCallback,DWORD dwNotificationFlags,DWORD &dwReserved);

#import

aqui vem o maior problema que parece insolúvel devido ao mql . quando compenso recebo uma mensagem de erro de que as indicações não são permitidas na declaração de importação .!!!!!! então não há como passar a chamada de volta para esta função, bem como retornar o ponteiro para essa função . qualquer idéia ???

WinHttpSetStatusCallback function (winhttp.h) - Win32 apps
WinHttpSetStatusCallback function (winhttp.h) - Win32 apps
  • 2021.10.13
  • stevewhims
  • docs.microsoft.com
The WinHttpSetStatusCallback function sets up a callback function that WinHTTP can call as progress is made during an operation.
 
Kareem Abdelhakim #:

Eu usei typedef para definir o ponteiro para a função desta maneira

então eu importei o WinHttpSetStatusCallBack() da winhttp.dll de acordo com a msdn

Sim, boa tentativa :)
Eu também esperava que isso fosse possível, mas se você pesquisar no fórum, verá que a função no MQL é um cabo, não um endereço de memória, o que é exigido pelo "C/C++" calllback-API.

Talvez um dia a MQL acrescentaria o "real" Ponteiro de Função.

 
Soewono Effendi #:

Sim, boa tentativa :)
Eu também esperava que isso fosse possível, mas se você pesquisar no fórum, verá que a função no MQL é um cabo, não um endereço de memória, o que é exigido pelo "C/C++" calllback-API.

Talvez um dia a MQL acrescentaria o "real" Ponteiro de Função.

Sim, espero que em breve isto seja suportado nativamente.

 

@Francis Dube É possível criar um serviço MQL5 que atua como servidor WebSocket? Você tem alguns exemplos?