Python(SQLAlchemy)でMT5取得データをSQLServerに保存

Pythonのプログラム例

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」というテーブルが既に存在していること

まとめ

このプログラムはこういう流れです:

  1. MT5にログイン
  2. 欲しい時間の為替データ(USDJPY)を指定
  3. そのデータを取ってきて
  4. 見やすい形に加工して
  5. SQL Serverのデータベースに保存!
タイトルとURLをコピーしました