MT4/MT5とPythonを連携する簡単な方法

FXの自動売買ではMT4/MT5を利用することが多いですが、利便性を考えてPythonを使いたいという方もいるかと思います。今回はできるだけ簡単にMT4/MT5とPythonを連携する方法をご紹介します。
Pythonを使う理由
Pythonを使う具体的な理由を考えます。
- MT4/MT5よりも楽
- 新しいマーケットへ応用できる
MT4/MT5よりも楽
基本的なトレード機能(注文、決済、定型のテクニカル分析)のみを利用するならMT4/MT5の方が確実に簡単ですが、例えば「VIXを参照したい」、「Twitterの解析をしたい」といった定型外の機能を作成する時にMT4/MT5では情報不足により実現にある程度の時間が掛かってしまいます。Pythonであれば情報が豊富ですしライブラリ化されていることも多く、数分で実装できることがあります。
機械学習の技術を取り入れるにしても、わざわざMT4/MT5でやる人は殆どいないので確実に情報不足になります。
新しいマーケットへ応用できる
仮想通貨の自動売買がどのような流れになったのかを考えれば分かります。
仮想通貨取引所はAPIを提供し、開発者がそのAPIを簡単に使えるようにラッパーを作成し、ユーザーがPythonやC#から簡単に自動売買できるようになりました。MT4は国内で一社のみ提供をしましたが、全く流行りませんでした。(スプレッドが広過ぎるという別の理由からかもしれませんが。。。)
この事実からも次の新しいマーケットが盛り上がった時に最初に使えるのは、特定のプラットフォーム(MT4/MT5)のみで利用できる特殊なプログラム言語ではなく、汎用的なプログラム言語ではないかと考えます。
先行者利益を得るためにもPythonを使えるようにしておくのは悪いことではないと思います。新しいマーケットがMT4/MT5の持っているデータと関連性を持っている可能性もありますので、事前に連携の仕組みを構築しておけば圧倒的な優位性になる可能性もあります。
連携方法
前提としてPythonの実行環境準備とMT4/MT5のインストールが必要になります。ここでは環境構築方法については触れませんので、まだ準備されていない方はネットを検索して準備をお願いします。Pythonは3系です。
連携方法は「ファイルでのやり取り」と「WebRequest」を考えましたが、ファイルでのやり取りは同期が取りづらい点があるのでWebRequestを採用することにしました。
ただ、ファイルでのやり取りで実現したい方もいる可能性がありますので、イメージだけ記載します。
ファイルでのやり取り
MT4/MT5でのファイル出力は、共通フォルダを指定することで同じ場所に出力されます。以下のようにファイルオープン時に「FILE_COMMON」を追加するだけです。
int handle=FileOpen(filename , FILE_READ|FILE_WRITE|FILE_CSV|FILE_COMMON,’\t’,CP_UTF8);
それぞれのファイルをPython側がオープンして、処理結果をファイル出力します。それをMT4/MT5側で再度読み込んでトレード処理を行うイメージです。

WebRequest
PythonのFlaskを使います。入っていない方はpip install FlaskかAnaconda Navigatorからインストールしてください。
連携方法はファイルの読み書きではなくWebRequestで行います。

プログラム
呼び出しと結果取得
[Python側プログラム]
リクエストが来たら「OK」を返すだけのプログラムです。
※Flaskのデフォルトポートは5000なのですが、5000ではMT4が通信できませんでした。(MT5はできました)
MT4で通信するには上記プログラムのようにポートを80に設定しておく必要があります。
プログラムを実行します。

[MT4/MT5側プログラム]
WebRequestした結果を表示するだけのプログラムです。
少し長いように感じるかもしれませんが、殆どがエラーハンドリング部分なので実際の処理に必要なのは数行です。
MT4/MT5側でプログラムをチャートに適用します。
※実行前にMT4/MT5の「ツール>オプション」で以下設定を入れてください。WebRequestするために必要な設定になります。

実行結果を確認します。
Flask

MT4/MT5

MT4/MT5からの呼び出しと結果の取得ができました。
Pythonにデータを渡す
Python側にOpen, High, Low, Closeなどのデータを渡したい場合もあるかと思いますので連携方法を記載します。
[Python側プログラム]
値が受け取れていることを確認するために受け取った値をコンソールに出力します。さらに2つのMT4/MT5から受け取ったデータを比較して比較結果を返すようにしました。
[MT4/MT5側プログラム]
先ほどのプログラムのURL部分を以下に変更してどのMT4が出力したメッセージかを分かりやすくしたのみの変更になります。
OANDA-MT4
string url=”http://localhost/sendtest?broker_code=1&open=1.5555&high=1.6666&low=1.7777&close=1.8888″;
XM-MT5
string url=”http://localhost/sendtest?broker_code=2&open=1.1111&high=1.2222&low=1.3333&close=1.4444″;
プログラムを実行します。
Flask
OANDA側の実行時点ではXMのデータがまだ存在しないのでCloseの結果が0になりましたが、XM側を実行すると1.4444の値が出力されました。

MT4/MT5

最後に
今回は簡単な値の受け渡しのみを行いましたが、Pythonが使えれば様々な解析を割と簡単に行うことができますし、スクレイピングをするときもMT4/MT5でやるよりはるかに簡単かつ汎用的に作成することができますので、利用価値は多少あるのではないかと思います。
注意点としては、WebRequest系は処理が重いので高速スキャルピングなどには向いていないというところですね。
興味があれば以下もご覧ください。

ディスカッション
コメント一覧
まだ、コメントがありません