文章 "MetaTrader 5 的 WebSocket — 使用 Windows API"

 

新文章 MetaTrader 5 的 WebSocket — 使用 Windows API已发布:

在本文中,我们将使用 WinHttp.dll 针对 MetaTrader 5 平台创建 WebSocket 客户端程序。 客户端最终将作为一个类实现,并借助 Binary.com 的 WebSocket API 进行测试。

运行 EA 会创建一个新的自定义品种,如下所示。

EA 演示

结束语

作者:Francis Dube

 
它也适用于 MT4 吗?

很棒的文章,谢谢。
 
这个websocket 库有发送 ping 和 pong 的功能吗?
 

该库(winhttp.dll)没有公开任何 ping 或 pongs 函数。尽管文档中提到了一个配置选项,该选项 用于控制连接的存活方式。我相信该库会在连接空闲时自动发送 ping。

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


CWebsocket       websocket;    //websocket 客户端
CJAVal           m_jv;         // 实用 json 对象


//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
int OnInit() {
//--- 创建计时器
   EventSetTimer(1);

//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 专家去初始化函数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//--- 销毁计时器
   EventKillTimer();

}

//+------------------------------------------------------------------+
//| 定时器功能|
//+------------------------------------------------------------------+
void OnTimer() {

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

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

我只是想检查 它是否能连接,但它在连接时出错了

错误:Win32 API 错误 6 : 6

知道为什么会出现这个错误吗?

谢谢

 
Dark Ryd3r 检查 它是否能连接,但它在连接时出错了

错误:Win32 API 错误 6 : 6

知道为什么会出错吗?

谢谢

我在 mql5 上使用它连接本地主机 127.0.0.1 时也遇到了同样的问题。不过,当我尝试在 mql4 上使用它时,它却能正常工作 !!!!。

此外,在 OnTimer 事件中使用 WinHttpSocketReceive() 也有问题,它会导致终端冻结。

我使用 nodeJS Express 和 WS 库构建了自己的 WS 服务器,当我在 onClick 事件处理程序中添加 Receive 函数时,我成功地向服务器发送了信息并从服务器接收了信息,这是因为 winhttp.sll::WinHttpSocketReceive() 是异步工作的。

这意味着它在从服务器接收到一些数据后才会返回。因此,在没有服务器发送数据的情况下,直接在 onTimer() 中使用它将永远阻塞线程并导致终端冻结。






因此,当有来自服务器的数据时,WinHttpSocketReceive() 可以很好地工作。但另一方面,如果在 OnTimer() 事件处理程序中使用相同的函数,终端就会冻结。有人知道如何避免这种情况吗?

 
这是一个 "阻塞 "方法/函数调用,无需修复。
 
Soewono Effendi #:
这是一个 "阻塞 "方法/函数调用,没什么好解决的。

是的,我知道这是一个会阻塞线程的同步函数,但我可以通过在 WinnHttpOpen () 函数中添加WINHTTP_FLAG_ASYNC 来异步使用它,这样就不会阻塞代码的其余部分了。该函数将指针指向接收结果的回调函数。

我使用typedef 这样定义了函数指针

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

然后,我根据 msdn 从 winhttp.dll 中导入了 WinHttpSetStatusCallBack()。

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

由于 mql 的原因,最大的问题似乎无法解决。当我编译时,得到的错误信息是导入语句中不允许使用指针。!!!!!!,因此无法将回调函数和返回指针传递给该函数。有什么办法吗?

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 #:

我使用typedef 这样定义函数指针

然后,我根据 msdn 从 winhttp.dll 中导入了 WinHttpSetStatusCallBack() 函数

是啊,不错的尝试)
我也希望能做到这一点,但如果你在论坛上搜索一下,就会发现 MQL 中的函数是一个句柄,而不是内存地址,这是 "C/C++"回调程序所要求的。

也许有一天 MQL 会添加 "真正的 "函数指针。

 
Soewono Effendi #:

是啊,不错的尝试 :)
我也希望能做到这一点,但如果您在论坛上搜索一下,就会发现 MQL 中的函数是一个句柄,而不是内存地址,这是 "C/C++"回调程序所要求的。

也许有一天 MQL 会添加 "真正的 "函数指针。

是的,我希望很快就能支持这个功能。

 

@Francis Dube 有没有可能创建一个 MQL5 服务来充当 WebSocket 服务器?您有一些例子吗?