TradingView MT5 連携方法完全ガイド:Webhookアラートで自動売買(EA)を実現するアーキテクチャ設計
Photo by Maxim Hopman on Unsplash
最終更新: 2026年07月
結論から述べる。TradingViewとMT5は直接連携できない。 両者の間には必ずブリッジサーバーが必要であり、このアーキテクチャを理解せずに実装を始めると、時間と費用を無駄にする。本稿では、連携の全体構造から実装コード、ツール選定まで一気通貫で解説する。
アルゴリズム取引市場の規模は2024年時点で約123億3,448万USD(The Business Research Company)に達しており、先進国の株式取引量の70%以上をアルゴが占める時代になった(各種市場調査による2023年推計)。TradingViewの世界ユーザー数は1億人以上(TradingView公式)、国内でも広く利用されている。これだけの母数がいながら、「TradingViewのシグナルをMT5 EAに渡す」という実装を日本語で正確に解説したリソースはほぼ存在しない。MQL5コードサンプルがゼロ、Pine ScriptのJSONアラート例も皆無、というのが現状のSERP上の実態だ。
本稿はその空白を埋める。
TradingView→MT5連携の全体アーキテクチャ
アーキテクチャ全体像を先に押さえる。
TradingView (Pine Script)
│
│ ① HTTP POST (Webhook)
▼
ブリッジサーバー(クラウドまたはローカル)
│
│ ② ポーリング または WebSocket
▼
MT5 EA (MQL5 WebRequest)
│
│ ③ 注文命令 (OrderSend / trade.Buy等)
▼
ブローカー(注文執行)
この制約構造を頭に入れずに実装を始めると、後工程で必ず詰まる。
なぜ直接連携できないのか
MT5はHTTPサーバーとして機能できない。これはMQL5の根本的な仕様制約であり、外部からのPOSTリクエストを直接受信する口が存在しない。TradingViewのWebhookはHTTP POSTを送信する側であるため、受信側となるMT5に直接ぶつけることは技術的に不可能だ。
つまり、WebhookをMT5が扱える形に変換する中間層——ブリッジが不可欠だ。実装方式は2種類に絞られる。
| 方式 | 仕組み | 代表ツール | レイテンシ |
|---|---|---|---|
| クラウドポーリング | EAが定期的にクラウドAPIを叩いてシグナルを取得 | PineConnector, AlgoWay | ~250ms(後述) |
| ローカルブリッジ | ローカルアプリがWebhookを受信し、EAに渡す | Jumper, OSS Bridge | ~50ms以下(環境依存) |
TradingViewとMT5それぞれの機能詳細・使い分けの基準についてはTradingView vs MT5:2026年最新比較も参照されたい。
TradingViewアラート設定の詳細
プラン制限:Webhookは有料機能
TradingViewのWebhook送信機能はPlusプラン以上(月額$29.95〜)でのみ利用可能だ。Essentialプランでは一切使えない。この点は誤情報が流布しているので先に釘を刺しておく。
TradingViewプラン別アラート仕様:
| プラン | アラート上限数 | アラート有効期限 | Webhook |
|---|---|---|---|
| Essential | 20個 | 1ヶ月 | 不可 |
| Plus | 100個 | 2ヶ月 | 可 |
| Premium | 400個 | 2ヶ月 | 可 |
| Ultimate | 1,000個 | 無制限 | 可 |
TradingViewのプラットフォーム全体の機能・チャート設定についてはTradingView FX無料チャート分析完全ガイドで詳しく解説している。
Webhook設定の手順
TradingViewのアラート作成画面で以下を設定する。
- 条件: Pine Scriptのアラート条件式、またはインジケーターのクロス条件等を指定
- 通知タイプ: 「Webhook URL」にチェックを入れる
- Webhook URL: ブリッジサーバーのエンドポイント(例:
https://your-bridge.example.com/webhook) - メッセージ: 後述するJSONフォーマットを記述
TradingView Webhookの技術仕様:
- 送信方式: HTTP POST
- 対応ポート: 80(HTTP)および443(HTTPS)のみ
- タイムアウト: 3秒(超過でキャンセル)
- 送信元IPアドレス:
52.89.214.238/34.212.75.30/54.218.53.128/52.32.178.7
タイムアウト3秒は見落とされがちな制約だ。ブリッジサーバー側で3秒以内にレスポンスを返さないと、TradingViewはWebhookが失敗したと判断する。ブリッジの冗長性を設計するとき、この3秒が起点になる。
Pine ScriptでアラートメッセージにJSONを埋め込む方法
EAが確実にシグナルを解釈できるよう、アラートメッセージは構造化データで送る。JSONが実用上一択だ。
基本的なJSONアラートフォーマット
//@version=5
indicator("TV-MT5 Bridge Alert", overlay=true)
// エントリー条件(例:ゴールデンクロス)
fastMA = ta.sma(close, 9)
slowMA = ta.sma(close, 21)
longCondition = ta.crossover(fastMA, slowMA)
shortCondition = ta.crossunder(fastMA, slowMA)
// アラート送信:alert()関数でJSONを動的に構築
if longCondition
alert(
'{"action":"buy",' +
'"ticker":"' + syminfo.ticker + '",' +
'"price":' + str.tostring(close, "#.#####") + ',' +
'"lot":0.1,' +
'"sl":' + str.tostring(close * 0.99, "#.#####") + ',' +
'"tp":' + str.tostring(close * 1.02, "#.#####") + '}',
alert.freq_once_per_bar
)
if shortCondition
alert(
'{"action":"sell",' +
'"ticker":"' + syminfo.ticker + '",' +
'"price":' + str.tostring(close, "#.#####") + ',' +
'"lot":0.1,' +
'"sl":' + str.tostring(close * 1.01, "#.#####") + ',' +
'"tp":' + str.tostring(close * 0.98, "#.#####") + '}',
alert.freq_once_per_bar
)
このコードで生成されるJSONは以下の形式になる。
{
"action": "buy",
"ticker": "EURUSD",
"price": 1.08542,
"lot": 0.1,
"sl": 1.07457,
"tp": 1.10713
}
alert.freq_once_per_bar は同一バー内での重複アラートを防ぐ設定だ。高頻度アラートが必要な場合は alert.freq_all を使うが、ブリッジサーバーへの負荷とコストが増加する点を考慮すること。
MT5でWebhookシグナルを受信するEAの基本構造
先述のとおり、MT5はHTTPサーバーになれない。だからEA側がブリッジサーバーへ定期的にGETを投げ、待機中のシグナルを引き取る——いわゆる「ポーリング型」が現実的な構成だ。
MQL5 WebRequest関数の制約
実装前に把握すべき制約を列挙する。
- WebRequest関数は同期処理のみ(ブロッキング)
- EAとスクリプトでのみ使用可能。インジケーターからは呼び出し不可
- ストラテジーテスター内では実行不可(バックテストでは動作しない)
- MT5の「ツール→オプション→EA→WebRequestを許可するURLリスト」に事前登録必須
URLリストへの登録を忘れると、WebRequestは常にエラーを返す。この設定漏れが初心者の最初のつまずきポイントになる。
MQL5の基本文法・EAのイベント関数構造(OnInit/OnTick/OnDeinit)についてはFX EAの作り方:MQL5入門も合わせて確認しておくとよい。
ポーリング型EAの骨格コード(実装例)
以下が骨格コードだ。本番投入前に、エラーハンドリングと認証処理は必ず追加してほしい。
//+------------------------------------------------------------------+
//| TradingView-MT5 ポーリング型EA(実装例・骨格コード) |
//| ※実運用前に十分なテストと独自のリスク管理ロジックを追加すること |
//+------------------------------------------------------------------+
#property copyright "Example"
#property version "1.00"
#property strict
#include <Trade\Trade.mqh>
// --- パラメータ ---
input string BridgeURL = "https://your-bridge.example.com/signal";
input string ApiKey = "YOUR_API_KEY";
input int PollInterval = 5; // ポーリング間隔(秒)
input double LotSize = 0.1; // ロットサイズ(固定)
CTrade trade;
datetime lastPollTime = 0;
//+------------------------------------------------------------------+
//| EA初期化 |
//+------------------------------------------------------------------+
int OnInit()
{
// タイマー設定
EventSetTimer(PollInterval);
Print("Bridge EA 起動: ", BridgeURL);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| タイマーイベント:ブリッジサーバーをポーリング |
//+------------------------------------------------------------------+
void OnTimer()
{
// HTTPリクエストヘッダー
string headers = "Content-Type: application/json\r\n" +
"X-API-Key: " + ApiKey + "\r\n";
char result[];
string resultHeaders;
int timeout = 3000; // 3秒タイムアウト
// HTTP GETリクエスト送信
int res = WebRequest(
"GET",
BridgeURL,
headers,
timeout,
NULL,
result,
resultHeaders
);
if(res == 200)
{
// レスポンスをJSONとして解析
string jsonStr = CharArrayToString(result);
ProcessSignal(jsonStr);
}
else if(res == -1)
{
int err = GetLastError();
// エラー4014: URLが許可リストに未登録
if(err == 4014)
Print("エラー: URLを許可リストに追加してください → ツール→オプション→EA");
else
Print("WebRequest エラーコード: ", err);
}
}
//+------------------------------------------------------------------+
//| シグナル処理 |
//+------------------------------------------------------------------+
void ProcessSignal(string jsonStr)
{
// 簡易JSONパース(action フィールドを取得)
// ※本番環境では専用のJSONパーサーライブラリを使用すること
if(StringFind(jsonStr, "\"action\":\"buy\"") >= 0)
{
double sl = ExtractValue(jsonStr, "sl");
double tp = ExtractValue(jsonStr, "tp");
trade.Buy(LotSize, _Symbol, 0, sl, tp, "TV Signal Buy");
Print("BUY 注文執行: SL=", sl, " TP=", tp);
}
else if(StringFind(jsonStr, "\"action\":\"sell\"") >= 0)
{
double sl = ExtractValue(jsonStr, "sl");
double tp = ExtractValue(jsonStr, "tp");
trade.Sell(LotSize, _Symbol, 0, sl, tp, "TV Signal Sell");
Print("SELL 注文執行: SL=", sl, " TP=", tp);
}
else if(StringFind(jsonStr, "\"action\":\"close\"") >= 0)
{
// 全ポジション決済
for(int i = PositionsTotal() - 1; i >= 0; i--)
if(PositionGetSymbol(i) == _Symbol)
trade.PositionClose(PositionGetInteger(POSITION_TICKET));
}
}
//+------------------------------------------------------------------+
//| 簡易数値抽出(実装例・本番では堅牢なパーサーを使用) |
//+------------------------------------------------------------------+
double ExtractValue(string json, string key)
{
string searchKey = "\"" + key + "\":";
int pos = StringFind(json, searchKey);
if(pos < 0) return 0;
pos += StringLen(searchKey);
string sub = StringSubstr(json, pos, 20);
return StringToDouble(sub);
}
//+------------------------------------------------------------------+
//| EA終了処理 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
EventKillTimer();
}
免責事項(コードサンプルについて): 上記コードは教育目的の実装例であり、実際の取引における利益を保証するものではありません。MQL5コードの動作はブローカー環境・MT5バージョン・ネットワーク状況により異なります。実運用前には必ずペーパートレードによる十分な動作確認を行い、自己責任のもとで利用してください。
ブリッジツール比較:選定の判断軸
Photo by Scott Rodgerson on Unsplash
自前でブリッジを組む以外に、商用サービスとOSSが複数出揃っている。2026年時点の主要ツールを並べた。
| ツール | 月額 | 仕組み | MT5対応 | 日本語サポート | 特徴 |
|---|---|---|---|---|---|
| PineConnector | $26〜$106 | クラウド(WebSocket) | 対応 | 非対応 | 最もユーザー数が多い。設定がシンプル |
| AlgoWay | $6〜 | クラウド(WebSocket) | 対応(v2.xx) | 非対応 | コスト最安クラス |
| WebhookTrade | 要確認 | クラウド | 対応 | 一部対応 | 情報が少なく注意が必要 |
| Jumper(StellarWorks) | 要問合せ | ローカルアプリ+EA | 対応 | 対応(日本製) | 国内唯一の日本語サポート |
| TradingView-MT5-Bridge | 無料(OSS) | ローカル(Chrome拡張+Python) | 対応 | 非対応 | MIT License。技術力があれば費用ゼロ |
| 3Commas | 要公式確認 | クラウド | 非対応 | 一部対応 | 暗号資産向け。MT5には使えない |
| AutoView | 要公式確認 | ブラウザ拡張 | 非対応 | 非対応 | MT5未対応。選択肢から外れる |
選定の判断軸:
- コスト最小化: TradingView-MT5-Bridge(OSS)一択。ただしPythonとChrome拡張の管理コストが発生する
- 安定性・サポート重視: PineConnector。日本語サポートはないが、実績とドキュメントが豊富
- 日本語対応必須: Jumper(StellarWorks)。国内製のためサポート言語が日本語
- コストと安定性のバランス: AlgoWay。月額$6〜という価格帯でMT5対応済み
MQL5コードの設計やデバッグをAIと対話しながら進めたい場合は、Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら。hedgrow-fxはClaude AIをFX開発に特化した形で活用できる国内ツールで、Pine ScriptロジックのMQL5変換・EA設計の壁打ちに利用できる。
PineConnectorのレイテンシ実績値
PineConnectorが公開している数値によれば、サーバー処理16ms+送信131ms+EA処理約100msで、合計約250ms以内の執行レイテンシが報告されている。スキャルピングには不向きだが、数分足以上の戦略であれば実用上問題ない水準だ。
連携テスト手順:ペーパートレードでの動作確認
Photo by Radowan Nakif Rehan on Unsplash
実運用前に、この順序でテストを回すこと。
Step 1: TradingView側の送信確認
TradingViewアラートのWebhookにRequestBin(https://pipedream.com/requestbin等)のURLを一時的に設定する。アラートが発火した際にHTTP POSTが届いているか、かつJSONの構造が正しいかを確認する。
Step 2: ブリッジサーバーの受信・キューイング確認
ブリッジサーバーのログを確認し、TradingViewからのWebhookが正常に受信・保存されていることを検証する。
Step 3: MT5 EA側のポーリング確認
MT5のエキスパートログ(View→Terminal→Experts)を開き、EAが定期的にブリッジサーバーをポーリングしているかを確認する。WebRequest エラーコード: 4014 が出た場合は、URLの許可リスト登録を再確認する。
Step 4: ペーパートレードで全体疎通確認
MT5をペーパートレード口座(デモ口座)に接続し、Pine Scriptのアラートを手動発火させてEAが正しく注文を出すかを確認する。注文ログに TV Signal Buy / TV Signal Sell が記録されていればシグナルが正常に到達している。
EAの統計的な有効性を検証するバックテスト・フォワードテストの手法についてはEAバックテストやり方完全解説で詳しく解説している。
Step 5: 実環境移行前の最終チェック項目
- ブリッジサーバーがVPS上で24時間稼働しているか
- MT5/EAも同じVPSまたは独立したVPS上で24時間稼働しているか
- ブローカーがEAによる自動注文を許可しているか(一部ブローカーは制限あり)
- 証拠金維持率のアラートを別途設定しているか
- ロットサイズが口座残高に対して適切か
実運用時の注意点:レイテンシ・VPS・ブローカー制限
VPSは必須
ローカルPCで動かす構成は論外だ。PCのスリープ・再起動・インターネット接続断が即座に機会損失や誤注文につながる。VPSはブローカーのサーバーと同リージョン(多くの場合ロンドンまたはニューヨーク)に置くのが原則だ。それだけでレイテンシの大半は潰せる。
ブローカー制限の確認
ブローカーによっては、EAによる自動注文に制限がある。「ニュース時間帯のEA停止」「スプレッド拡大時の注文拒否」といった挙動はデモ口座で事前に確認しておくべきだ。Webhookトレード自体を禁止している業者も実在するので、約款の確認は欠かせない。
スリッページとレイテンシ
TradingViewのアラート発火から注文執行までの実際の経路はこうなる。
Pine Scriptアラート → TradingView処理(~数秒) → Webhook送信 → ブリッジサーバー → EA取得 → OrderSend → ブローカー執行
商用ブリッジで約250ms、そこにTradingViewのアラート処理時間(数秒以上になることがある)が加わる。秒単位の精度が求められるスキャルピング戦略には、この連携方式は根本的に不向きだ。スイングトレードや日足ベースの戦略に適している。
証拠金管理と損失許容量の設定
EAに組み込むリスク管理ロジックは自動売買システムの生命線だ。ロットサイズは口座残高の固定比率(2%ルール等)で動的に計算するロジックをコードに組み込んでおくこと。固定ロット0.1のサンプルは最小実装に過ぎず、本番ではこのまま使えない。
免責事項(運用リスクについて): 本稿で紹介するアーキテクチャおよびコードサンプルは情報提供を目的としたものであり、FX取引における利益を保証するものではありません。自動売買システムはバックテストで良好な結果が得られた場合でも、実際の相場においてドローダウンや損失が生じる可能性があります。取引にあたっては、ご自身のリスク許容度に応じた証拠金管理を行い、損失に備えた対策を十分に講じた上で自己責任のもとで行ってください。金融庁に登録された国内FX業者をご利用ください。
よくある質問(FAQ)
Q: TradingViewとMT5は連携できますか? A: 直接連携はできません。TradingViewのWebhookを受信し、MT5 EAに渡す中間ブリッジサーバーが必須です。PineConnectorやAlgoWay等の商用サービス、またはOSSのTradingView-MT5-Bridgeがこの役割を担います。
Q: TradingViewのアラートでEAを動かせますか? A: 動かせます。ただし、MT5 EAはHTTPサーバーになれないため、EA側からブリッジサーバーをポーリングしてシグナルを取得するアーキテクチャが一般的です。アラートメッセージにJSONを埋め込み、EAがそのJSON値を解釈して注文を出す構成になります。
Q: TradingView無料プランでWebhookは使えますか? A: 使えません。Webhook送信機能はPlusプラン以上(月額$29.95〜)が必要です。Essentialプランではアラートの通知は受けられますが、Webhookは利用できません。
Q: MT5でWebhookを直接受信できますか? A: 技術的に不可能です。MT5はHTTPサーバーとして機能する仕様を持っておらず、外部からのPOSTリクエストを直接受け付けられません。MQL5のWebRequest関数はHTTPクライアントとして機能するため、EAが能動的にブリッジサーバーへリクエストを送ることでシグナルを取得します。
Q: バックテストでWebRequest関数は使えますか? A: 使えません。ストラテジーテスター内ではWebRequest関数は実行不可です。TradingView連携を前提とした戦略のバックテストは、シグナル生成ロジック部分をMQL5内に移植するか、TradingViewのPine Script上でbacktest()関数を用いて行うのが現実的な選択肢です。
Q: 最も安く始める方法は? A: TradingView Plusプラン(月額$29.95)+OSSのTradingView-MT5-Bridge(無料)の組み合わせが最安構成です。ただし、OSSはPythonとChrome拡張の管理が必要で、技術的なセットアップコストが発生します。安定性を求めるならAlgoWay(月額$6〜)が次の選択肢になります。
Q: TradingViewとMT5の連携をAIで効率化できますか? A: Pine ScriptのロジックをMQL5コードに変換する工程や、EAの設計・デバッグにAIを活用できます。Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら。ブリッジ設計からMQL5実装まで、対話形式でアシストを受けながら進められます。
まとめ:アーキテクチャ理解が先、ツール選定は後
TradingView×MT5連携の核心は「直接連携不可」という制約の理解と、その制約を回避するブリッジ層の設計にある。筆者がこの構成を検証した知見からまとめると、選択の優先順位は以下の通りだ。
- 戦略の時間軸を確認する: 秒単位が必要ならこの連携方式は不適。分足以上なら実用的
- ブリッジツールを選定する: コストと安定性のトレードオフで判断
- Pine ScriptのJSON設計を先に固める: EA側のパーサーをシンプルに保つために、JSONスキーマは最初に決めるべき
- VPS環境を先に確保する: 開発初期からVPS上で動かす習慣をつけること
- ペーパートレードで最低2週間動作確認: 本番移行はそれからでも遅くない
自動売買は「シグナルが正しければ勝てる」ものではない。執行レイテンシ・証拠金管理・ブローカーとの相性・VPSの安定性など、システム全体のロバストネスが最終的な成績を決める。本稿のコードとアーキテクチャを叩き台として、実環境での検証を積み重ねてほしい。
Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら。自動売買システムの設計フェーズでAIアシストを組み込む選択肢として活用できる。
著者: 金融工学出身システムトレーダー
