【MT5 API入門④】PythonからMT5の新規注文と決済注文を実行
この記事は、「MT5 APIではじめるPythonシステムトレード入門」シリーズの第4回です。
第3回の記事では、PythonでMT5からデータを取得する方法を解説しました。
今回はMT5 APIで新規注文・決済注文を行う方法を解説します。
※この記事はAPIトレードに関する知識を提供することを目的としています。技術的なお問い合わせは受け付けておりません。技術的な課題はお客様ご自身で解決をお願いいたします。
注文操作の概要
前回までの記事で、MT5 APIはPythonとローカルPC上のMT5アプリケーションをつなぐインターフェースであると説明しました。
FXのシステムトレードを行う方法には、主に「MT5 APIを使う場合」「ブローカー独自のAPIを使う場合」「MT5内のプログラム(EA)を使う場合」の3つがあり、それぞれ注文の流れが異なっています。

この記事で解説する「MT5 APIを使う方法」は、Pythonで注文するためのコードを実行しますが、あくまでも「MT5の操作をPythonプログラムによって自動化している」という点を押さえておきましょう。
事前にやっておくMT5の設定
MT5 APIを利用するときは、事前にMT5側でPythonからの操作を許可しない設定を解除しておく必要があります。
MT5の「ツール」→「オプション」→「エキスパートアドバイザー」で、以下の設定を行ってください。
- ● 「アルゴリズム取引を許可」にチェックを入れる
- ● 「外部Python APIを介したアルゴリズム取引を無効にする」のチェックを外す

接続サーバを事前に確認する
注文するコードを動作させる前に、安全のためPythonがMT5と接続された際にどのサーバにつながっているかを確認するコードを書いていきましょう。
特にプログラムの動作を確認したいときや、プログラミングの勉強中は、意図しない注文操作を実行してしまうことも十分に考えられます。
大切な資金をプログラミングのミスで失わないためにも、本番口座につなげるのはしっかりと動作確認を終えてからにしましょう。
開発中や練習中は、デモ口座につなげておくことが大切です。
import MetaTrader5 as mt5
# --- 許可するサーバ名を定義 ---
ALLOWED_SERVER = "OANDA-Japan MT5 Demo"
if not mt5.initialize():
print("initialize() failed, error code =",mt5.last_error())
quit()
# アカウント情報を取得
account_info_dict = mt5.account_info()._asdict()
server_name = account_info_dict['server']
# デモ口座につながっていることを確認
if server_name != ALLOWED_SERVER:
print(f"接続先が許可されたサーバ '{ALLOWED_SERVER}' ではありません。システムを終了します。")
mt5.shutdown()
quit()
print(f"正常に '{ALLOWED_SERVER}' に接続しました。")
# ------------------------------------------------ #
# 今後ここにシステムトレードのロジックなどを記述していく
# ------------------------------------------------ #
# MT5との接続を切断
mt5.shutdown()
このコードは、接続したMT5のサーバがあらかじめ指定したサーバではなかったときにプログラムが途中で停止するように書いています。
ここでは”OANDA-Japan MT5 Demo”につながっていないときにプログラムが停止するように制御しています。
新規注文を出す
それでは実際にMT5で新規注文を出すPythonプログラムを実行してみましょう。
import MetaTrader5 as mt5
# MT5に接続
if not mt5.initialize():
print("MetaTrader5 initialize failed")
quit()
# 注文のシンボルと注文価格の設定
symbol = "USDJPY"
price = mt5.symbol_info_tick(symbol).ask
# 成行注文用のトレードリクエストを作成
trade_request = {
"action": mt5.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": 0.1,
"type":mt5.ORDER_TYPE_BUY,
"price": price,
"deviation": 20,
"magic": 123456789,
"type_time": mt5.ORDER_TIME_GTC
}
# 注文を送信
result = mt5.order_send(trade_request)
if result.retcode != mt5.TRADE_RETCODE_DONE:
print("Order failed, retcode =", result.retcode)
else:
print("Order successfully placed with ticket #", result.order)
# MT5との接続を切断
mt5.shutdown()
mt5.order_sendで注文を送信していますが、その引数としてtrade_requestという構造体に各種注文に必要な情報を入れています。
このコードでは以下のような内容で注文しています。
| 注文情報 | 内容 |
|---|---|
| アクション | 成行注文 (mt5.TRADE_ACTION_DEAL) |
| 通貨ペア | USDJPY |
| ロット数 | 0.1 |
| 注文タイプ | 成行買い注文 (mt5.ORDER_TYPE_BUY) |
| 注文価格 | Ask (mt5.symbol_info_tick(symbol).ask) |
| スリッページ | 20 |
| マジックナンバー | 123456789 |
| 有効期間 | 手動でキャンセルされるまで (mt5.ORDER_TIME_GTC) |
注文内容は他にも、指値や逆指値、SL(損切りレート)やTP(利益確定レート)、未決済注文の内容変更などが可能です。
詳しい項目はMQL5公式ページから確認可能です。
上記の注文コードを実行すると、MT5から注文が送られます。
約定すれば、MT5の取引画面でポジションを確認できます。

エラーが出て注文できない場合
上記の注文コードでは、注文が失敗したときに、次のコードを実行するように記述しています。
print("Order failed, retcode =", result.retcode)
なぜエラーが発生したのかを調べるために、result.retcodeでエラーコードを取得しています。
こちらでエラーの内容を確認しましょう。
よくある注文エラーとして、約定方式の指定があります。
MT5のシステムトレードでは、約定方式を指定して注文できますが、ブローカーによってはこの指定する記述が必須となります。
約定方式はブローカーごとに異なるため、事前に調べて適切な方式を指定する必要があります。
MT5で「気配値表示」を右クリック→「銘柄一覧」を選択すると「銘柄」ウインドウが表示され、取引したい通貨ペアを選択すると下に通貨ペアの情報が表示されます。
その中から「約定」の行に注目すると約定方式が確認できます。

確認し終えたら、コード内の注文情報を入力する構造体の中に約定方式(type_filling)を追加します。
# 成行注文用のトレードリクエストを作成
trade_request = {
"action": mt5.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": 0.1,
"type": mt5.ORDER_TYPE_BUY,
"price": price,
"deviation": 20,
"magic": 123456789,
"type_time": mt5.ORDER_TIME_GTC,
"type_filling": mt5.ORDER_FILLING_IOC
}
type_fillingとして約定方式(ここでは「mt5.ORDER_FILLING_IOC」)を正しく指定することでエラーが解消される可能性があります。
決済注文を出す
決済注文は、先ほどの新規注文とほとんど同じコードを書いて実行します。
新規注文との違いは、ポジションチケット(ID)を指定していること、新規注文とは反対売買になっていることの2点です。
実際のコードを確認しましょう。
import MetaTrader5 as mt5
# MT5に接続
if not mt5.initialize():
print("MetaTrader5 initialize failed")
quit()
# 注文のシンボルと注文価格の設定
symbol = "USDJPY"
price = mt5.symbol_info_tick(symbol).bid
# 決済注文用のトレードリクエストを作成
trade_request = {
"action": mt5.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": 0.1,
"type": mt5.ORDER_TYPE_SELL,
"position": 8127787,
"price": price,
"deviation": 20,
"magic": 123456789,
"type_time": mt5.ORDER_TIME_GTC,
"type_filling": mt5.ORDER_FILLING_IOC
}
# 注文を送信
result = mt5.order_send(trade_request)
if result.retcode != mt5.TRADE_RETCODE_DONE:
print("Order failed, retcode =", result.retcode)
else:
print("Order successfully placed with ticket #", result.order)
# MT5との接続を切断
mt5.shutdown()
ポジションチケットはMT5の取引画面で確認することができます。

買いポジションであれば、ポジションチケットを指定して売り注文を出すコードに書き換えることで、決済注文を実行できます。
保有中のポジションを確認する
決済注文にはポジションチケットが必要で、MT5の取引画面で確認する方法を紹介しましたが、Python側からも確認できます。
import MetaTrader5 as mt5
import pandas as pd
# MT5に接続
if not mt5.initialize():
print("MetaTrader5 initialize failed")
quit()
# ポジション情報を取得
positions = mt5.positions_get()
# ポジション情報をPandas DataFrameに変換
positions_dict = []
for position in positions:
positions_dict.append({
'ticket': position.ticket,
'time': pd.to_datetime(position.time, unit='s'),
'symbol': position.symbol,
'type': position.type,
'volume': position.volume,
'price_open': position.price_open,
'sl': position.sl,
'tp': position.tp,
'price_current': position.price_current,
'profit': position.profit,
'swap': position.swap,
'comment': position.comment,
'magic': position.magic
})
positions_df = pd.DataFrame(positions_dict)
# MT5を終了
mt5.shutdown()
print(positions_df)
このコードではMT5から現在保有中の全ポジションを取得して、pandasデータフレームに変換しています。
実行結果は以下のようになり、ポジションチケットを含むポジション情報を取得することができます。

今回でMT5 APIの基本的な操作の解説は最後になります。
次回以降は、Pythonを使ったシステムトレードに関わる操作方法や分析方法、戦略構築といった内容に少しずつ発展させて紹介していきます。
【MT5 API入門】
- ・【MT5 API入門①】MT5 APIとPythonを接続したシステムトレードの基礎知識
- ・【MT5 API入門②】PythonとMT5を接続する方法
- ・【MT5 API入門③】PythonでMT5からデータを取得する方法
- ・【MT5 API入門④】PythonからMT5の新規注文と決済注文を実行
本記事の執筆者:藍崎@システムトレーダー
| 本記事の執筆者:藍崎@システムトレーダー | 経歴 |
|---|---|
![]() |
個人投資家としてEA開発&システムトレード。 トレードに活かすためのデータサイエンス / 統計学 / 数理ファイナンス / 客観的なデータに基づくテクニカル分析 / 機械学習 / MQL5 / Python |
EA(自動売買)を学びたい方へオススメコンテンツ

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