記事「Metatrader 5のWebsockets — Windows APIを使用した非同期クライアント接続」についてのディスカッション

 

新しい記事「Metatrader 5のWebsockets — Windows APIを使用した非同期クライアント接続」はパブリッシュされました:

この記事では、MetaTraderプログラム向けに非同期のWebSocketクライアント接続を可能にするカスタムDLL(ダイナミックリンクライブラリ)の開発について解説します。

MetaTrader 5のWebSocket — WindowsAPIの使用」では、Windows APIを利用してMetaTrader 5アプリケーション内にWebSocketクライアントを実装する方法を紹介しました。しかし、その実装は同期的な動作モードに制限されていました。

本記事では、Windows APIの活用を再検討し、MetaTrader 5プログラム向けに非同期クライアント機能を実現するWebSocketクライアントの構築を目的としています。この目標を達成するための実用的な方法として、MetaTrader 5アプリケーションと連携可能な関数をエクスポートするカスタムDLL(ダイナミックリンクライブラリ)の作成が挙げられます。

そのため、本記事ではDLLの開発プロセスについて説明し、最後にMetaTrader 5プログラムを用いた適用例を紹介します。

Metatrader 5のWebsockets:Windows APIを使用した非同期クライアント接続


作者: Francis Dube

 
これは素晴らしい記事だ。あなたのおかげで、私のIOCPライブラリーをシェアする気になったよ。素晴らしい仕事だ。
 

こんにちは。

私は複数のインジケータを使用するEAを開発しています。 当初、私はインジケータの計算を機能化し、EAだけでなくインジケータプロットでも使用できるようにしました。ストラテジーテスターで テストしたところ、ビジュアルモードで実行されているインジケータとEAで決定された値とで、Bars関数が異なる値を返すことがわかりました。MLQ5で見つけたこのバグや他のバグを開発者に報告する方法をご存知ですか?

以前MQL4で使用していたiCustomを使用するのが簡単な解決策でしたが、MQL5のバージョンではCopyBufferは最初のインジケータのプロットでしか使用できず、私のインジケータの多くは複数のバッファをプロットしています。

私が思いつく解決策は、WebSocketを使用して複数のインジケータとEA間で通信するか、名前付きパイプを使用して同じことを行うか、インジケータを単一のバッファプロットに分けることです。

WebSocketは非同期なので、EAがインジケータから何十ものデータストリームをほぼ同時に取得することの意味は何でしょうか? それについていけるでしょうか、それともオーバーフローが発生するでしょうか?

どのようなご提案でも結構です。

ご回答ありがとうございました。


ケープコッダ

 
CapeCoddah ストラテジーテスターで テストしたところ、ビジュアルモードで実行されているインジケータとEAで決定された値とで、Bars関数が異なる値を返すことがわかりました。MLQ5で見つけたこのバグやその他のバグを開発者に報告する方法をご存知ですか?

以前MQL4で使用していたiCustomを使用するのが簡単な解決策でしたが、MQL5のバージョンではCopyBufferは最初のインジケータのプロットでしか使用できず、私のインジケータの多くは複数のバッファをプロットしています。

私が思いつく解決策は、WebSocketを使用して複数のインジケータとEA間で通信する、名前付きパイプを使用して同じことを行う、またはインジケータを単一のバッファプロットに分離することですが、同一の計算が複数あるため処理が大幅に増加します。

WebSocketは非同期なので、EAがインジケーターから何十ものデータストリームをほぼ同時に取得することの意味は何でしょうか? それについていけるでしょうか、それともオーバーフローが発生するでしょうか?

どのような提案でも大いに歓迎します。

ご回答ありがとうございました。


ケープコッダ

こんにちは:

しかし、MQL5のバージョンではCopyBufferは最初のインジケータのプロットでしか使用できず、私のインジケータの多くには複数のバッファがプロットされています。

それは正確ではありません。好きなバッファをコピーできます。CopyBuffer関数の3つのオーバーロードはすべて、指定したバッファをコピーできます。最初のバージョン(下図)を例にして説明します:

int  CopyBuffer(
   int       indicator_handle,     // インジケーター・ハンドル
   int       buffer_num,           // インジケータ・バッファ番号
   int       start_pos,            // スタート位置
   int       count,                // コピーする量
   double    buffer[]              // コピー先の配列
   );

2番目のパラメータ'buffer_num'で、コピーするバッファを指定することができ、インデックス0から始まるバッファを第1バッファ、1から始まるバッファを第2バッファなどとし、カスタム・インジケータから任意のバッファをコピーすることができます。この例としては、2つのバッファ(
0 - MAIN_LINE、1 - SIGNAL_LINE )を持つ組み込みのiMACDが あります。 WebSocketやあらゆる種類のソケットを試す前に、iCustomインジケータに焦点を当てて問題を解決することをお勧めします。C++のDLLなどの外部ライブラリを必要としない、よりシンプルなソリューションです。私はC、C++、C#などで開発をしていますが、経験上、MQL5(他の言語と同様、制限はあるものの、非常に強力な言語)にこだわることが最善のアプローチだと言えます。

進捗状況を教えてください。CopyBuffer'で何か問題に直面したら、遠慮なく質問してほしい。MQL4からMQL5へ移行する場合、いくつかのことが異なるため、MQL4の知識がそのまま使えるとは限りません。

頑張ってください。

 

でコード例を見ることができる:

コードベース

ブルッキーMT5用トレンド強度

ライアン・L・ジョンソン, 2025.04.29 19:52

このインジケータは、他の3つのサブウィンドウ・インジケータを呼び出します。すべてのファイルはIndicatorsフォルダにあります。
EAでも大前提は同じです。
 
Ryan L Johnson #:

でコード例をご覧ください:

同じ大前提がEAにも当てはまります。

それは素晴らしいアイデアです。

 

私の質問に対するお二人の返答に感謝します。 オーバーロードされた関数の定義を見落としていたようで、最初の方しか読んでいませんでした。 28のペアごとにシンボルパラメータを変え、Brooky Trend Strengthのように複数のiCustomコールを使用する予定なので、プロセッサの使用率を最大化するためにiCustomコールを並列処理するほどターミナルが賢いかどうかご存知ですか?

また、MQ5のバグについてコメントを投稿できる場所や、Mq管理者への提案も教えてください。 いくつか見つけたのですが、最近ではターミナルとストラテジーテスターの Barsの 違いについてです。 また、メインディスプレイが左端にある3スクリーンのセットアップを使用しています。ナビゲーターやマーケットパネルなどのパネルを左から右へ移動させるのは非常に面倒です。 ドラッグマウスポインターは一番左の画面にありますが、ドラッグパネルは真ん中にあります。 マウスが1ピクセル移動し、パネルを1ピクセル移動させるためにディスプレイが切り替わり、また元に戻るとき、ターミナルかWindowsのどちらかがおかしくなっているのだと思います。

 
CapeCoddah #:
28のペアごとにシンボルパラメータを変化させ、Brooky Trend Strengthのように複数のiCustomコールを使用する予定なので、TerminalがiCustomコールを並列処理し、プロセッサの使用率を最大化できるかどうかご存知ですか?

問題ありません。インジケータ・ハンドルとCopyBuffer()のインスタンスが別々に必要なだけです。すべてのインジケーターが同じスレッドで実行されるとしても、100ほどのインジケーター・インスタンスを実行することができます。

CapeCoddah#:
また、MQ5のバグに関するコメントや、Mq管理者への提案を投稿できる場所を教えてください。

Bars()は、価格データが欠落している場合、しゃっくりを起こします。過去に読んだ本の記憶が正しければ、Bars()はタイムスタンプを参照することで修正できます。検索してみる価値はあるかもしれない。

CapeCoddah#:
メインディスプレイが左端にある3スクリーンのセットアップをしています。 NavigatorやMarketパネルのようなパネルを左から右に移動させようとすると、とても面倒です。 ドラッグマウスポインタは一番左のスクリーンにありますが、ドラッグパネルは真ん中にあります。 マウスが1ピクセル移動し、ディスプレイを切り替えてパネルを1ピクセル移動させ、また戻るときに、ターミナルかWindowsのどちらかがおかしくなっているのだと思います。

これについては本当にわからない。私は3台のコンピューターを持っていて、それぞれにモニターとターミナルがあります。Windowsには一般的に、回避策としてピクチャー・イン・ピクチャーを含むマルチモニター表示設定があることは知っている。

どなたか、1台のマシンに複数のモニターを実際に使用している方がいらっしゃいましたら、ご意見をお聞かせください。

 

素晴らしい情報です!

ありがとうライアン。 barsとrates_totalに関するコメントは適切です。 私の問題は、ターミナルではこの2つは同じですが、STrategy Tester VisualizeではBarsの方が大きいことです。

また、Strategy TesterでEAが画面にテキストを表示する方法はありますか? Mq4では自動的に表示されましたが、今は表示されません。 情報を表示するために多くのクラスオブジェクトを使用しており、テンプレートに2つ目のコピーを入れるとStrategy Testerの動作がさらに遅くなります。

3パネル・ディスプレイについては、マウスが画面2から画面1に移動したときに、端末がモニターの位置を適切に更新しないのが問題だと思います。

私はそれぞれ3つのモニターをサポートする2台のミニPCを持っているので、3つのスクリーンを両方のミニPCに接続し、1台のPCにはHDMI1を、もう1台のPCにはHDMI2を使用しています。 リモコンが1つのモニターだけをコントロールするように適切に設定されていることを確認する必要がありますが(amazonのサポートに連絡してください)、43インチのFire Tvでうまく動作しています。 唯一の欠点は、オン・オフボタンがすべてのモニターをシャットダウンすることで、電源を同期させるためにプラグを抜く必要があることがあります。


ケープコッダ

 
CapeCoddah STrategy Tester VisualizeではBarsが1つ大きいことで、ドキュメントを最後まで読まずにボツにしました。 あなたの意見をiCustomに使おうと思います。 シンボルと時間の指定の組み合わせごとに別々のiCustomアドレスが必要だと推測します。

  1. 1つのディレクトリにある1つのインジケーター・ファイルを、複数のiCustom()インスタンスで再利用できます。
  2. 1つのインジケータ・ハンドルを複数のCopyBuffer()インスタンスで再利用できます。
  3. rate_total だけでは単一のタイムフレームに制限されるため、Bars() を使用している理由がわかりました。おそらく、各タイムフレームに対して別のループで Bars() を使用しているのでしょう。

CapeCoddah#:
また、Strategy TesterでEAが画面にテキストを表示する方法はありますか? Mq4では自動的に表示されましたが、今は表示されません。 情報を表示するために多くのクラスオブジェクトを使用しており、テンプレートに2つ目のコピーを置くとStrategy Testerの動作がさらに遅くなります。
私の知る限りではそうではありません。ビジュアライゼーションのテストMT5ヘルプページで私が知っている唯一の方法をすでに使用しています。
CapeCoddah#:
3パネルディスプレイについては、マウスが画面2から画面1に移動したときに、端末がモニターの位置を適切に更新しないことが問題だと思います。
残念ながら、私自身のセットアップでこれをテストする方法はありません。単一のMT5ターミナル画面をすべてのモニターに引き伸ばしていますか?他の人がその方法で問題を解決しているのを見たことがあります。