MT5自動売買をAIで作る|EA作成・バックテスト・デモ実行まで完全ガイド
この記事のゴール
この記事を終えると、以下のことができるようになります:
- 自分のトレードルールをAIに伝えて、自動売買スクリプトを作成できる
- 過去のデータでバックテストを行い、戦略の成績を検証できる
- 検証した戦略をデモ口座で実行し、動作を確認できる
すべてClaude Codeへの日本語指示だけで進めます。前回の価格取得編の環境がセットアップ済みであることを前提とします。
自動売買の全体像
自動売買を始めるまでの流れは、以下の4ステップです。
|
Step 1 ルールを決める |
→ |
Step 2 AIにコード化してもらう |
→ |
Step 3 バックテストで検証 |
→ |
Step 4 デモ口座で実行 |
一番大切なのはStep 1の「ルールを決める」です。AIはコードを書いてくれますが、どんな戦略でトレードするかを決めるのは自分自身です。
なぜMQL5ではなくPythonを使うのか
MT5の自動売買といえば、MT5に組み込みの言語であるMQL5でEA(エキスパートアドバイザー)を作るのが一般的です。本シリーズではMQL5ではなくPythonを使ってMT5を外部から操作するアプローチを採用しています。その理由をご説明します。
MQL5でもAI連携はできる
MQL5にもWebRequest()という関数があり、HTTP通信を行うことは可能です。つまり、MQL5からAIのAPIを呼び出すこと自体は技術的にはできます。
ただし、JSONデータの解析や各AIサービスとの連携を自力で実装する必要があり、実用的なコードを書くにはかなりの手間がかかります。
Pythonを選ぶ理由
Pythonには、AI各社が提供する公式ライブラリ(SDK)が揃っています。たとえばClaude APIやOpenAI APIとの連携は、ライブラリをインストールして数行のコードを書くだけで完了します。
また、本シリーズでは今後、以下のようなツールを構築していきます:
- GUIトレードダッシュボード
- LINE / Telegram への通知
- モバイルアプリとの連携
- AIによる相場分析
- データの可視化・レポート生成
これらはすべてPythonのエコシステム(豊富なライブラリや外部サービスとの連携機能)が前提となっており、MQL5だけで実現するのは現実的ではありません。MT5の「外」に広がるツールを作るのが本シリーズの目的であるため、Pythonが最適な選択肢となります。
Pythonを使うデメリット
一方で、Pythonを使うアプローチには以下のデメリットもあります:
注文の実行速度
PythonからMT5へはプロセス間通信を経由するため、MT5内部で直接動くMQL5のEAと比べるとわずかにレイテンシー(遅延)が発生します。ミリ秒単位の執行速度が求められるスキャルピング等の戦略には、MQL5の方が適しています。
MT5のストラテジーテスターが使えない
MQL5のEAはMT5に組み込まれた高機能なストラテジーテスター(ティックレベルのバックテスト、最適化機能など)を利用できますが、Pythonスクリプトではこの機能を直接使うことができません。Pythonでのバックテストは自前で構築する形になります。
常時起動の要件
PythonスクリプトとMT5の両方が起動している必要があります。MQL5のEAであればMT5だけで完結します。
まとめ:使い分けの考え方
MQL5が向いているケース — 超高速な注文執行が必要な戦略、MT5のストラテジーテスターをフル活用したい場合
Pythonが向いているケース — AIとの連携、外部サービスとの統合、GUIやモバイルアプリの構築、データ分析・可視化など、MT5の外に広がるツールを作りたい場合
Step 1:トレードルールを決める
まずは、シンプルなルールから始めましょう。この記事では、テクニカル分析の基本である移動平均線のクロス戦略を例にします。
今回のトレードルール:
- 対象銘柄:ドル円(USDJPY)
- タイムフレーム:1時間足
- 買いエントリー:20期間移動平均線が50期間移動平均線を上抜けたとき(ゴールデンクロス)
- 売りエントリー:20期間移動平均線が50期間移動平均線を下抜けたとき(デッドクロス)
- ロット数:0.01ロット(最小単位)
- 決済:反対のシグナルが出たら決済してドテン
移動平均線のクロスとは?
移動平均線は、一定期間の終値の平均値をつないだ線です。短い期間の移動平均線(ここでは20期間)が長い期間の移動平均線(50期間)を下から上に抜けることをゴールデンクロスと呼び、上昇トレンドの始まりとされることがあります。逆に上から下に抜けることをデッドクロスと呼びます。
このルールはあくまで学習用の例です。実際のトレードでは、ご自身の分析や検証に基づいた戦略をお使いください。
Step 2:AIにコード化してもらう
ルールが決まったら、そのままClaude Codeに伝えます。
生成されたコードの中身を理解する必要はある?
すべてを理解する必要はありませんが、AIが生成したコードが自分の意図したルール通りになっているかを確認することは大切です。不明な部分があれば、Claude Codeに「この部分は何をしているの?」と聞けば日本語で説明してくれます。
Step 3:バックテストで検証する
コードができたら、過去のデータで戦略の成績を検証します。このバックテストは、実際のお金を使う前に、この戦略が過去どのような結果を出していたのかを確認する重要なステップです。
バックテストを実行する
結果をチャートで可視化する
数値やチャートを見ただけでは判断が難しい場合は、Claude Codeに「この結果を分析して、戦略の強みと弱みを教えて」と依頼すれば、各指標の解説と改善提案を出してくれます。
バックテストの主な指標
勝率 — 全取引のうち利益で終わった取引の割合
プロフィットファクター — 総利益 ÷ 総損失。1.0以上なら利益が出ている。一般に1.5以上が望ましいとされる
最大ドローダウン — 資産のピークからの最大下落幅。リスクの大きさの目安
平均利益/平均損失 — 勝ちトレードの平均利益と負けトレードの平均損失の比率。リスクリワード比とも呼ばれる
ルールを改善してみる
PF 0.99ではほぼトントンです。ここから、AIとの対話を繰り返しながら戦略を改善していきます。ルールの変更 → バックテスト → 結果確認のサイクルを回すのが基本的な流れです。
改善①:損切り・利確を追加する
まず、損切り(ストップロス)と利確(テイクプロフィット)をpips単位で指定して追加します。複数パターンを比較してもらいましょう。
改善②:MA期間を最適化する
次に、移動平均線の期間(20/50)が本当に最適なのか、他の組み合わせも試してみます。
改善③:RSIフィルターを追加する
最後に、RSI(相対力指数)をフィルターとして追加します。買われすぎ・売られすぎの状態でエントリーしないようにすることで、不利なタイミングでの取引を減らします。
改善結果のまとめ
3段階の改善で、戦略のパフォーマンスがどう変化したかを振り返ります。
| ステップ | 設定 | PF | 総損益 | 最大DD |
|---|---|---|---|---|
| 初期 | MA(20/50)、SL/TPなし | 0.99 | -741円 | 16,350円 |
| +SL/TP | SL80pips / TP160pips追加 | 1.35 | +16,925円 | 10,922円 |
| +MA最適化 | MA(20/60)に変更 | 1.59 | +23,076円 | 9,184円 |
| +RSIフィルター | RSI<60で買い、RSI>40で売り | 1.77 | +11,232円 | 3,963円 |
PFは0.99から1.77へ、最大ドローダウンは16,350円から3,963円へと改善しました。日本語で改善の方向性を伝えるだけで、AIがコードの修正とバックテストを繰り返してくれるのがこのアプローチの強みです。
長期データで検証する
ただし、短い期間のデータだけで最適化すると、その期間にたまたまフィットしただけの「過剰最適化(オーバーフィッティング)」になるリスクがあります。MT5のAPIでは最大約8年分のH1データを取得できるので、期間を伸ばして検証してみます。
| ステップ | PF(16ヶ月) | PF(8年) | 総損益(8年) |
|---|---|---|---|
| 初期 | 0.99 | 1.09 | +29,441円 |
| +SL/TP | 1.35 | 1.17 | +46,417円 |
| +MA最適化 | 1.59 | 1.16 | +40,688円 |
| +RSIフィルター | 1.77 | 1.21 | +18,475円 |
期間を伸ばすとPFの数値は控えめになりますが、すべてのステップで1.0を超えており、改善の方向性自体は有効であることが確認できました。16ヶ月で1.77だった値が8年では1.21になるのは、過剰最適化の影響が含まれていることを示しています。こうした長期検証を行うことで、より現実に近い評価ができます。
バックテストの限界について
バックテストは過去のデータに基づく検証であり、将来も同じ結果が出ることを保証するものではありません。過去のデータに過度に最適化すると(オーバーフィッティング)、実際の相場では通用しない戦略になることもあります。バックテスト結果はあくまで参考として、十分なデモ取引での検証を行ってから実運用に移すことをお勧めします。
ティックデータでより精密に検証する
ここまでのバックテストでは1時間足のローソク足データを使用しました。1時間足では、その1時間の中で「高値と安値のどちらに先に到達したか」が分かりません。つまり、SL/TP両方に触れうる場面で、どちらが先に約定したかの判定が不正確になる可能性があります。
この問題を解決するのがティックデータ(すべての価格変動の記録)です。MT5のAPIにはティックデータを取得する機能があり、Claude Codeに「ティックデータを使ってバックテストして」と指示するだけで利用できます。
実際にティックデータ(約1,520万本)と1時間足でバックテスト結果を比較したところ、今回のSL80pips/TP160pipsの設定では結果は完全に一致しました。値幅が大きいSL/TP設定では、同じ足の中で両方に触れるケースがほぼ発生しないためです。一方、SL/TPを10〜20pips程度に狭くする場合は、ティックデータでの検証が重要になります。
なお、MT5で取得できるティックデータの期間はサーバーによって限られる場合があります(今回は約5ヶ月分)。OANDAでは過去のティックデータをダウンロードしてMT5にインポートすることもできます。詳しくは以下の記事をご参照ください:
OANDA Lab — MT5のティックデータの取得方法
Step 4:デモ口座で実行する
バックテストで一定の結果が確認できたら、デモ口座で実際に動かしてみます。
MT5の「アルゴリズム取引」をONにする
PythonからMT5に注文を送るには、MT5側でアルゴリズム取引を許可しておく必要があります。MT5のツールバーにある「アルゴリズム取引」ボタンをクリックして、有効(緑色の再生アイコン)にしてください。
この設定がOFFのままだと、Pythonから注文リクエストを送ってもMT5側で拒否されます。
重要:まずはデモ口座で
自動売買スクリプトをいきなりライブ口座(実際の資金)で動かすことは避けてください。コードのバグ、ネットワーク障害、想定外の相場変動など、予期せぬ事態でリスクが発生する可能性があります。必ずデモ口座で十分に動作確認を行ってください。
バックテスト用のスクリプトを実行用に変換するには、「実際にMT5で注文を出せる実行用スクリプトに変換して。1時間足が確定するたびにチェック、ログ出力あり、Ctrl+Cで停止可能にして」と指示します。変換が完了したら、そのまま実行できます。
デモ口座で動かす
スクリプトが起動すると、1時間足が確定するたびに最新のデータをチェックし、シグナルが発生した場合には自動的に注文を出します。注文が約定すると、MT5の「取引」タブにポジションが表示されるので、そちらでも確認できます。
一晩動かした結果
実際にこの戦略をデモ口座で一晩(約14時間)稼働させてみたところ、トレードは1回も発生しませんでした。1時間足のゴールデンクロス/デッドクロスは数日〜数週間に1回程度のイベントであるため、「自動売買が実際に注文を出す」体験をすぐに得るのは難しい状況です。
そこで、もっと短い時間軸で頻繁にトレードが発生する戦略も試してみることにしました。
短期戦略を試す — RSI逆張りスキャルピング
今度はRSI逆張りを15分足(M15)で試します。RSIが30を下回ったら「売られすぎ」と判断して買い、70を超えたら「買われすぎ」と判断して売る、というシンプルなルールです。15分足であれば1日に数回のシグナルが期待できます。
RSI逆張りスキャルピングのルール:
- 対象銘柄:ドル円(USDJPY)
- タイムフレーム:15分足(M15)
- 買いエントリー:RSI(14) が 30 を下回ったとき
- 売りエントリー:RSI(14) が 70 を超えたとき
- 決済:反対のシグナルが出たらドテン
MAクロス戦略と同じ手順(SL/TP追加 → フィルター → 長期検証)で改善していきます。
バックテストと改善
改善結果のまとめ
| ステップ | 設定 | PF | 取引回数 | 総損益 | 最大DD |
|---|---|---|---|---|---|
| ベース | RSI(14)<30/>70、SL/TPなし | 1.27 | 481回 | +18,160円 | 6,601円 |
| +SL/TP | SL20pips / TP20pips追加 | 1.05 | 1,075回 | +4,950円 | 7,406円 |
| +MAフィルター | MA(200)トレンドフィルター追加 | 1.26 | 330回 | +7,620円 | 1,752円 |
SL/TPの追加でPFが一時的に下がっていますが、これはリスク管理として1取引あたりの損失を限定する意味があります。MAフィルターを追加するとPFはさらに改善しますが、取引回数が1,075回から219〜330回に大きく減少します。今回はデモ口座で実際にトレードが発生する様子を確認したいので、あえて取引頻度の高いフィルターなし(SL20/TP20のみ)の設定を採用します。
長期データで検証する
MAクロスのときと同様に、長期データで過剰最適化のチェックを行います。
| 設定 | PF(10ヶ月) | PF(2年) | 総損益(2年) |
|---|---|---|---|
| フィルターなし | 1.05 | 0.95 | -18,040円 |
| +MA(50) | 1.33 | 1.19 | +5,260円 |
| +MA(100) | 1.16 | 1.09 | +5,800円 |
| +MA(200) | 1.26 | 0.99 | -650円 |
MAクロス戦略のときと同じく、短期間で最良だった設定が長期では劣化するパターンが確認できました。フィルターなしの設定は長期PF 0.95とやや厳しい結果ですが、1日約4.9回のトレード頻度があり、デモでの動作確認には最適です。実運用に向けてはMA(100)フィルター(長期PF 1.09)など、さらなる検証を重ねるのがよいでしょう。
デモ口座で実行する
RSI(14)<30/>70 + SL20/TP20をデモ口座で実際に動かしてみました。
4日間デモ口座で稼働させた結果がこちらです。
| # | 日時 | 方向 | 価格 | 結果 | 損益 |
|---|---|---|---|---|---|
| 1 | 7/2 09:21 | Buy | 162.548 | TP | +16円 |
| 2 | 7/2 13:00 | Buy | 162.461 | SL | -165円 |
| 3 | 7/2 15:02 | Buy | 162.263 | SL | -137円 |
| 4 | 7/2 15:47 | Buy | 162.058 | TP | +23円 |
| 5 | 7/2 16:00 | Buy | 161.863 | SL | -82円 |
| 6 | 7/2 16:15 | Buy | 161.642 | SL | -137円 |
| 7 | 7/2 16:44 | Buy | 161.442 | SL | -194円 |
| 8 | 7/2 17:06 | Buy | 161.234 | SL | -54円 |
| 9 | 7/2 17:48 | Buy | 161.033 | TP | +139円 |
| 10 | 7/2 18:07 | Buy | 161.224 | TP | +172円 |
| 11 | 7/2 19:23 | Buy | 161.426 | TP | +182円 |
| 12 | 7/2 21:30 | Sell | 161.059 | TP | +171円 |
| 13 | 7/3 04:15 | Sell | 161.080 | SL | -177円 |
| 14 | 7/3 08:45 | Sell | 161.343 | TP | +164円 |
| 15 | 7/3 12:45 | Buy | 161.190 | SL | -176円 |
| 16 | 7/3 14:30 | Buy | 161.060 | SL | -52円 |
| 17 | 7/3 15:45 | Buy | 160.741 | TP | +192円 |
| 18 | 7/3 16:38 | Buy | 160.977 | SL | -161円 |
| 19 | 7/3 19:45 | Sell | 161.131 | SL | -189円 |
| 20 | 7/4 00:05 | Sell | 161.336 | SL | -183円 |
フォワードテスト結果(4日間):
- 取引回数:20回(1日あたり約5回)
- 勝敗:8勝12敗(勝率 40%)
- 総損益:-648円
バックテスト(PF 1.05)とほぼ整合する結果で、やや負け越しとなりました。MAクロス戦略では一晩ゼロだったトレードが、15分足のRSI逆張りでは4日間で20回発生しており、自動売買スクリプトが実際にMT5を通じて注文を出し、SL/TPで自動決済される一連の動作を確認できました。
もちろん、4日間・20回の結果だけで戦略の良し悪しは判断できません。バックテストの長期検証でも確認した通り、フィルターなしの設定は長期的にはやや厳しい結果でした。実運用に向けてはMAフィルターの追加や、さらに別の戦略の検討など、継続的な検証が必要です。
もっと試してみたい方へ
移動平均線のクロス以外にも、さまざまな戦略をAIに実装してもらうことができます。以下は指示の例です。
| 戦略 | Claude Codeへの指示例 |
|---|---|
| ブレイクアウト | 「直近20本の高値を上抜けたら買い、安値を下抜けたら売り」 |
| RSI逆張り | 「RSIが30以下になったら買い、70以上になったら売り。損切り30pips」 |
| ボリンジャーバンド | 「ボリンジャーバンドの-2σにタッチしたら買い、+2σにタッチしたら売り」 |
| 時間帯フィルター | 「東京時間(9時〜15時)だけトレードするように制限して」 |
| 複数銘柄 | 「ドル円だけでなくユーロドルとゴールドも同じ戦略で同時に動かして」 |
自分のトレードアイデアを日本語で表現できれば、それがそのまま自動売買の戦略になります。
まとめ
この記事では、以下のことを行いました:
- シンプルなトレードルール(移動平均線クロス戦略)を定義した
- Claude Codeに指示してルールをコード化してもらった
- スプレッドコストを考慮したバックテストを実行し、結果をチャートで可視化した
- SL/TPの追加、MA期間の最適化、RSIフィルターの追加で、PFを0.99→1.77に改善した
- 8年分のデータで長期検証を行い、過剰最適化のリスクを確認した
- ティックデータと1時間足の精度差を比較検証した
- 検証した戦略をデモ口座で実行した — MAクロス(H1)は売買頻度が低いため、RSI逆張りスキャルピング(M15)も追加で検証し、実際にデモ口座でのトレード実行を確認した
コードは一行も書いていません。トレードルールを日本語で伝え、「こう改善して」と指示するだけで、バックテスト・最適化・検証・実行までを完了しました。
シリーズ記事一覧
本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。




