MT4/MQL4とPython。
ここでは既存のコンテンツの内容
を少し発展させて、MetaTrader 4で動くエキスパート・アドバイザーやスクリプトを記述するためのプログラミング言語、MQL4からPythonのスクリプトを実行する方法を、サンプルを交えながら解説します。
もっと短く言うと、python3X.dllを使ってMT4の中にPythonを埋め込もう!という趣旨の記事です。
1.Pythonの埋め込み基礎知識
Pythonの公式ドキュメントにも記載がありますが、Pythonには他のアプリケーションへ埋め込む方法が2種類あります。
今回はそのうちの簡単な方法を採用して、MQL4から任意の文字列をPythonスクリプトとして実行するところを目指します。
Pythonの埋め込みに必要最低限のステップは、以下の3つです。
・Py_Initialize()で初期化する。
・PyRun_SimpleString()でスクリプトを実行する。
・Py_Finalize()で終了処理を実行する。
2.Python/C APIからMQL4への翻訳
PyRun_SimpleStringの引数の型情報だけは、少し考えてMQL4へ翻訳しなければなりませんが、残りの部分はそのままです。
void Py_Initialize()
https://docs.python.org/ja/3/c-api/init.html#c.Py_Initialize
int PyRun_SimpleString(const char *command)
https://docs.python.org/ja/3/c-api/veryhigh.html#c.PyRun_SimpleString
void Py_Finalize()
https://docs.python.org/ja/3/c-api/init.html#c.Py_Finalize
これらの情報をMQL4のコードに翻訳します。
/* ファイル名:python.mqh */
#import "C:\\Program Files (x86)\\Python38-32\\python38.dll"
void Py_Initialize();
int PyRun_SimpleString(uchar& command[]);
void Py_Finalize();
#import
注意する点は、32ビット版のPythonのしかMT4には埋め込むことができないというところです。
3.Wrapper関数の作成
このままではPyRun_SimpleStringの使い勝手が悪いので、ここでもWrapper関数を作成します。
/* ファイル名:python.mqh (さっきの続き) */
string Run_SimpleString(string command) {
uchar _command[];
ArrayResize(_command, StringLen(command) + 1, StringLen(command) + 1);
StringToCharArray(command, _command);
return PyRun_SimpleString(_command);
}
引数commandの長さが不定なので、ArrayResizeで動的に領域を確保するようにしましたが、引数commandの最大長を決められる場合には、パフォーマンスの面からも固定長の領域を使用する方が良いでしょう。
4.Pythonスクリプトの埋め込み
/* ファイル名:pyemb.mq4 */
#include <python.mqh>
int OnInit() {
int ret;
Py_Initialize();
ret = Run_SimpleString("from os import getpid\n" +
"from tkinter import messagebox as msg\n" +
"msg.showinfo('Hello from MQL4', 'PID: %d' % getpid())");
Py_Finalize();
PrintFormat("ret=%d", ret);
return INIT_SUCCEEDED;
}
このようなMQL4のコードを実行すると、埋め込まれたPythonスクリプトがtkinterを使用してポップアップを生成し、そこに自身のプロセスIDを表示します。
そしてこの画像が示す通り、そのPython自身のプロセスIDとMT4のプロセスIDが一致し、PythonがMT4プロセス内に埋め込まれているという事実が確認できます。
5.あとがき
ここに書いたことはあくまでも、PythonとMQL4の初歩的な融合ですが、その2つの異なるコードが同一プロセス内で動く意義、そしてそれが示す大きな可能性を感じていただければ幸いです。
ここで解説した内容を応用すれば、まだまだ新しいドアを開くことができます。
ご健勝をお祈りします。
Let's きっちり納税。noteでの収益を励みに、皆さんへ有益な情報を届けます!