TradingViewとMT4連携をGCFで自動化!サーバーレスで無料から始める自動売買ガイド
なぜGCF (Google Cloud Functions)?サーバーレスで始めるTradingView自動売買のメリット
「TradingViewのアラートを使ってMT4で自動売買したい…でも、24時間動かすためのサーバーは高くて難しそう。」
多くのトレーダーが抱えるこの悩みを、Google Cloud Functions (GCF) が解決します。GCFのサーバーレス技術と無料利用枠を使えば、高価なサーバー契約なしで、安定した自動売買システムをほぼ無料で構築できるのです。
この記事では、TradingViewとMT4を連携させるためのシステムを、GCFを使って構築する全手順を、具体的なコードと共に徹底解説します。

新時代のシステム構成:GCFサーバーレス方式
これが、私たちが目指すシステムの全体像です。
TradingView → Webhook → GCF (Cloud Functions) → Firestore → MT4 EA何がすごいのか?
- サーバー管理が不要:コードを配置するだけで、あとはGoogleが全部やってくれます。
- 費用が安い:小規模な自動売買なら、GCFの無料利用枠の範囲に収まることがほとんど。
- 安定性が高い:世界のGoogleが提供するインフラなので、自宅PCのように電源が落ちる心配もありません。
🛠️ 「何が必要なの?」チェックリスト
- ☁️ GCP (Google Cloud Platform) アカウント:「クラウドの魔法を使える鍵」(無料枠あり)
- 🐍 Python:「GCF上でシグナルを受け取る司令塔」(無料)
- 💹 MT4:「いつもの取引プラットフォーム」(無料)
- 📊 TradingView Pro:「Webhook機能が使えるプラン」(月額数千円)
見ての通り、ほとんど無料で始められます!
1. GCP環境のセットアップ
① Firestoreデータベースの準備
Firestoreは、TradingViewからの売買シグナルを一時的に保管しておくためのデータベースです。
- GCPコンソールにログインし、プロジェクトを作成します。
- 左側のメニューから「Firestore」を検索して選択します。
- 「ネイティブモードを選択」をクリックします。
- ロケーション(リージョン)を選択します。
asia-northeast1(東京)などがおすすめです。 - 「データベースを作成」をクリックすれば完了です!

② Cloud Functionsの準備
Cloud Functionsが、Webhookからのシグナルを受け取る「サーバーレス」なプログラムの実行環境です。
- GCPコンソールのメニューから「Cloud Functions」を選択します。
- 「ファンクションを作成」をクリックします。
- 以下の基本設定を行います。
- 環境:
第2世代 - 関数名:
tradingview-webhookなど分かりやすい名前 - リージョン: Firestoreと同じリージョンを選択
- トリガー: 「HTTP」を選択し、「認証」で**「未認証の呼び出しを許可」**をチェックします。
- 環境:
- 「ランタイム、ビルド、接続、セキュリティの設定」を開き、「ランタイム」タブで環境変数を追加します。
追加をクリックし、名前:SECRET_KEY、値:your-very-secret-keyのように、自分だけの秘密の文字列を設定します。
- 「次へ」をクリックし、コード設定画面に進みます。
2. Pythonコードの作成 (Cloud Function)
TradingViewからのシグナルを受け取り、Firestoreに書き込むためのPythonコードです。先ほど設定した秘密鍵(SECRET_KEY)を使って、不正なアクセスを弾く簡単なセキュリティ機能も加えています。
main.py
import osfrom google.cloud import firestore
# 環境変数から秘密鍵を取得SECRET_KEY = os.environ.get("SECRET_KEY", "default-secret")
def tradingview_webhook(request): """ TradingViewからのWebhookを受信し、Firestoreに注文情報を保存・提供する。 URLパラメータで渡されたキーを検証し、不正なアクセスを防ぐ。 """ # --- セキュリティチェック --- request_key = request.args.get("key") if request_key != SECRET_KEY: print(f"不正なアクセス試行: key={request_key}") return {"error": "Invalid key"}, 403 # 403 Forbidden
db = firestore.Client() request_json = request.get_json(silent=True) # MT4からの注文取得リクエストか、TradingViewからの新規注文かを判断 if request_json and 'symbol' in request_json and 'order' not in request_json: # MT4からのリクエスト:Firestoreから最新の注文を取得して返す symbol = request_json['symbol'] doc_ref = db.collection("TradingViewOrders").document(symbol) doc = doc_ref.get()
if doc.exists: order = doc.to_dict().get("order", "none") # 取得後に注文情報をクリアし、重複実行を防ぐ doc_ref.set({"order": "none", "timestamp": firestore.SERVER_TIMESTAMP}) return {"order": order} else: return {"order": "none"} elif request_json and 'symbol' in request_json and 'order' in request_json: # TradingViewからのリクエスト:Firestoreに新しい注文を保存する symbol = request_json['symbol'] order = request_json['order'] doc_ref = db.collection("TradingViewOrders").document(symbol) doc_ref.set({ "order": order, "timestamp": firestore.SERVER_TIMESTAMP }) print(f"注文保存: {symbol} - {order}") return {"status": "success"} else: # 不正なリクエスト print(f"不正なリクエスト: {request_json}") return {"error": "Invalid request"}, 400requirements.txt
google-cloud-firestoreCloud Functionsのコード入力画面で、ランタイムをPython 3.9などに設定し、上記2つのファイルの内容をそれぞれ貼り付けます。「デプロイ」ボタンを押せば完了です。
デプロイが完了すると、トリガーのタブにWebhook URLが表示されます。これをメモしておきましょう。
3. 重要:セキュリティ設定
Webhook URLは誰でもアクセスできるため、必ず保護する必要があります。ここでは、URLに秘密の「合言葉(キー)」を含める簡単な方法を紹介します。
Webhook URLの例:
https://your-function-url.a.run.app
これを、以下のように変更して使います。
保護されたWebhook URL:
https://your-function-url.a.run.app?key=your-very-secret-key
この?key=...の部分が合言葉です。your-very-secret-keyの部分は、Cloud Functionsの環境変数で設定したものと同じ文字列にしてください。
4. TradingViewアラート設定
-
ストラテジーをチャートに追加し、「アラートを追加」を選択します。
-
「通知」タブに移動します。
-
Webhook URLのチェックボックスをオンにし、先ほど作成した保護されたWebhook URL(
?key=付き)を貼り付けます。 -
メッセージ欄に、以下のJSONコードを貼り付けます。
JSON{"symbol": "{{ticker}}","order": "{{strategy.order.comment}}"} -
アラートを作成すれば、TradingView側の設定は完了です!
5. MT4とEAの設定
最後に、MT4側でGCFから注文を取得するためのEAを設定します。
① WebRequestの許可
- MT4のメニューから「ツール」→「オプション」を開きます。
- 「エキスパートアドバイザ」タブを選択します。
- **「WebRequestを許可するURLリスト」**にチェックを入れ、Cloud FunctionsのURL(
https://からドメイン部分まで)を追加します。 例:https://your-function-url.a.run.app
② EA(GCF_Connector.mq4)の実装
このEAは、一定間隔でGCFに「新しい注文はありますか?」と問い合わせに行き、注文があればMT4で実行します。
#property strict
//--- EA設定input string web_hook_url = "ここに保護されたCloud FunctionsのURLを貼り付け";input string symbol_param = ""; // 通貨ペア(空欄ならチャートの通貨ペアを自動使用)input int magic_number = 12345;input double lot_size = 0.01;input int slippage = 3;input int spread_limit = 30; // pips
//--- グローバル変数datetime last_request_time = 0;
void OnTick(){ // 30秒に1回程度に実行を制限 if (TimeCurrent() - last_request_time < 30) { return; } last_request_time = TimeCurrent();
// スプレッドが広すぎる場合は何もしない if (Ask - Bid > spread_limit * _Point * (Digits % 2 == 1 ? 10 : 1)) { Print("スプレッドが広すぎるためスキップ"); return; }
string order = GetOrderFromGCF();
// 受信した注文に応じて処理を実行 if (order == "buy") { ClosePositions(OP_SELL); // ドテンの場合は反対ポジションを閉じる if (CountPositions(OP_BUY) == 0) { // 新規ロング OrderSend(Symbol(), OP_BUY, lot_size, Ask, slippage, 0, 0, "GCF Signal", magic_number, 0, clrBlue); } } else if (order == "sell") { ClosePositions(OP_BUY); // ドテン if (CountPositions(OP_SELL) == 0) { // 新規ショート OrderSend(Symbol(), OP_SELL, lot_size, Bid, slippage, 0, 0, "GCF Signal", magic_number, 0, clrRed); } } else if (order == "buy_close") { ClosePositions(OP_BUY); // ロングポジションを決済 } else if (order == "sell_close") { ClosePositions(OP_SELL); // ショートポジションを決済 }}
// GCFから注文情報を取得する関数string GetOrderFromGCF(){ char data[], result[]; string headers = "Content-Type: application/json\r\n"; string symbol_to_req = (symbol_param == "") ? Symbol() : symbol_param; string json_payload = "{\"symbol\":\"" + symbol_to_req + "\"}"; StringToCharArray(json_payload, data, 0, WHOLE_ARRAY, CP_UTF8);
// WebRequestを実行 int res = WebRequest("POST", web_hook_url, headers, 5000, data, result, headers);
if (res == 200) { string response = CharArrayToString(result); string order_value = ParseJson(response, "order"); // JSON解析関数を呼び出す if (order_value != "none" && order_value != "") { Print("GCFから注文受信: ", order_value); } return order_value; } else { Print("GCFリクエストエラー: ", res, " - ", CharArrayToString(result)); } return "";}
//--- ユーティリティ関数 ---
// JSON文字列から指定したキーの値を取得する簡易パーサーstring ParseJson(string json_string, string key){ string search_key = "\"" + key + "\":\""; int key_pos = StringFind(json_string, search_key); if (key_pos < 0) return ""; // キーが見つからない
int start_pos = key_pos + StringLen(search_key); int end_pos = StringFind(json_string, "\"", start_pos); if (end_pos < 0) return ""; // 閉じ引用符が見つからない
return StringSubstr(json_string, start_pos, end_pos - start_pos);}
// 指定したタイプのポジション数を数えるint CountPositions(int type) { int count = 0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magic_number && OrderSymbol() == Symbol()) { if (OrderType() == type) { count++; } } } return count;}
// 指定したタイプの全ポジションを決済するvoid ClosePositions(int type) { for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magic_number && OrderSymbol() == Symbol()) { if (OrderType() == type) { double close_price = (type == OP_BUY) ? Bid : Ask; OrderClose(OrderTicket(), OrderLots(), close_price, slippage); } } }}6. トラブルシューティング
うまくいかない時は、慌てずに原因を切り分けましょう。
-
TradingViewのアラートが飛ばない
- TradingViewの「アラートログ」を確認。エラーメッセージが出ていませんか?
- Webhook URLの
?key=...は正しく設定されていますか?
-
Cloud Functionsでエラーが出る
- GCPコンソールのCloud Functionsの「ログ」タブを確認。
Invalid keyと出ていれば、アクセスキーが間違っています。Invalid requestと出ていれば、TradingViewからのメッセージJSONが正しくない可能性があります。
-
MT4で注文が実行されない
- MT4の「エキスパート」タブや「操作履歴」タブにエラーメッセージが出ていませんか?
WebRequestの設定は正しいですか? URLは許可されていますか?- EAの
web_hook_urlに設定したURLは?key=付きの正しいものになっていますか?
7. 参考リンク
さらに詳しく知りたい場合は、以下の公式ドキュメントが役立ちます。
- Google Cloud Platform (GCP): GCP全体のポータルサイト。
- Google Cloud Firestore ドキュメント: Firestoreのより詳細な使い方や仕様について。
- Google Cloud Functions ドキュメント: Cloud Functionsでできることの全て。
- Python.org: Python言語の公式サイト。
- MQL4言語リファレンス: MT4のEA開発に必須の公式マニュアル。
- TradingView Pine Script v5 ユーザーマニュアル: Pine Scriptの書き方の全てがここに。
🎉 おめでとうございます!
これで、あなたのTradingViewストラテジーは、24時間365日、クラウド上であなたのために働き続けます。
「難しそう」と感じたあなたへ 大丈夫、最初は誰でもそう感じます。でも、この記事のステップを一つ一つ踏んでいけば、必ずゴールにたどり着けます。自宅PCの電源を気にすることなく、旅行先からでもスマホで利益を確認できる…そんな未来があなたを待っています。
もう「サーバーが壁」なんて言わせません。 クラウドの力を借りて、自動売買の新しい世界へ飛び出しましょう!応援しています!🌟
🎁おすすめツール・サービス
※上記リンクにはプロモーション(広告)が含まれています
量子相場謀略|ホソノP
ブログでは書けない本音のトレード戦略とEA開発の裏側を公開。 データに基づいた検証で、再現性のある手法だけをお届けします。