Web Lukes
💻

TradingViewとMT4連携をGCFで自動化!サーバーレスで無料から始める自動売買ガイド

公開日: 2023/2/5更新日: 2025/1/29

なぜGCF (Google Cloud Functions)?サーバーレスで始めるTradingView自動売買のメリット

「TradingViewのアラートを使ってMT4で自動売買したい…でも、24時間動かすためのサーバーは高くて難しそう。」

多くのトレーダーが抱えるこの悩みを、Google Cloud Functions (GCF) が解決します。GCFのサーバーレス技術と無料利用枠を使えば、高価なサーバー契約なしで、安定した自動売買システムをほぼ無料で構築できるのです。

この記事では、TradingViewとMT4を連携させるためのシステムを、GCFを使って構築する全手順を、具体的なコードと共に徹底解説します。

新時代のシステム構成:GCFサーバーレス方式

これが、私たちが目指すシステムの全体像です。

Code
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からの売買シグナルを一時的に保管しておくためのデータベースです。

  1. GCPコンソールにログインし、プロジェクトを作成します。
  2. 左側のメニューから「Firestore」を検索して選択します。
  3. 「ネイティブモードを選択」をクリックします。
  4. ロケーション(リージョン)を選択します。asia-northeast1(東京)などがおすすめです。
  5. 「データベースを作成」をクリックすれば完了です!

② Cloud Functionsの準備

Cloud Functionsが、Webhookからのシグナルを受け取る「サーバーレス」なプログラムの実行環境です。

  1. GCPコンソールのメニューから「Cloud Functions」を選択します。
  2. 「ファンクションを作成」をクリックします。
  3. 以下の基本設定を行います。
    • 環境: 第2世代
    • 関数名: tradingview-webhook など分かりやすい名前
    • リージョン: Firestoreと同じリージョンを選択
    • トリガー: 「HTTP」を選択し、「認証」で**「未認証の呼び出しを許可」**をチェックします。
  4. 「ランタイム、ビルド、接続、セキュリティの設定」を開き、「ランタイム」タブで環境変数を追加します。
    • 追加をクリックし、名前:SECRET_KEY、値:your-very-secret-key のように、自分だけの秘密の文字列を設定します。
  5. 「次へ」をクリックし、コード設定画面に進みます。

2. Pythonコードの作成 (Cloud Function)

TradingViewからのシグナルを受け取り、Firestoreに書き込むためのPythonコードです。先ほど設定した秘密鍵(SECRET_KEY)を使って、不正なアクセスを弾く簡単なセキュリティ機能も加えています。

main.py

Python
import os
from 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"}, 400

requirements.txt

TEXT
google-cloud-firestore

Cloud 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アラート設定

  1. ストラテジーをチャートに追加し、「アラートを追加」を選択します。

  2. 「通知」タブに移動します。

  3. Webhook URLのチェックボックスをオンにし、先ほど作成した保護されたWebhook URL(?key=付き)を貼り付けます。

  4. メッセージ欄に、以下のJSONコードを貼り付けます。

    JSON
    {
    "symbol": "{{ticker}}",
    "order": "{{strategy.order.comment}}"
    }
  5. アラートを作成すれば、TradingView側の設定は完了です!

5. MT4とEAの設定

最後に、MT4側でGCFから注文を取得するためのEAを設定します。

① WebRequestの許可

  1. MT4のメニューから「ツール」→「オプション」を開きます。
  2. 「エキスパートアドバイザ」タブを選択します。
  3. **「WebRequestを許可するURLリスト」**にチェックを入れ、Cloud FunctionsのURL(https://からドメイン部分まで)を追加します。 例: https://your-function-url.a.run.app

② EA(GCF_Connector.mq4)の実装

このEAは、一定間隔でGCFに「新しい注文はありますか?」と問い合わせに行き、注文があればMT4で実行します。

MQL4
#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. 参考リンク

さらに詳しく知りたい場合は、以下の公式ドキュメントが役立ちます。

🎉 おめでとうございます!

これで、あなたのTradingViewストラテジーは、24時間365日、クラウド上であなたのために働き続けます。

「難しそう」と感じたあなたへ 大丈夫、最初は誰でもそう感じます。でも、この記事のステップを一つ一つ踏んでいけば、必ずゴールにたどり着けます。自宅PCの電源を気にすることなく、旅行先からでもスマホで利益を確認できる…そんな未来があなたを待っています。

もう「サーバーが壁」なんて言わせません。 クラウドの力を借りて、自動売買の新しい世界へ飛び出しましょう!応援しています!🌟

🎁おすすめツール・サービス

FX自動売買VPSなら50%OFF

キャンペーンで月1,790円〜。MT4/MT5プリインストール済み、自動復旧機能付き。14日間無料お試し。

シンクラウドデスクトップ for FX
ゴトー日EAを探しているならソースコード付

4年で資金4.7倍のバックテスト実績。ソースコード付きで自由にカスタマイズ可能。

ゴトー日EA Ultimate版(3,980円)

※上記リンクにはプロモーション(広告)が含まれています

🔮
MEMBERSHIP

量子相場謀略|ホソノP

ブログでは書けない本音のトレード戦略とEA開発の裏側を公開。 データに基づいた検証で、再現性のある手法だけをお届けします。

✓EAソースコード公開
✓バックテスト生データ共有
✓リアルタイム相場分析
✓メンバー限定記事
メンバーシップに参加する※ noteアカウントで簡単登録

📚あわせて読みたい

💻

【プログラミング初心者でも安心!】TradingViewのシグナルでMT4を動かす自動売買システム構築ガイド

TradingViewの高度な分析を使ったアラートをきっかけに、お使いのMT4で自動的に売買する仕組みを、Googleの無料クラウドサービスを使って作ってみましょう。専門知識は不要です!

プログラミング・開発2023/2/19
💻

😤『cBot・MQL4・MQL5・Python、どれから始めればいいの!?』習得時間を徹底比較【実体験ベース】

自動売買を始めたいけど、cBot(C#/Python)・MQL4(MT4)・MQL5(MT5)・Python、どれを学ぶべき?プログラミング未経験者〜経験者別に習得時間の目安と効率的な学習順序を実体験ベースで解説。

プログラミング・開発2026/1/13
💻

🐍『TradingViewのストラテジーで自動売買したい...』を現実にする方法【第4回:GMOコイン × TradingView × Python 完全攻略編】

GMOコイン APIとTradingView Webhookを連携して、完全自動売買システムを構築する方法。2025年最新のAPI仕様に対応した実践コード付き。

プログラミング・開発2025/12/7
💻

😤『国内FXでもゴトー日やりたい!』GMOコインAPIで自動売買を作る全手順 - Python + GCF で24時間稼働

MT4のゴトー日EAをPythonに移植して、GMOコインの外国為替FX APIでドル円自動売買を実現。Google Cloud Functions (GCF)とスケジューラーで完全自動化する方法を初心者向けに解説します。

プログラミング・開発2025/12/7
💻

「夜中にチャート見るのもう疲れた…😴」仮想通貨自動売買ボット開発の完全ガイド 🤖💰 - Python + TradingView + Bybitで始める

PythonとTradingView、Bybitを組み合わせて仮想通貨の自動売買ボットを構築する方法を、初心者向けにステップバイステップで解説します。

プログラミング・開発2025/1/29
💻

😤『30分でEA作成?無理でしょ』と思ったあなたへ - ゴトー日EA作成の血と汗と涙の記録

『プログラミング未経験の私が本当に30分でEA作れるの?』その疑問、3時間の格闘を経て解決しました。初心者の目線で、つまづきポイントも全部公開します。

プログラミング・開発2022/7/16