Pythonを使ってMT5で取得したデータをSql Serverデータベースに保存することができます。ここではSQLAlchemyを使った例を示します。
SQLAlchemyとは?
SQLAlchemyとは、Pythonからデータベースを操作するためのツール(ライブラリ)です。
ざっくり言えば、Pythonからデータベース(MySQL、PostgreSQL、SQL Server、SQLiteなど)にアクセスして、データの読み書きが簡単にできるようにするものです。
普通にデータベースを使おうとすると、SQL文(例:SELECT * FROM users
)を毎回自分で書く必要があります。
でもSQLAlchemyを使えば、Pythonコードで直感的にデータベースを操作できるようになります!
SQLAlchemyでできることの例
- データベースに接続
- データをテーブルに追加(INSERT)
- データを読み取り(SELECT)
- データを更新(UPDATE)
- データを削除(DELETE)
MT5で取得したデータをSQLAlchemyを使ってSQLServerデータベースに登録するプログラム例
import MetaTrader5 as mt5
import pandas as pd
from datetime import datetime
import pytz
import numpy as np
from sqlalchemy import create_engine
from sqlalchemy.types import DateTime, Float
#login , server ,password は MT5データ取得先サーバーの接続情報を記載してください
if mt5.initialize(login=00000000, server="servername",password="password") == False:
print (mt5.last_error())
exit()
timezone = pytz.timezone("Etc/UTC")
date_from = datetime(2025, 4, 1, 12,1, tzinfo=timezone) #2025/4/5 12:01
date_to = datetime(2025, 4, 1, 12, 9, tzinfo=timezone) #2025/4/5 12:09
ticks = mt5.copy_rates_range("USDJPY",mt5.TIMEFRAME_M1,date_from,date_to)
mt5.shutdown()
df = pd.DataFrame(ticks)
print(df)
df['time']=pd.to_datetime(df['time'], unit='s')
# 必要な列のみを残す tick_volume spread real_volume は削除
df = df[['time', 'open', 'high', 'low', 'close']]
# 列名をデータベースのテーブルに合わせる
df.rename(columns={
'time': '日付',
'open': '始値',
'high': '高値',
'low': '安値',
'close': '終値'
}, inplace=True)
# SQLAlchemyエンジンの作成
connection_string = 'mssql+pyodbc://localhost/為替情報?driver=ODBC+Driver+17+for+SQL+Server&trusted_connection=yes'
engine = create_engine(connection_string)
# データをデータベースに挿入
df.to_sql('USDJPY', con=engine, if_exists='append', index=False, dtype={
'日付': DateTime(),
'始値': Float(),
'高値': Float(),
'安値': Float(),
'終値': Float()
})
使っている主なライブラリ
MetaTrader5:MT5からデータを取ってくるためのライブラリ。
※PythonでMetaTrader5に接続する方法の解説はこちらを参照してください。
pandas:表形式のデータ(エクセルみたいなやつ)を扱う便利ツール。
datetime:日時を扱うためのモジュール。
pytz:時間帯(タイムゾーン)をちゃんと扱うためのライブラリ。
sqlalchemy:Pythonからデータベースに接続するためのライブラリ。
プログラムの流れ
MetaTrader 5 に接続する
if mt5.initialize(login=00000000, server="servername",password="password") == False:
print(mt5.last_error())
exit()
MT5にログインしています。IDとサーバー情報、パスワードを使って接続します。失敗したらエラーを出して終了します。
取得したい時間の設定
timezone = pytz.timezone("Etc/UTC")
date_from = datetime(2025, 4, 1, 12, 1, tzinfo=timezone)
date_to = datetime(2025, 4, 1, 12, 9, tzinfo=timezone)
欲しい為替データの期間を指定しています。ここでは、2025年4月1日の12:01〜12:09(UTC時間)です。
為替データの取得
ticks = mt5.copy_rates_range("USDJPY", mt5.TIMEFRAME_M1, date_from, date_to)
mt5.shutdown()
データをpandasのDataFrameに変換
df = pd.DataFrame(ticks)
df['time'] = pd.to_datetime(df['time'], unit='s')
MT5から来た生のデータを、pandasの表形式に変換して、日時を人間が読める形式に直します。
データベース接続の準備
connection_string = 'mssql+pyodbc://localhost/為替情報?driver=ODBC+Driver+17+for+SQL+Server&trusted_connection=yes'
engine = create_engine(connection_string)
SQL Serverの「為替情報」というデータベースに接続する準備をしています。
データをデータベースに保存
df.to_sql('USDJPY', con=engine, if_exists='append', index=False, dtype={
'日付': DateTime(),
'始値': Float(),
'高値': Float(),
'安値': Float(),
'終値': Float()
取得したデータを、USDJPY
というテーブルに保存しています。すでにあるデータに「追記」される形(append)です。
実行結果
前提条件
既にSQLServerがインストール済であること
「為替情報」というデータベース及び 「USDJPY」というテーブルが既に存在していること
まとめ
このプログラムはこういう流れです:
- MT5にログイン
- 欲しい時間の為替データ(USDJPY)を指定
- そのデータを取ってきて
- 見やすい形に加工して
- SQL Serverのデータベースに保存!