【MT5 API入門③】PythonでMT5からデータを取得する方法
この記事は、「MT5 APIではじめるPythonシステムトレード入門」シリーズの第3回です。
第2回の記事では、PythonとMT5を接続する方法を解説しました。
今回はその続きとして、接続したMT5からさまざまなデータを取得する方法を解説します。

技術的なお問い合わせは受け付けておりません。技術的な課題はお客様ご自身で解決をお願いいたします。
データ取得の概要
データを収集することは、システムトレードの最初のプロセスとなります。
Pythonで市場分析を行ったり、システムトレードの戦略を構築することは、データに基づく定量的なアプローチとなるため、データの取得は必須のプロセスになります。

Pythonでのシステムトレードは、さまざまな情報源からデータを収集することが可能ですが、本記事ではその中でもMT5から取得できるデータに焦点を当てています。
MT5から取得できるデータとは

各口座にログインしたMT5(アプリケーション)を立ち上げると、チャートを開くことができます。
MT5は、接続先のブローカーからレート情報(始値、高値、安値、終値など)を取得し、MT5内でチャートとして出力することによって、チャートの表示を実現しています。
つまり、MT5はレート情報を保持していることになります。
このように「MT5が保持しているデータ」が、PythonでMT5から取得できる対象のデータとなるのです。
「MT5が保持しているデータ」はレート情報だけではありません。
例として以下のようなものがあります。
- ● 4本値(始値、高値、安値、終値)
- ● ティックボリューム
- ● ティックデータ
- ● 日時情報
- ● 銘柄情報(通貨ペアの情報)
- ● 口座情報(残高など)
これらMT5が保持しているデータは、MT5 APIを利用してPythonで取得することができます。
取り扱い銘柄を一覧で取得
取得可能な銘柄(通貨ペア)の種類や表記は、MT5の接続先のブローカーの取り扱い銘柄によって異なります。
例えば、同じUSDJPYであっても、ブローカーによって「USD_JPY」や「USDJPYa」など表記が異なる可能性があります。
4本値などの価格データを取得するときは、正しい銘柄の名称を指定する必要があるため、価格データ取得の前に、まずは取得可能な銘柄名を確認する必要があります。
MT5側では「気配値表示」を右クリック→「銘柄一覧」を選択すると「銘柄」ウインドウが表示され、その画面内で「どんな銘柄があるのか」という情報を確認できます。

このような確認をPythonで実行してみましょう。
import MetaTrader5 as mt5
# MT5に接続
if not mt5.initialize():
print("MetaTrader5 initialize failed")
quit()
# 取り扱い銘柄名を全て取得
symbols = mt5.symbols_get()
symbol_names = [s.name for s in symbols]
# MT5との接続を切断
mt5.shutdown()
print(symbol_names)
コードを実行することで、接続先の取り扱い銘柄を一覧で表示できます。
symbols = mt5.symbols_get()
このコードにより、接続先のMT5の取り扱い銘柄の細かい情報を取得し、symbolsというリストに格納します。

このsymbolsには、MT5上の赤で囲った箇所に掲載されている情報が全銘柄分、格納されています。
今回は銘柄名のみを確認したいので、
symbol_names = [s.name for s in symbols]
このようなコードを続けて記述し、symbolsの中から銘柄名のリストをsymbol_namesというリストに抽出しています。
['GBPJPY', 'GBPUSD', 'AUDCHF', 'CHFJPY', 'EURCHF', 'EURGBP', 'GBPCHF', 'USDCHF', 'GBPAUD', 'TRYJPY', 'ZARJPY', 'GBPCAD', 'GBPNZD', 'USDTRY', 'USDZAR', 'USDMXN', 'USDSGD', 'USDCNH', 'CNHJPY', 'NZDCHF', 'AUDCAD', 'AUDJPY', 'AUDNZD', 'AUDUSD', 'CADJPY', 'EURAUD', 'EURCAD', 'EURJPY', 'EURUSD', 'NZDJPY', 'NZDUSD', 'USDCAD', 'USDJPY', 'EURNZD', 'NZDCAD', 'CADCHF', 'MXNJPY', 'USDDKK', 'USDNOK', 'USDSEK']
これは実行結果です。
このように銘柄名のリストが出力されます。
※接続先のブローカーによって銘柄名のリストの中身は異なります。
このとき出力された銘柄名を、価格データを取得する際に指定することとなります。
4本値を取得
取得可能な銘柄を確認したところで、いよいよ価格データを取得します。
まずは、先ほど取得した銘柄名のリストから‘GBPJPY’の価格データを取得してみましょう。
import MetaTrader5 as mt5
from datetime import datetime
# MT5に接続
if not mt5.initialize():
print("MetaTrader5 initialize failed")
quit()
# レート情報を取得
rates = mt5.copy_rates_range("GBPJPY", mt5.TIMEFRAME_D1, datetime(2025, 1, 1), datetime(2025, 12, 31))
# MT5との接続を切断
mt5.shutdown()
print(rates)
このコードを実行すると「日時情報、4本値、ティックボリューム、スプレッド、リアルボリューム」の情報が入ったNumpy配列を取得できます。
取得する条件について
mt5.copy_rates_range("GBPJPY", mt5.TIMEFRAME_D1, datetime(2025, 1, 1), datetime(2025, 12, 31))
このコードで価格データを取得していますが、引数に「銘柄」「時間軸」「取得開始日」「取得終了日」を指定しています。
「銘柄」は先ほど取得した銘柄名のリストから選びます。
「時間軸」の表記方法は以下のMQL5公式URLから確認できます。
https://www.mql5.com/ja/docs/python_metatrader5/mt5copyratesfrom_py#timeframe

表:MQL5公式URL該当ページから引用
「取得開始日」「取得終了日」はdatetime型を引数にする必要があるため、2025年のデータを取得する場合は「datetime(2025, 1, 1), datetime(2025, 12, 31)」というような記述としています。
これらの引数を変更することで、任意の価格データを取得可能になります。
取得したデータの変換
上記の方法で取得したデータは、以下のような形式(Numpy配列)となっています。

このままでは扱いにくいため、わかりやすい形式に変換するコードを実行します。
import pandas as pd
# 取得したレート情報をPandasデータフレームに変換
rates_df = pd.DataFrame(rates, columns=["time", "open", "high", "low", "close", "tick_volume", "spread", "real_volume"])
rates_df['time'] = pd.to_datetime(rates_df['time'], unit='s')
print(rates_df)
ratesを取得した状態で、このコードを実行することで変換が完了します。
rates_df = pd.DataFrame(rates, columns=["time", "open", "high", "low", "close", "tick_volume", "spread", "real_volume"])
取得したままの状態では、各列が何のデータを示しているのかわかりにくかったため、列名を付けたPandasデータフレーム(表形式のデータ)に変換しています。
rates_df['time'] = pd.to_datetime(rates_df['time'], unit='s')
さらに、日時情報は1970-01-01からの経過秒数を表示していたため、これをdatetime型に変換し「年-月-日 時:分」という扱いやすい形式にしています。

これはPythonで価格データを取得し、扱いやすい形式に変換したあとのデータです。
列名の追加と日付の表記が反映されていることが確認できます。

MT5側では「気配値表示」を右クリック→「銘柄一覧」→「チャートバー」と選択し、先ほどPythonで取得した際に引数で指定した条件と同じ条件を、赤丸で示した箇所に入力して「情報呼出」を押すと、同じ価格データを確認できます。
ティック情報を取得
4本値の取得ができたので、続けてティック情報を取得してみましょう。
要領は4本値の取得とほとんど同じです。
import MetaTrader5 as mt5
import pandas as pd
from datetime import datetime
# MT5に接続
if not mt5.initialize():
print("MetaTrader5 initialize failed")
quit()
# ティックデータを取得
ticks = mt5.copy_ticks_range("GBPJPY", datetime(2025, 10, 1, 0, 0), datetime(2025, 10, 1, 23, 59), mt5.COPY_TICKS_ALL)
# MT5との接続を切断
mt5.shutdown()
# 取得したティックデータをPandasデータフレームに変換
ticks_df = pd.DataFrame(ticks, columns=["time", "bid", "ask", "last", "volume", "flags"])
ticks_df['time'] = pd.to_datetime(ticks_df['time'], unit='s')
print(ticks_df)
このコードを実行することでティック情報を取得することができます。
ticks = mt5.copy_ticks_range("GBPJPY", datetime(2025, 10, 1, 0, 0), datetime(2025, 10, 1, 23, 59), mt5.COPY_TICKS_ALL)
ここでティック情報を取得していますが、4本値の取得とは別の関数を使っています。
今回は2025-10-01 00:00から2025-10-01 23:59までの24時間分のデータを取得しています。
4本値のときは時間軸を指定する必要がありましたが、ティック情報はその必要がありません。
「mt5.COPY_TICKS_ALL」は対象期間の全てのティックを要求する記述です。

Pythonの実行結果として、このような表形式のデータが取得できます。
時間のずれについて
先ほどの出力をよく確認すると、2025-10-01 00:00から2025-10-01 23:59までの24時間分のデータを取得するようにコードを書きましたが、結果は2025-9-30 15:00から2025-10-01 14:59までが表示されています。
ここからは、この時間のずれについて解説します。
- ※MQL5公式の該当ページからの引用
- Pythonがローカルな時間帯を使用する一方、MetaTrader 5ではティックとバー開始時間はUTC時間帯(シフトなし)で保存されます。
つまり、UTC基準とローカル時間の時差の分だけずれが生じることになります。
それではPython側で、これを解消するコードを追加します。
import MetaTrader5 as mt5
import pandas as pd
from datetime import datetime
import pytz
# MT5に接続
if not mt5.initialize():
print("MetaTrader5 initialize failed")
quit()
# ティックデータを取得
utc = pytz.UTC
ticks = mt5.copy_ticks_range("GBPJPY", datetime(2025, 10, 1, 0, 0, tzinfo=utc), datetime(2025, 10, 1, 23, 59, tzinfo=utc), mt5.COPY_TICKS_ALL)
# MT5との接続を切断
mt5.shutdown()
# 取得したティックデータをPandasデータフレームに変換
ticks_df = pd.DataFrame(ticks, columns=["time", "bid", "ask", "last", "volume", "flags"])
ticks_df['time'] = pd.to_datetime(ticks_df['time'], unit='s')
print(ticks_df)
pytzは各国のタイムゾーンを扱うライブラリです。
このライブラリを利用することで、Pythonのローカル時間に自動変換されないようにUTC基準で固定するコードに書き換えています。
この書き換えたコードを実行すると以下のような結果となります。

これで指定した開始時刻から終了時刻まで、ずれが発生しない状態でティック情報を取得することができました。
もし、データ取得後にローカル時間(この例では日本時間)に戻したいときは以下のコードを追加します。
# UTC → JST に変換
ticks_df['time_jst'] = ticks_df['time'].dt.tz_localize('UTC').dt.tz_convert('Asia/Tokyo')
ticks_df = ticks_df[['time', 'time_jst', "bid", "ask", "last", "volume", "flags"]].copy()

time_jstという列を追加して日本時間を入れています。
口座情報の取得
MT5 APIを利用するにあたって、口座情報が必要になる場合があります。

特に「残高」「有効証拠金」「余剰証拠金」などは、資金管理の観点からも確認したい項目です。
import MetaTrader5 as mt5
if not mt5.initialize():
print("initialize() failed, error code =",mt5.last_error())
quit()
# アカウント情報を取得
account_info_dict = mt5.account_info()._asdict()
# MT5との接続を切断
mt5.shutdown()
# 取得したアカウント情報を表示
print(account_info_dict['server']) # サーバ
print(account_info_dict['balance']) # 残高
print(account_info_dict['equity']) # 有効証拠金
print(account_info_dict['margin_free']) # 余剰証拠金
このコードでは「サーバ」「残高」「有効証拠金」「余剰証拠金」を取得し、表示しています。
account_info_dict = mt5.account_info()._asdict()
この記述で口座情報をまとめて取得し、確認したい内容に個別でアクセスしています。
print(account_info_dict['server']) # サーバ
print(account_info_dict['balance']) # 残高
print(account_info_dict['equity']) # 有効証拠金
print(account_info_dict['margin_free']) # 余剰証拠金

このような実行結果となり、各種口座情報を取得できていることが確認できます。
MT5 API解説シリーズ第3回となった本記事は、データの取得方法を解説しました。
第4回は、Pythonから注文を発注する方法について解説します。
本記事の執筆者:藍崎@システムトレーダー
| 本記事の執筆者:藍崎@システムトレーダー | 経歴 |
|---|---|
![]() |
個人投資家としてEA開発&システムトレード。 トレードに活かすためのデータサイエンス / 統計学 / 数理ファイナンス / 客観的なデータに基づくテクニカル分析 / 機械学習 / MQL5 / Python |
EA(自動売買)を学びたい方へオススメコンテンツ

OANDAではEA(自動売買)を稼働するプラットフォームMT4/MT5の基本的な使い方について、画像や動画付きで詳しく解説しています。MT4/MT5のインストールからEAの設定方法までを詳しく解説しているので、初心者の方でもスムーズにEA運用を始めることが可能です。またOANDAの口座をお持ちであれば、独自開発したオリジナルインジケーターを無料で利用することもできます。EA運用をお考えであれば、ぜひ口座開設をご検討ください。
本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。
