【MT5 API入門⑥】テクニカル指標を計算してチャートにインジケーターを表示する方法
この記事では、Pythonでテクニカル指標を計算する方法を解説します。
移動平均線やボリンジャーバンド、RSIのようなテクニカル指標は、MT5でも計算することは可能ですが、今回はMT5からチャートデータ(4本値)を取得して、Pythonでさまざまなテクニカル指標を計算することを想定して解説します。
相場の分析を行ったり、システムトレード戦略を構築するにあたって、数値化されたテクニカル指標を扱うことは一般的に有効な手段の1つとして利用できます。
計算を行う前にチャートデータを取得しておく必要があるため、ここではMT5 APIでUSDJPYの1時間足のデータを取得するPythonコードを掲載しておきます。
以前の記事「【MT5 API入門③】PythonでMT5からデータを取得する方法」で、データの取得方法を詳しく説明しています。
※この記事はAPIトレードに関する知識を提供することを目的としています。技術的なお問い合わせは受け付けておりません。技術的な課題はお客様ご自身で解決をお願いいたします。
import pandas as pd
import MetaTrader5 as mt5
from datetime import datetime
import pytz
# MT5に接続
if not mt5.initialize():
print("MetaTrader5 initialize failed")
quit()
# レート情報を取得
utc = pytz.UTC
rates = mt5.copy_rates_range("USDJPY", mt5.TIMEFRAME_H1, datetime(2025, 1, 1, tzinfo=utc), datetime(2025, 12, 31, tzinfo=utc))
# MT5との接続を切断
mt5.shutdown()
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')
rates_df = rates_df.set_index("time")
このコードで取得したデータは、下記のように日時と4本値のデータにティックボリュームやスプレッドなどの情報が追加された形式となります。

今回は、このデータを使ってテクニカル指標の計算を行っていきます。
テクニカル指標計算ライブラリ「TA-Lib」
TA-Libとは、Python等で移動平均線やボリンジャーバンド、RSIのようなさまざまなテクニカル指標を計算するためのライブラリです。
ライブラリを用いて計算できるテクニカル指標の一覧は公式ページで確認できます。
ライブラリを使用するためには、事前にインストールが必要です。
pip install ta-lib
移動平均線を計算する
まずは、20期間の単純移動平均線を計算していきます。
import talib
rates_df["SMA_20"] = talib.SMA(rates_df["close"], timeperiod=20)

短いコードですが、これで「rates_df」に「SMA_20」という名前の列を作成し、20期間の単純移動平均線の計算結果を格納しています。
talib.SMA(rates_df["close"], timeperiod=20)
このコードで以下の3つの情報を記述しています。
- ●テクニカル指標の指定(SMA)
- ●計算対象のデータの指定(rates_df[“close”])
- ●計算期間の設定(timeperiod=20)
計算結果を可視化する
金融データの可視化ライブラリ「mplfinance」を用いてローソク足チャートと先ほど計算した単純移動平均線を可視化します。
import mplfinance as mpf
# SMA_20の追加プロットを作成
sma_plot = mpf.make_addplot(
rates_df["SMA_20"].tail(300),
color="blue",
width=1.0
)
# --- チャート描画 ---
mpf.plot(
rates_df.tail(300), # 直近300本分を可視化
type="candle",
style="yahoo",
title="USDJPY H1",
addplot=sma_plot,
figratio=(16, 8)
)

コードを実行すると、ローソク足チャート上に先ほど計算した単純移動平均線SMA(20)を表示することができます。
細かい数値のチェックは省略しますが、ローソク足と移動平均線の位置関係から正しい計算結果を得られていることがわかります。
ボリンジャーバンドを計算する
次にボリンジャーバンドを計算します。
import talib
upper, middle, lower = talib.BBANDS(
rates_df["close"], timeperiod=20, nbdevup=2, nbdevdn=2, matype=0
)
rates_df["BB_upper"] = upper
rates_df["BB_middle"] = middle
rates_df["BB_lower"] = lower
ボリンジャーバンドの計算は「BBANDS」という関数を使用します。
引数の意味は、下記の通りです。
- ●timeperiod:計算期間
- ●nbdevup:上側バンドの偏差
- ●nbdevdn:下側バンドの偏差
- ●matype:使用する移動平均の種類
移動平均線の種類について
| 値 | 移動平均タイプ | 名称 |
|---|---|---|
| 0 | SMA | 単純移動平均 |
| 1 | EMA | 指数平滑移動平均 |
| 2 | WMA | 加重移動平均 |
| 3 | DEMA | 二重指数移動平均 |
| 4 | TEMA | 三重指数移動平均 |
| 5 | TRIMA | 三角移動平均 |
| 6 | KAMA | カウフマン適応移動平均 |
| 7 | MAMA | メサ適応移動平均 |
| 8 | T3 | T3移動平均 |
コード内の引数として値を指定することでボリンジャーバンドの中心線(移動平均線)の計算方法を変更することができます。
特にこだわりがないときは「matype」を省略することも可能です(省略した場合は単純移動平均線が選択されます)。
計算結果を可視化する
import mplfinance as mpf
# --- 各ラインの追加プロット作成 ---
bb_upper_plot = mpf.make_addplot(
rates_df["BB_upper"].tail(300),
color="green",
width=0.8,
linestyle="--",
label="BB_upper_+2σ"
)
bb_middle_plot = mpf.make_addplot(
rates_df["BB_middle"].tail(300),
color="green",
width=0.8,
linestyle="-",
label="BB_middle"
)
bb_lower_plot = mpf.make_addplot(
rates_df["BB_lower"].tail(300),
color="green",
width=0.8,
linestyle="--",
label="BB_lower_-2σ"
)
# --- チャート描画 ---
mpf.plot(
rates_df.tail(300), # 直近300本分
type="candle",
style="yahoo",
title="USDJPY H1",
addplot=[bb_upper_plot, bb_middle_plot, bb_lower_plot],
figratio=(16, 8)
)

ボリンジャーバンドのように複数のラインを同時に描画する場合は、「mpf.make_addplot」を複数(この場合は3本分)作成し、「mpf.plot」の引数として
addplot=[bb_upper_plot, bb_middle_plot, bb_lower_plot]
というようにリストで渡すことで、描画することができます。
RSIを計算する
続いてRSIを計算するコードを確認していきましょう。
import talib
rates_df["RSI_14"] = talib.RSI(rates_df["close"], timeperiod=14)
ボリンジャーバンドは計算結果が上側バンド、中心線、下側バンドの3つであったのに対して、RSIはSMAと同様に計算結果が1つなので、計算結果を直接「rates_df[“RSI_14”]」に入れています。
引数は期間のみです。
計算結果を可視化する
import matplotlib.pyplot as plt
import mplfinance as mpf
# --- 追加プロット(RSIを別軸に表示)---
rsi_plot = mpf.make_addplot(
rates_df["RSI_14"].tail(300),
panel=1, # panel=1 → 2段目(0がローソク足、1がRSI)
color="purple",
width=1.0,
label="RSI(14)"
)
# --- チャート描画 ---
fig, axes = mpf.plot(
rates_df.tail(300),
type="candle",
style="yahoo",
title="USDJPY H1",
addplot=rsi_plot,
figratio=(16, 8),
returnfig=True
)
# RSIパネルを取得して閾値線を追加
axes[2].axhline(70, color="gray", linestyle="--", linewidth=0.8)
axes[2].axhline(30, color="gray", linestyle="--", linewidth=0.8)
axes[2].set_ylim(0, 100)
plt.show()

これまでの移動平均線やボリンジャーバンドと同様に、「mpf.make_addplot」を設定しますが、RSIはチャートと重ねて表示するのではなく別のウインドウに表示するため、専用に設定する必要があります。
「panel=1」と引数を指定することで、「別ウインドウに表示する」という指定ができます。
また、RSIは70と30に閾値としての水平線を表示することが一般的であるため、そのコードを最後に記述しています。
axes[2].axhline(70, color="gray", linestyle="--", linewidth=0.8)
axes[2].axhline(30, color="gray", linestyle="--", linewidth=0.8)
さらにRSI用のウインドウは100から0までの範囲を表示することが一般的であるため、描画する範囲を指定しています。
axes[2].set_ylim(0, 100)
今回は、基本的な移動平均線、複数の計算結果を持つボリンジャーバンド、別ウインドウに表示するRSIの3つのテクニカル指標の計算と可視化の方法を解説しました。
TA-Libには他にもさまざまなテクニカル指標が用意されていますが、今回解説した基本的な扱い方を知っていれば、同じような方法で任意のテクニカル指標を扱うことができるようになります。
【MT5 API入門】
- ・【MT5 API入門①】MT5 APIとPythonを接続したシステムトレードの基礎知識
- ・【MT5 API入門②】PythonとMT5を接続する方法
- ・【MT5 API入門③】PythonでMT5からデータを取得する方法
- ・【MT5 API入門④】PythonからMT5の新規注文と決済注文を実行
- ・【MT5 API入門⑤】Pythonでローソク足チャートを表示する方法
- ・【MT5 API入門⑥】テクニカル指標を計算してチャートにインジケーターを表示する方法
本記事の執筆者:藍崎@システムトレーダー
| 本記事の執筆者:藍崎@システムトレーダー | 経歴 |
|---|---|
![]() |
個人投資家としてEA開発&システムトレード。 トレードに活かすためのデータサイエンス / 統計学 / 数理ファイナンス / 客観的なデータに基づくテクニカル分析 / 機械学習 / MQL5 / Python |
EA(自動売買)を学びたい方へオススメコンテンツ

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