市場シミュレーション(第10回):ソケット(IV)
はじめに
前回の「市場シミュレーション(第9回):ソケット(III)」では、ミニチャットを作成するために必要だった最後のステップを説明しました。その目的は、MQL5でソケットを扱う方法を読者の皆さんが探求し始められるようにすることでした。これは非常に興味深く、将来的に活用できる可能性がありますが、リプレイ/シミュレーターアプリケーションの文脈においては、注文システムをどのように実装するかをまだ最終決定していません。ソケットの利用は、多くの場合、異なるアプリケーション間、さらには異なるオペレーティングシステム間で情報を転送するための有効な代替手段にすぎません。言い換えれば、送信元や送信先のシステムを意識することなく、WindowsシステムからmacOSやLinuxシステムへデータを転送できるということです。このため、一見控えめなシステムであっても、Raspberry Piのセットを専用の計算環境として使用するといった、より大掛かりな構成を構築することも可能です。しかし、それは本連載の範囲を超えています。ここでの主な目的は、リプレイ/シミュレーターが将来的に進む次の開発段階に向けて、読者の皆さんを準備することです。
一方、「市場シミュレーション(第6回):MetaTrader 5からExcelへの情報の転送」では、MetaTrader 5とExcelの間で情報を転送する方法を紹介しました。ではなぜExcelなのでしょうか。理由は純粋に教育目的です。他のプログラムを使うこともできたでしょうが、達成したいことを説明するにはExcelの方が分かりやすいのです。Excelにデータを転送するためにRTDやDDEを使うことは非常に一般的ですが、この種の通信は常に一方向です。つまり、Excelにデータを送ることはできても、そこで計算されたデータを迅速に読み取り、MetaTrader 5側で利用することはできません。ここで広がる可能性を想像してみてください。単純なエキスパートアドバイザー(EA)を使用しながら、すべての計算ロジックをExcel側に配置して制御することができるのです。これにより、MQL5を通じて調整や修正をおこなうことなく、EAを完全自動で動作させることが可能になります。その場合、作業はVBAで直接おこなうことになります。複雑に思えるかもしれませんが、適切な知識と学ぶ意欲があれば、比較的簡単であることが分かるでしょう。ただし、真剣な取り組みと学習は必要です。
ここで別の疑問が生じます。RTDシステムは本質的には単なるソケットです。しかし、一方向通信のみを許可するように設定されています。直近3回の記事で説明したソケットに関する知識があれば、もう少し洗練されたものを実装できることがより明確になります。ここでも、あくまで教育目的でExcelを使用します。実際には、同じ結果を得るために他のプログラムやアプリケーション、あるいは別の方法を使うことも可能です。しかし、実際の実装を示す前に、後で提示する結果を実現するために利用できる可能性を理解してほしいのです。
ここでは、さらに一歩進んだことをおこないます。これから紹介する内容に馴染みのない読者も多いのではないかと思います。このテーマは非常に興味深い一方で、非常に広範です。そのため、本記事の最後に示す参考文献もあわせて確認することをお勧めします。きっと役に立つはずです。私たちが使用するものは、まだ開発途中の段階にあります。しかし、それが学ぶ価値がないという意味ではありません。
MQL5コードにDLLを追加したくない(少なくとも今のところは)ので、ここでは少し興味深い方法を探ります。ExcelがMetaTrader 5と通信できるようにする方法を、段階的に示していきますので、ぜひ一緒に追いながら理解してください。
これは、「市場シミュレーション(第6回):MetaTrader 5からExcelへの情報の転送」で使用した方法とは別の方法でおこないます。あの方法も機能はしますが、あまり柔軟ではなく、ソケットを使用すれば不要になるいくつかの作業を強いられます。最終的な目標は、ExcelからMetaTrader 5へ、そしてその逆方向にもデータを転送する方法を示すことです。
Pythonを使い始める
「ちょっと待ってください。今、Excelを使うと言いましたよね。VBAで直接プログラミングするのではなかったのですか。なぜここでPythonの話が出てくるのですか。」読者の皆さん、まずは落ち着いてください。確かにExcelは使います。しかし、すべてをVBAで直接プログラミングするわけではありません。技術的には、VBAを使ってExcelとMetaTrader 5の間の通信を構築することも可能です。しかしそうすると、両プログラムが持つ機能の範囲に制限されてしまいます。将来的にExcelの代わりに別のプログラムを使ってMetaTrader 5の市場操作を補助したい場合、通信システム全体を作り直さなければなりません。Pythonを中間層として使用することで、はるかに柔軟になります。さらにPythonは特定の作業を簡素化してくれるため、Excelを使わずにPythonだけで完結させることも可能です。しかし、それは今回の目的ではありません。Excelを使いたい理由は、後ほど明らかになります。そのためにPythonが必要なのです。ここでおこなおうとしている構成は、下図のようなものです。

Pythonが中心にあり、すべての情報がそこを通過していることに注目してください。私たちの本来の目標は、MetaTrader 5とExcelを連携させることです。しかし、Pythonを中央に配置することで、Excelを使わずに動作させることも、他のアプリケーションに置き換えることも可能になります。
なぜPythonで、C/C++ではないのでしょうか。その理由は実用性です。Pythonでより簡単に優れた結果を得られるのであれば、わざわざC/C++でコードを書く意味はありません。Pythonは進化を続けており、ますます実用性が高まっています。したがって、MetaTrader 5とはソケットを通じてPythonで通信します。
ここで重要な点を説明しておきます。MetaTrader 5では、適切に設定すればチャート上でPythonスクリプトを直接実行できます。この設定は難しくありません。むしろ非常に簡単で分かりやすいものです。必要なのは、最新の安定版Pythonをダウンロードしてインストールすることだけです。その後、MetaEditorで下図のようにPython実行ファイルのディレクトリを設定します。

Python実行ファイルが含まれているディレクトリを指定するだけでよい点に注意してください。執筆時点で最も安定しているバージョンは3.11.3ですが、より新しいバージョンが公開されている可能性があります。最新バージョンは Python.orgからダウンロードできます。
インストールが完了すれば、Pythonスクリプトの作成を開始できます。コーディングを支援するさまざまなツールやエディタは存在しますが、必須ではありません。MetaEditorを使用してもよいですし、好みのエディタを使っても構いません。必要に応じて補助ツールをダウンロードしてもよいですが、ここでは特定のツールを推奨することはしません。
MetaTrader 5でPythonを使用する話題に戻りますが、実際にはここではその方法を使いません。ただし、必要であれば皆さんの用途に応じて活用しても構いません。私たちが実際におこなうのは、前回までの記事と同様に、通信コードを純粋にMQL5で構築し、Excel用のソケット作成を簡素化するためにPythonを使用することです。繰り返しますが、ソケットをVBAで直接作成することも可能です。しかし、特にサーバー側を構築する今回のケースでは、Pythonを使う方がはるかに簡単です。MQL5だけでは、純粋な形でサーバーを構築することはできません。
ただし、ここには重要なポイントがあります。上図のように、Pythonを介してExcelとMetaTrader 5を通信させるには、単にPythonをオペレーティングシステムにダウンロードしてインストールするだけでは不十分です。Excelに加えて、もう1つ追加のコンポーネントをマシンにインストールする必要があります。そして、この追加コンポーネントこそが、大きな違いを生み出すのです。
xlwingsを知る
ここで必要となる追加コンポーネントがこれです。このxlwingsは、Excelに存在するVBAの代わりとしてPythonスクリプトを実行できるようにするモジュールです。つまり、VBAでおこなっていた処理を、Excel内で直接Pythonを使って実行できるということです。ただし、xlwingsがVBAを完全に置き換えるわけではありません。VBAにも依然として用途があります。xlwingsはVBAを拡張する存在であり、多くのタスクをPython経由で実行できるようにしてくれるものです。
もう1つ触れておくべき点があります。xlwingsと同じことができる他のモジュールも存在します。確かにあります。しかし、それらの中にはライセンスが必要なものもあります。xlwingsの場合、非商用利用であれば追加費用なしで使用できます。多くの場合、皆さんはまず学習や実験をおこなう段階であり、いきなり商用プロジェクトを作成するわけではないでしょう。その意味で、学習初期の選択肢としてxlwingsは非常に良い代替手段です。特に、これからお見せするように、非常にシンプルだからです。
xlwingsのインストール
参考文献セクションでは、xlwingsのドキュメントにアクセスしてより詳しく理解する方法を紹介します。しかし、ここでは最初の段階でどのように進めるべきかをわかりやすく示します。まずはPythonをインストールする必要があります。Pythonのインストール中に、下の画像のようにオプションをチェックしてください。

この設定をおこなわない場合、後でWindowsの環境変数にPythonのパスを手動で追加する必要があります。Pythonの使用経験があるなら、パス変数の追加は不要です。しかしここでは、Pythonの経験が全くない場合を想定して進めます。そのため、すべてデフォルト設定でおこないます。Pythonのインストールが完了するまで待ちましょう。
インストールが完了すると、次の画面が表示されます。

赤枠のオプションをクリックすると、長いファイル名を使用できるようになります。これは個人の好みです。長いファイル名を使いたくない場合は、[Close]をクリックして完了です。しかし、256文字以上(Pythonでは260文字以上)の名前を扱いたい場合は、このオプションをクリックすることをお勧めします。これにより、Pythonがそのようなファイル名を正しく扱えるようになります。
次に、コマンドプロンプトを開きます。PowerShellでも構いませんが、私は個人的に従来のCMDを使うのが好みです。まず、コマンドプロンプトで以下のコマンドを入力してください。

このように、コマンドを1つずつ入力し、結果を確認しながら進めると、何がおこなわれているかが分かりやすくなります。入力したコマンドの結果として、Pythonはデフォルトで2つのパッケージをインストールしています。そのうち1つはすでにアップグレードが必要です。そこで、次のコマンドを入力します。結果は下図のようになります。

さて、システムが更新されたので、次はxlwingsに進みます。xlwingsはExcelと連携するためのアドインですが、ドキュメントにある通り、厳密にはExcelは必須ではありません。とはいえ、今回は実際にExcelを使用する方法で進めます。Excelがインストールされていれば、下図のように表示されます。

現時点ではExcelのリボンに特別な変化はありません。そこで再びコマンドプロンプトまたはPowerShellに戻り、次のコマンドを入力します。

このコマンドにより、xlwingsがPythonパッケージとしてダウンロードされ、インストールされます。インストール済みパッケージを再確認すると、下図のような結果が表示されます。

xlwingsのバージョンは随時更新されるため異なる場合があります。しかし、xlwingsと一緒にpywin32もインストールされていることに注意してください。心配はいりません。これはxlwingsの依存パッケージです。
次のステップはxlwingsのライセンス設定です。ただし心配は不要です。今回の利用は非商用、つまりここでおこなう内容を販売したり商用化するわけではないので、非商用ライセンスを利用すれば問題ありません。下図の手順に従えば、xlwingsのライセンス認証がおこなわれます。

さて、さて、準備が整いました。残る作業はxlwingsをExcelと統合することです。このとき、いくつか検討すべき点があります。まず、Excel経由でPythonアプリケーションを実行したいのか、それともExcelの操作自体をVBAの代わりにPythonで置き換えたいのかです。ここで言及する理由は、もしPythonで書かれたExcel用マクロを作りたいだけであれば、実際にはExcelにxlwingsアドインを追加する必要はありません。マクロ編集時に少し手順を踏むだけで、VBAとPythonを統合できます。
しかし、Excel内でPythonスクリプトを直接実行したい場合は、xlwingsをExcelアドインとして追加するのがおすすめです。こうすることで、リボンに新しい領域が作られ、Excelから直接Pythonスクリプトを実行できるようになります。もちろん、すべてが正常に動作するように、いくつか追加手順をおこなう必要はあります。
これらの手順はすべてxlwingsのドキュメントに詳しく説明されています。疑問がある場合は、必ずドキュメントを参照してください。この記事の最後に、参考文献へのリンクも提供します。
ここでは、読者はまだxlwingsについて何も知らず、Pythonの学習を始めたばかりであるという前提を立てています。この場合、最初はxlwingsをExcelアドインとして追加し、さらにマクロからも利用できるようにしておくのが理想です。学習を進めるうちに、自分に最適な方法が見えてくるでしょう。
Excelにxlwingsをアドインとして追加する
xlwingsをExcelにアドインとして追加する作業は、特別に複雑なものではありません。実際のところ、非常にシンプルです。方法は大きく分けて2つあります。ここでは標準インストールを前提に説明しますが、経験者であれば別の方法で設定することも可能です。
最初の方法は、Excelを直接使用し、Excel自体からxlwingsをアドインとして追加することです。まずExcelを開き、以下のオプションを選択します。

次に、次の画像のように指定されたオプションを選びます。

これでリボンに[Developer]タブが追加されます。[Developer]タブ内で、次の画像に示す項目を選択します。

すると、以下のウィンドウが開きます。

ここにはExcelの標準インストール時に用意されたアドインが表示されています。このウィンドウからxlwingsを追加するには、[Browse]ボタンをクリックし、以下のパスに移動します。
C:\Users\{USERNAME}\AppData\Local\Programs\Python\Python311\Lib\site-packages\xlwings\addin
このパスは、デフォルトのPythonインストールを指していることを覚えておいてください。{USERNAME}はPythonをインストールしたWindowsユーザー名です。「Python311」は現在インストールされているPythonのバージョンです。したがって、プログラムのインストール中に何をおこなったかを把握しておくことが重要です。インストール時に何か設定を変更した場合、これらの値は異なる可能性があります。いずれにしても、ここでの目的は、下の画像に示されているファイルを正しく見つけることです。

これらのファイルを追加すれば、Excelリボンから直接アドインにアクセスできるようになります。しかし、個人的には、同じ追加作業をおこなう場合には2番目の方法の方が便利だと思います。すでにコマンドプロンプトを開いているため、次のコマンドを入力するだけで済みます。

どちらの方法でも、結果は下の画像に示されている通り同じです。ただし、どちらの手順でアドインを追加するか選ぶ際に影響する1つのポイントがあります。この方法の利点は、コマンドプロンプトで実行したすべてのコマンドをバッチファイルにまとめられる点です。これにより、入力したコマンドを自動化でき、統合プロセス全体をより速く、簡単に進められるようになります。

Excelに[xlwings]という新しいタブが追加されたことに注目してください。このタブから、Pythonで書かれたスクリプトを利用できるようになります。ただし、完全に正しく動作させるためにはいくつか細かい注意点があります。改めて、xlwingsのドキュメントを確認して正しい手順を学んでください。というのも、xlwingsが想定していない方法で操作をおこなうと、見た目上は正常に動作しているように見えても、必ずエラーメッセージが表示されることになるからです。
さらに重要なポイントがあります。それは、Pythonスクリプトを、まるでVBAで書かれたマクロのように実行できることです。個人的に最も面白いのは、VBAとPythonを組み合わせて使う方法だと思います。しかし、この使い方は皆さん次第です。本記事の目的は、あくまで「ExcelとMetaTrader 5間で情報を簡単にやり取りする方法」という問題に対する解決策を提示することです。この具体的な手順にはまだ到達していませんが、非常に近い段階まで来ています。
ここから先はVBAに関連する説明です。整理して進めるため、新しいトピックとして扱いましょう。
PythonとVBAの統合
VBAコード内で直接Pythonを使用できるようにするには、ここで実際に使う方法以外にもいくつかのアプローチがあります。その1つがSHELL呼び出しです。この方法でもPythonスクリプトを実行できますが、xlwingsやそれと同等のツールを使った場合に直面しない不便な点がいくつかあります。
VBAコードからPythonスクリプトを実行するSHELL呼び出しの例は以下の通りです。
Sub CallPythonInVBA()
Dim vbaShell as Object
Set vbaShell = VBA.CreateObject("WScript.Shell")
vbaShell.Run """<PATH OF PYTHON>\python.exe""" & """<PATH OF SCRIPT>\Script.py"""
End Sub VBAマクロ
上記のコードでは、VBAからPythonスクリプトを実行することが可能です。確かに動作します。ただし、<PATH OF PYTHON>にはPython実行ファイルの場所を、<PATH OF SCRIPT>には実行するスクリプト(この場合は Script.py)の正しいパスを指定する必要があります。
しかし、PythonをVBAに直接統合できる場合、この方法はあまり意味がありません。というのも、上記のコードは単一行のコマンドに置き換え可能で、しかもいくつかの利点があります。1つは、Pythonがどこにインストールされているかを気にする必要がなくなることです。もう1つの利点(詳細は本記事の範囲を超えるため省略します)は、PythonスクリプトをExcelプロジェクト内に組み込み、VBAコードとともに管理できることです。統合がおこなわれると、プロジェクト全体を1つのフォルダやディレクトリで整理でき、xlwingsがパス解決やその他関連する問題を自動で処理してくれます。これにより、PythonスクリプトとVBAがシームレスに連携して動作するようになります。再度言いますが、詳細は本記事の参考文献にあるxlwingsのドキュメントを参照することをおすすめします。
では本題に戻りましょう。ExcelのVBAエディタを開くと、次のような画面が表示されます。

画像中で赤枠で囲まれた部分に注目してください。この項目はパスワードで保護されています。しかし、これは特に心配する必要はありません。このファイルを開くためのパスワードは、参考文献欄で示したxlwingsのドキュメントに記載されています。ここで直接示すこともできますが、できれば自分でドキュメントを確認してください。この時点で、VBAにxlwingsを使わせる設定をおこなう必要があります。これは、VBAコードにxlwingsの参照を追加することでおこないます。参照を追加する手順は、下図の場所からおこないます。

赤枠内の項目を選択すると、次の画面に移動します。

ここで画像に示されている参照にチェックを入れます。もしこのウィンドウを見たことがなければ、簡単に説明します。このウィンドウは、VBAがコード内の呼び出しを内部で解決できない場合に、どの参照ライブラリを使うかを指定する場所です。VBAは参照ライブラリを検索して、呼び出しを解決しようとします。解決できない場合、VBAはその呼び出しを未解決としてエラーを報告します。この仕組みが、Web上で見つけたVBAマクロコードが正しく動作しない原因になることが多いのです。多くの場合、VBAが解決できない参照が足りないことが原因です。
今回の例では、VBAコード内で存在する呼び出しのうち、ネイティブVBAにはないのがRunPythonです。画像の赤枠内のオプションにチェックを入れないと、VBAはRunPythonの呼び出しをエラーとして報告します。
ですので、忘れないでください。VBAでPythonコードを呼び出すマクロやスクリプトを作成する際は、必ずこの参照項目にチェックを入れてください。これにより、コードは正しく動作するようになります。
最終的な考察
本記事では、Excel内からPythonスクリプトを実行するために必要な手順のみを紹介しました。一見すると少し奇妙、あるいは不思議に思えるかもしれません。しかし、これは非常に多くの可能性を開きます。特に、VBAよりもPythonの方が簡単に実装できることが多いためです。さらに重要なのは、ExcelとMetaTrader 5の間で情報をやり取りする非常に柔軟で洗練された方法を構築できることです。たとえExcelを積極的に使わず、Pythonを直接MetaTrader 5と連携させる場合でも、一度本当に何ができるかを理解すると、PythonとMetaTrader 5だけに頼りたくなくなるはずです。Excelや他のスプレッドシートアプリケーションを活用したくなるはずです。
次回の記事では、これまで説明してきた仕組みを実際に動作させるコードがどのように実装されているかを詳しく見ていきます。それでは、次回の記事でお会いしましょう。
参照文献
| ファイル | 説明 |
|---|---|
| Experts\Expert Advisor.mq5 | Chart TradeとEAの連携を示す(Mouse Studyが必要) |
| Indicators\Chart Trade.mq5 | 送信する注文の設定ウィンドウを作成する(Mouse Studyが必要) |
| Indicators\Market Replay.mq5 | リプレイ/シミュレーターサービスと対話するためのコントロールを作成する(Mouse Studyが必要) |
| Indicators\Mouse Study.mq5 | グラフィカルコントロールとユーザー間のインタラクションを実現する(リプレイ/シミュレーターおよび実取引の両方で必須) |
| Servicios\Market Replay.mq5 | マーケットリプレイおよびシミュレーションサービスを生成し、維持する(システム全体のメインファイル) |
| VS C++ Server.cpp | C++でソケットサーバーを作成および管理する(ミニチャットバージョン) |
| Python code Server.py | MetaTrader 5とExcel間の通信用のPythonソケットを作成および維持する |
| ScriptsCheckSocket.mq5 | 外部ソケットとの接続を確認する |
| Indicators\Mini Chat.mq5 | インジケーターとしてミニチャットを実装する(サーバーが必要) |
| Experts\Mini Chat.mq5 | ミニチャットをEAとして実装する(サーバーが必要) |
MetaQuotes Ltdによりポルトガル語から翻訳されました。
元の記事: https://www.mql5.com/pt/articles/12743
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
機械学習に基づく平均回帰戦略の作成
取引におけるニューラルネットワーク:ハイブリッドグラフシーケンスモデル(最終部)
MQL5での戦略の可視化:基準チャートに最適化結果をレイアウトする
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索