很棒的文章,谢谢。
#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
知道为什么会出现这个错误吗?
谢谢
错误:Win32 API 错误 6 : 6
知道为什么会出错吗?
谢谢
我在 mql5 上使用它连接本地主机 127.0.0.1 时也遇到了同样的问题。不过,当我尝试在 mql4 上使用它时,它却能正常工作 !!!!。
此外,在 OnTimer 事件中使用 WinHttpSocketReceive() 也有问题,它会导致终端冻结。
我使用 nodeJS Express 和 WS 库构建了自己的 WS 服务器,当我在 onClick 事件处理程序中添加 Receive 函数时,我成功地向服务器发送了信息并从服务器接收了信息,这是因为 winhttp.sll::WinHttpSocketReceive() 是异步工作的。
这意味着它在从服务器接收到一些数据后才会返回。因此,在没有服务器发送数据的情况下,直接在 onTimer() 中使用它将永远阻塞线程并导致终端冻结。
因此,当有来自服务器的数据时,WinHttpSocketReceive() 可以很好地工作。但另一方面,如果在 OnTimer() 事件处理程序中使用相同的函数,终端就会冻结。有人知道如何避免这种情况吗?
这是一个 "阻塞 "方法/函数调用,没什么好解决的。
是的,我知道这是一个会阻塞线程的同步函数,但我可以通过在 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 的原因,最大的问题似乎无法解决。当我编译时,得到的错误信息是导入语句中不允许使用指针。!!!!!!,因此无法将回调函数和返回指针传递给该函数。有什么办法吗?
- 2021.10.13
- stevewhims
- docs.microsoft.com
@Francis Dube 有没有可能创建一个 MQL5 服务来充当 WebSocket 服务器?您有一些例子吗?
新文章 MetaTrader 5 的 WebSocket — 使用 Windows API已发布:
在本文中,我们将使用 WinHttp.dll 针对 MetaTrader 5 平台创建 WebSocket 客户端程序。 客户端最终将作为一个类实现,并借助 Binary.com 的 WebSocket API 进行测试。
结束语
作者:Francis Dube