【コラム】MT5×Python #2 — データを DataFrame とチャートに¶
#1 で MT5 と Python がつながったら、次は ヒストリカル足を表にして扱う段階です。スプレッドシートに近い pandas.DataFrame に載せれば、集計や可視化の選択肢が一気に広がります。
この記事の3行まとめ
mt5.copy_rates_*で取ったレートをpandas.DataFrameにする- 例として
mt5_rates_to_dataframe.pyで CSV と終値の PNG をまとめて出せる - チャートで 週末が「まっすぐ」に見えるのは、休場のあいだも線でつないでいるため(抜けているわけではない)
1. 前提(#1 のおさらい)¶
- MT5 ターミナルが起動し、対象銘柄が Market Watch に載っている(または取得可能な状態)。
- 仮想環境を有効化し、
MetaTrader5がimportできる。 - 必要なら #1 の
test_mt5.pyで一度つながりを確認しておく。
この記事ではさらに pandas と matplotlib を使います。未導入なら仮想環境内で次のように入れてください。
2. レートを DataFrame にする、ということ¶
MT5 から返ってくるレートは、たとえば copy_rates_from_pos だと 構造体の配列です。これをそのまま pd.DataFrame(rates) に渡すと、列として time・open・high・low・close・tick_volume などが並びます。
time は UNIX 秒(UTC)なので、読みやすくするなら pd.to_datetime(..., unit="s", utc=True) で日時列に変換するのが一般的です。以降、「いつの足か」を日本時間で考えたい場合は、別途 +9 時間するなどの変換が必要になります。
3. スクリプトで CSV とチャートを一気に出す¶
まず、今回使うスクリプトをダウンロードして scripts\research\ に配置してください。
mt5_rates_to_dataframe.py をダウンロード
mt5_rates_to_dataframe.py の流れです。
mt5.initialize()で接続。copy_rates_from_pos(銘柄, 時間足, 開始位置, 本数)などで足を取得。DataFrameにし、timeを日時に直す。to_csvで CSV、matplotlibで終値を折れ線にして PNG 保存。
プロジェクトのルートで、仮想環境を有効化したうえで例えば次のように実行します(パスは環境に合わせてください)。
銘柄や本数を変えたいときの例です。
出力先を変えたいときは --out にフォルダを指定します(なければ作成される想定です)。
成功すると、指定フォルダに 銘柄_H1_本数.csv と、終値だけを描いた 同じ名前_close.png のようなファイルが並びます。ターミナルに head 数行が出れば、中身のイメージもつかみやすいです。

うまく取れないとき
- 銘柄名はブローカー表示と一致させる(
USDJPYとUSDJPY.のような違いに注意)。 - Market Watch に無い銘柄は取得できないことがあります。
- 週末・メンテ時間はデータが薄い・空に近いことがあります。
4. チャートの「見え方」について¶
時刻はスクリプトの例によっては 軸ラベルが UTC になっています。生活の時刻と突き合わせるときは、9 時間ずれているのはおかしいのではなく、基準が違うと思うと混乱が減ります。
週末について。外国為替は週末に取引が止まるため、土日のバーが無いのが普通です。それでも matplotlib の折れ線チャートでは、金曜の終値と月曜の始値のあいだを、線でつなぐので、グラフ上は まっすぐな対角線のように見えることがあります。これは 「週末も動いた」という意味ではなく、描画の都合です。分析するときは、CSV の time 列を見て欠損を確認するほうが確実です。
次回予告¶
#3 では ストラテジーテスターに触れます。軽い EA(EA_Smoke_LightMA_v1)でバックテストを実行し、HTML を保存する流れです。あわせて「公式 Python API ではテスターを起動できない」点を押さえます(HTML を Python で読むのは #4)。
免責の一文¶
本記事は検証・学習用の技術メモであり、投資助言ではありません。FX には損失リスクがあります。最終判断はご自身の責任でお願いします。