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を表示します。

画像1

そしてこの画像が示す通り、そのPython自身のプロセスIDとMT4のプロセスIDが一致し、PythonがMT4プロセス内に埋め込まれているという事実が確認できます。

5.あとがき

ここに書いたことはあくまでも、PythonとMQL4の初歩的な融合ですが、その2つの異なるコードが同一プロセス内で動く意義、そしてそれが示す大きな可能性を感じていただければ幸いです。

ここで解説した内容を応用すれば、まだまだ新しいドアを開くことができます。

ご健勝をお祈りします。

Let's きっちり納税。noteでの収益を励みに、皆さんへ有益な情報を届けます!