Stanislav Korotky #: 経済カレンダーの読み込みとCSVへのエクスポートに関するバグフィックスと改善がコード ベースで公開された。具体的には、ソートされた大きな配列(これは通常MQL5のカレンダーAPIから受信される)の場合のソートアルゴリズムが修正され、スローダウンやスタックオーバーフローがなくなった。
Stanislav Korotky #: ところで、ws/sourcesで 使用しているMQL5Book/StringUtils.mqhの 新しいバージョンを追加するのを忘れていた。
Stanislav Korotkyさん、ご協力ありがとうございました。pythonウェブソケットサーバーのping pong問題についてですが、デバッグを進めるうちに、サーバーがpingリクエストをテキストまたはバイナリデータとして送信し、MT5が正常に応答するのはテキストベースのpingが送信された場合のみであることに気づきました。
ウェブソケット・クラスの バグ修正と改良をいくつか添付します。
経済カレンダーの読み込みとCSVへのエクスポートに関するバグフィックスと改善がコード ベースで公開された。具体的には、ソートされた大きな配列(これは通常MQL5のカレンダーAPIから受信される)の場合のソートアルゴリズムが修正され、スローダウンやスタックオーバーフローがなくなった。
msclient.mqhの126行目'return connection.handshake(url, host, origin, custom_headers);'に'path'の代わりに完全な'url'を渡すと、pythonのwebsocketで403エラーになります。EAが私のpythonウェブソケットサーバに正常に接続できるようにするには、この変更を行う必要がありました。
Postmanのサーバーログ(合格)と変更前のEAのサーバーログ(失敗)を添付 します。
しかし、ここで次の問題が発生します。私のサーバーは設定された間隔で自動的にkeepalive pingを送信しますが、MT5のウェブソケット実装は応答しないようで、この動作が原因でサーバーはpingタイムアウトの直後にクライアント接続を常に切断します。
keepalive ping pongに関して何かヘルプがあればお願いします。
msclient.mqhの126行目'return connection.handshake(url, host, origin, custom_headers);'に'path'の代わりに完全な'url'を渡すと、pythonウェブソケットでエラー403になる小さな芽があります。EAが私のpythonウェブソケットサーバに正常に接続できるようにするには、この変更を行う必要がありました。
Postmanのサーバーログ(合格)と変更前のEAのサーバーログ(失敗)を添付 します。
しかし、ここで次の問題が発生します。私のサーバーは設定された間隔で自動的にkeepalive pingを送信しますが、MT5のウェブソケット実装は応答しないようで、この動作が原因でサーバーはpingタイムアウトの直後にクライアント接続を常に切断します。
keepalive ping pongに関して何かヘルプがあればお願いします。
クライアントコールでpathを 使用することは可能です:
一方、HTTPリクエスト構文はターゲットとして完全なURIをサポートしており、異なるサーバ(wss://ws.postman-echo.com/rawを 含む)に対してオリジナルのソースコードでテストを行いましたが、正常に動作しました。というわけで、ある意味違反なのか、あなたのpythonの実装が厳しすぎるのかはよくわかりません。
ping/pongに関しては動くはずです。wsprotocol.mqhを見て ください:
サーバからクライアントにpingを送信しているのですから、あなたの側でデバッグしてください。
ところで、ws/sourcesで 使用しているMQL5Book/StringUtils.mqhの 新しいバージョンを追加するのを忘れていた。
IWebSocketFrame *temp = WebSocketFrame::create(WS_FRAME_OPCODE::WS_PONG_FRAME, frame.getData(); IWebSocketFrame *temp = WebSocketFrame::create(WS_FRAME_OPCODE::WS_PONG_FRAME, frame.getData(); IWebSocketFrame *temp = WebSocketFrame::create(WS_FRAME_OPCODE::WS_PONG_FRAME, frame.
frame.getData() pingデータがテキスト/文字列ベースの場合のみ、サーバーはpongを認識するようですが、バイナリpingが送信された場合は失敗します
したがって、
両方のケースで動作するように、オーバーロードされたframe.getData(uchar &buf[]) を使用するようになりました。私の変更が)壊れるような他のユースケースに出会うかどうかはわからないが、今のところすべて問題なさそうだ。
Stanislav Korotky ありがとうございます。python ウェブソケットサーバーの ping pong 問題について、デバッグを進めるうちに、サーバーが ping リクエストをテキストまたはバイナリデータとして送信し、MT5 が正常に応答するのはテキストベースの ping が送信された場合のみであることに気づきました。
IWebSocketFrame *temp = WebSocketFrame::create(WS_FRAME_OPCODE::WS_PONG_FRAME, frame.getData(); IWebSocketFrame *temp = WebSocketFrame::create(WS_FRAME_OPCODE::WS_PONG_FRAME, frame.getData(); IWebSocketFrame *temp = WebSocketFrame::create(WS_FRAME_OPCODE::WS_PONG_FRAME, frame.
frame.getData() pingデータがテキスト/文字列ベースの場合のみ、サーバーはpongを認識するようですが、バイナリpingが送信された場合は失敗します
したがって、
両方のケースで動作するように、オーバーロードされたframe.getData(uchar &buf[]) を使用するようになりました。私の変更が)壊れるような他のユースケースに出会うかどうかはわからないが、今のところすべて問題なさそうだ。
ご苦労様です。あなたの編集をソースコードに含めることを検討します。
OnTimerとOnMessageについては、あなたのアプリケーションで異なる処理ロジックを実装したいかもしれないので、提供されています。ソケットからの読み込みはMQL5のAPIレベルでブロッキングされ、タイムアウトが指定されます。したがって、新しいメッセージの待機、その処理、および応答の自動生成にのみ興味がある場合は、ブロッキングモードで実行できます(読み取り時のタイムアウトは無限で、OnTimerはありません)。しかし、ユーザーにレスポンシブなUIを提供する必要がある場合(チャットアプリの場合)、OnTimer-handlerで短い読み取り試行に対して小さなタイムアウトを設定し(タイムアウトした場合、空のデータを生成することができます)、その間のユーザーのアクションを監視します。
君の努力に感謝する。あなたの編集をソースコードに含めることを検討するよ。
OnTimerとOnMessageについては、アプリケーションで異なる処理ロジックを実装したい可能性があるため、提供しています。ソケットからの読み込みはMQL5のAPIレベルでブロッキングされ、タイムアウトが指定されます。したがって、新しいメッセージの待機、その処理、および応答の自動生成にのみ興味がある場合は、ブロッキングモードで実行できます(読み取り時のタイムアウトは無限で、OnTimerはありません)。しかし、ユーザーにレスポンシブなUIを提供する必要がある場合(チャットアプリの場合)、OnTimer-handlerで短い読み取り試行に対して小さなタイムアウトを設定し(タイムアウトした場合、空のデータを生成することができます)、その間のユーザーのアクションを監視します。
wss のソースコードを zip アーカイブに保存する際の細かいバグフィックスと改善です。
特に、アップグレードに失敗した場合(例えば、認証が必要で101以外のステータスコードが返された場合)を分析し、対策を講じることができるようになりました:
また、StringUtils.mqh とURL.mqh も重要な修正を受けました。
こんにちは、MQL5初心者 です。ウェブソケット用のwss.zipファイルを投稿しているのを見つけました。どのように使用するのでしょうか、デモや何か学べるものはありますか?ありがとうございました!