2023.06
林貴晴/AMSER Inc.
Pythonはデータの取り扱いに優れた言語であり、豊富なライブラリが利用可能です。これにより、グラフの描画などの作業が容易になります。本記事では、MetaTrader 5(MT5)とPythonを連携させて、取引データの取得やグラフの表示方法について紹介します。特に、USD/JPYとEUR/USDの為替レートを比較する際、USDの表示が逆になるため直感的に理解しにくい場合があります。この問題を解決するために、Pythonを使ってMT5からデータを取得し、EUR/USDのレートを逆数に変換してUSD/EURとしてグラフに表示する方法を解説します。
MetaTrader 5のPythonパッケージをインストールします。まだインストールしていない場合は、次のコマンドを実行してください。
pip install MetaTrader5
インストールが完了したら、以下のコードを使用してMetaTrader5ライブラリをインポートします。
import MetaTrader5 as mt5 from datetime import datetime, timedelta import matplotlib.pyplot as plt from matplotlib.dates import DateFormatter
次に、MetaTrader 5との接続を確立します。
mt5.initialize()
データ取得の期間を設定します。この例では、現在時刻から1週間前までのデータを取得します。
end_time = datetime.now() start_time = end_time - timedelta(weeks=1)
つぎにUSD/JPYとEUR/USDの通貨ペアのデータを1分足で取得します。通貨ペア名は気配値表示に表示されている通貨ペア名を正確に入れる必要があります。ここでは、フィリップ証券のサフィックス「.ps01」を通貨ペアに追加しています。
usdjpy_rates = mt5.copy_rates_range("USDJPY.ps01", mt5.TIMEFRAME_M1, start_time, end_time) eurusd_rates = mt5.copy_rates_range("EURUSD.ps01", mt5.TIMEFRAME_M1, start_time, end_time)
取得したデータからタイムスタンプとレートをリストに格納します。 EUR/USDのレートは逆数を取ってUSD/EURとして扱います。
times = [] usdjpy = [] usdeur = [] max_length = min(len(usdjpy_rates), len(eurusd_rates)) for i in range(max_length): usdjpy_rate = usdjpy_rates[i] eurusd_rate = eurusd_rates[i] if usdjpy_rate[1] != 0 and eurusd_rate[1] != 0: times.append(datetime.fromtimestamp(usdjpy_rate[0])) usdjpy.append(usdjpy_rate[1]) usdeur.append(1 / eurusd_rate[1])
次に、matplotlibを使用して、取得した通貨ペアのレートをグラフに描画します。USD/JPYは赤色、USD/EURは青色で表現します。
fig, ax1 = plt.subplots(figsize=(16, 9)) ax2 = ax1.twinx() ax1.plot(times, usdjpy, color="red") ax2.plot(times, usdeur, color="blue", lw=1) plt.xticks(rotation=45) ax1.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d %H:%M')) plt.show()
最後にMetaTrader 5の接続を終了します。
mt5.shutdown()
以上のステップで、Pythonを使用してMT5からデータを取得し、処理して視覚化する一連の流れを確認しました。以下に全体のコードを示します。
# pip install MetaTrader5 import MetaTrader5 as mt5 from datetime import datetime, timedelta import matplotlib.pyplot as plt from matplotlib.dates import DateFormatter mt5.initialize() end_time = datetime.now() start_time = end_time - timedelta(weeks=1) usdjpy_rates = mt5.copy_rates_range("USDJPY.ps01", mt5.TIMEFRAME_M1, start_time, end_time) eurusd_rates = mt5.copy_rates_range("EURUSD.ps01", mt5.TIMEFRAME_M1, start_time, end_time) times = [] usdjpy = [] usdeur = [] max_length = min(len(usdjpy_rates), len(eurusd_rates)) for i in range(max_length): usdjpy_rate = usdjpy_rates[i] eurusd_rate = eurusd_rates[i] if usdjpy_rate[1] != 0 and eurusd_rate[1] != 0: times.append(datetime.fromtimestamp(usdjpy_rate[0])) usdjpy.append(usdjpy_rate[1]) usdeur.append(1 / eurusd_rate[1]) fig, ax1 = plt.subplots(figsize=(16, 9)) ax2 = ax1.twinx() ax1.plot(times, usdjpy, color="red") ax2.plot(times, usdeur, color="blue", lw=1) plt.xticks(rotation=45) ax1.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d %H:%M')) plt.show() mt5.shutdown()
このコードを実行結果は以下のようなグラフになります。
直線的に上がっている場所は雇用統計の発表です。また、横線になっているところはデータのない土日になります。
MetaTrader 5 (MT5) は、過去の市場データを手軽に取得するための強力なツールですが、Pythonとの連携によりさらに拡張することができます。Pythonの広範なライブラリにより、大規模なデータセットの取り扱いが驚くほど簡単になり、分析や視覚化のプロセスが格段に向上します。今回の連携により、リアルタイムデータを瞬時に取得し、精密な分析を行いながら、視覚的な比較を容易に行うことができました。特に、EUR/USDのレートを逆転させてUSD/EURとして表示することで、通貨ペアの動きを新たな視点から捉えることができます。このように、MT5とPythonを組み合わせることで、データの潜在力を最大限に引き出し、より洞察に富んだ分析が可能になります。
林 貴晴(AMSER株式会社代表取締役)
内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役。