記事「MetaTrader 5のWebSocket — WindowsAPIの使用」についてのディスカッション

 

新しい記事「MetaTrader 5のWebSocket — WindowsAPIの使用」はパブリッシュされました:

この記事では、WinHttp.dllを使用してMetaTrader 5プログラム用のWebSocketクライアントを作成します。クライアントは最終的にクラスとして実装され、Binary.com WebSocketAPIに対してもテストされます。

EAを実行すると、次に示すように新しいカスタム銘柄が作成されます。

EAデモ

作者: Francis Dube

 
これはとてもクールです。特に、安全なウェブソケットも サポートしているようです。
MT4でも使えるのでしょうか?

素晴らしい記事です、ありがとうございます。
 
このウェブソケットライブラリには、pingやpongを送信する機能はありますか?
 

このライブラリ(winhttp.dll)は、PingやPongのための関数を公開していません。ドキュメントでは、接続を維持する方法を制御するコンフィギュレーション・オプションに 言及していますが。私は、このライブラリは、接続がアイドル状態のときに自動的にPingを送信すると考えています。

 
#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");
   }

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

接続できるかどうか確認 したいのですが、接続時にエラーが発生します。

エラーです。Win32 API エラー 6 : 6

なぜこのようなエラーが発生するのでしょうか?

ありがとうございます。

 
Dark Ryd3r 確認 したいのですが、接続時にエラーが発生します。

エラーです。Win32 API エラー 6 : 6

なぜこのようなエラーが発生するのでしょうか?

ありがとうございます。

私はそれがローカルホスト127.0.0.1に接続するために使用されるとき、mql5上で同じ問題を抱えている。しかし、私はmql4でそれを使用しようとしたとき、それは正常に動作しました!!!。

また、OnTimerイベントでWinHttpSocketReceive()を使用すると、ターミナルがフリーズしてしまうという問題があります。

私はnodeJS ExpressとWSライブラリを使用して独自のWSサーバを構築し、onClickイベントハンドラでReceive関数を追加すると、サーバへの送信とサーバからの受信に成功しました , これは、 winhttp.sll::WinHttpSocketReceive() が非同期に動作するという事実のためです。

つまり、サーバーから何らかのデータを受信するまで、この関数は返さないということです。そのため、サーバーからデータを送信することなく、onTimer()で直接使用すると、スレッドが永遠にブロックされ、ターミナルがフリーズする原因となります。






そのため、WinHttpSocketReceive()は、サーバーからデータがある場合にはうまく動作します。しかし、一方では、同じ関数がOnTimer()イベントハンドラの内部で使用されている場合、それは端末がフリーズしています。誰もがそれを回避する方法についての手がかりを持っていますか?

 
これは「ブロッキング」メソッド/関数呼び出しであり、ここで修正することは何もありません。
 
Soewono Effendi #:
これは、"ブロック "メソッド/関数の呼び出しであり、ここで修正することは何もありません。

私はそれがスレッドをブロックする同期関数であることを知っている , しかし、私はWinnHttpOpen() 関数にWINHTTP_FLAG_ASYNCを 追加することによって、非同期にそれを使用して管理することができました それはコードの残りの部分をブロックしません , しかし私は WinHttpSetStatusCallBack() msdnに従っている追加によって上昇した別の問題に直面して , 我々は使用しなければならない 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

私はコンパイルするとき、私はポインタがインポート文に許可されていないというエラーメッセージが表示されます!!!だから、この関数へのコールバックだけでなく、その関数への戻り値のポインタを渡す方法はありません!どんなアイデアですか?

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++」コールバック-APIで必要であることがわかります。

いつかMQLが「本当の」Function Pointerを追加してくれるかもしれませんね。

 
Soewono Effendi #:

うん、いい試みだ :)
私もこれが可能になることを望んでいましたが、フォーラムを検索すると、MQLの関数は、「C/C++」コールバック-APIで必要とされるメモリアドレスではなく、ハンドルであることがわかります。

いつかMQLが「本当の」関数ポインタを追加するかもしれませんね。

早くネイティブでサポートされることを望みます。

 

@Francis Dube WebSocketサーバーとして動作するMQL5サービスを作成することは可能ですか?何か例はありますか?