「Pineスクリプトで自動売買はできますか?」
この質問の答えは「直接はできないが、仕組みを作れば実現できる」だ。
Pineスクリプトはチャート上の描画とアラート発信に特化した言語であり、取引所に直接注文を送る機能は持っていない。しかし、TradingViewのアラートには「Webhook」という外部通知機能がある。この仕組みを使えば、Pineスクリプトで検出したシグナルを外部サーバーに送り、そこから取引所のAPIで注文を実行する——という自動売買パイプラインを構築できる。
つまり、Pineスクリプトは自動売買システムの「シグナル発生装置」として機能する。実際の注文執行は、PythonやNode.jsなどの外部プログラムが担う。
この記事では、この連携の全体像を解説する。Pineスクリプト側のアラート設定、Webhook送信のJSON設計、受信サーバーの構築、取引所APIとの接続、そして本番運用で絶対に押さえるべきセキュリティと障害対策まで。「アラートは設定できたけど、その先がわからない」という人に向けて書いた。
自動売買の全体構成
TradingView × Pineスクリプトで自動売買を実現する構成を整理する。
Pineスクリプト(シグナル検出) ↓ アラート発火 TradingView(Webhook送信) ↓ HTTP POST(JSON) 中継サーバー(Python / Node.js) ↓ 注文パラメータ生成 取引所API(注文執行) ↓ 実口座で約定
登場人物は4つ。それぞれの役割を明確にしておこう。
Pineスクリプト。 エントリー/エグジットの条件をコードで定義し、条件が成立したらアラートを発火させる。シグナルの検出と通知が役割。注文の実行はしない。
TradingView。 アラート発火時にWebhook URLへHTTP POSTリクエストを送信する。JSON形式のメッセージ本文を添えて送れる。
中継サーバー。 TradingViewからのWebhookを受信し、注文パラメータ(銘柄、方向、数量、価格)を組み立て、取引所APIに注文を送信する。リスク管理、認証、ログ記録もここで行う。
取引所API。 実際に注文を執行する。FXブローカー、暗号資産取引所、株式ブローカーなどが提供するREST APIやWebSocket API。
ステップ1: Pineスクリプト — アラート対応のシグナル
自動売買に使うPineスクリプトは、通常のインジケーターにalertcondition()を追加するだけで準備できる。
//@version=6
indicator("自動売買シグナル", overlay=true)
// === パラメータ ===
emaFast = input.int(12, "短期EMA", group="EMA設定")
emaSlow = input.int(26, "長期EMA", group="EMA設定")
rsiLen = input.int(14, "RSI期間", group="フィルター")
rsiMax = input.int(70, "RSI上限", group="フィルター")
rsiMin = input.int(30, "RSI下限", group="フィルター")
// === 計算 ===
fast = ta.ema(close, emaFast)
slow = ta.ema(close, emaSlow)
rsi = ta.rsi(close, rsiLen)
// === シグナル ===
longSignal = ta.crossover(fast, slow) and rsi < rsiMax
shortSignal = ta.crossunder(fast, slow) and rsi > rsiMin
// === 描画 ===
plot(fast, "短期EMA", color.blue)
plot(slow, "長期EMA", color.red)
plotshape(longSignal, "ロング", shape.triangleup, location.belowbar, color.green, size=size.small)
plotshape(shortSignal, "ショート", shape.triangledown, location.abovebar, color.red, size=size.small)
// === アラート条件 ===
alertcondition(longSignal, "ロングシグナル", "LONG")
alertcondition(shortSignal, "ショートシグナル", "SHORT")
alertcondition()は、TradingViewのアラート作成画面で「条件」として選べるようになる関数だ。第3引数の文字列がアラートメッセージのデフォルトになる。
ただし、Webhook経由で自動売買を行う場合は、アラートメッセージをJSON形式で構造化するほうが扱いやすい。これは次のステップで設定する。
ステップ2: アラート設定 — Webhookの送信
TradingViewでアラートを作成するとき、「通知」タブにWebhook URLを入力する欄がある。ここに中継サーバーのURLを設定する。
Webhookを使うにはTradingViewの有料プラン(Pro以上)が必要。 無料プランではWebhook機能は使えない。
アラートメッセージの設計。 アラート作成画面の「メッセージ」欄に、以下のようなJSONテンプレートを入力する。
{
"secret": "your_secret_token_here",
"action": "{{strategy.order.action}}",
"symbol": "{{ticker}}",
"price": "{{close}}",
"time": "{{time}}"
}
TradingViewの{{ }}プレースホルダーは、アラート発火時に実際の値に置換される。{{ticker}}は銘柄名、{{close}}は終値、{{time}}はタイムスタンプ。
インジケーターの場合の注意点。 alertcondition()で作ったアラートでは{{strategy.order.action}}が使えない(ストラテジー専用)。インジケーターベースの場合は、ロング用とショート用で別々のアラートを作り、メッセージを固定文字列にする。
ロング用アラートのメッセージ:
{
"secret": "your_secret_token_here",
"action": "buy",
"symbol": "{{ticker}}",
"price": "{{close}}",
"time": "{{time}}"
}
ショート用アラートのメッセージ:
{
"secret": "your_secret_token_here",
"action": "sell",
"symbol": "{{ticker}}",
"price": "{{close}}",
"time": "{{time}}"
}
secretフィールドは、不正なリクエストを弾くための認証トークン。後述するセキュリティ対策で詳しく説明する。
ステップ3: 中継サーバー — Webhook受信と注文実行
TradingViewからのWebhookを受信し、取引所APIに注文を送信するサーバーを構築する。以下はPython(Flask)の例。
from flask import Flask, request, jsonify
import ccxt
import os
import logging
from datetime import datetime
app = Flask(__name__)
logging.basicConfig(level=logging.INFO)
# === 設定 ===
SECRET_TOKEN = os.environ.get("WEBHOOK_SECRET", "your_secret_token_here")
API_KEY = os.environ.get("EXCHANGE_API_KEY")
API_SECRET = os.environ.get("EXCHANGE_API_SECRET")
# === 取引所接続 ===
exchange = ccxt.bybit({
"apiKey": API_KEY,
"secret": API_SECRET,
"options": {"defaultType": "swap"},
})
@app.route("/webhook", methods=["POST"])
def webhook():
try:
data = request.get_json()
# 認証チェック
if data.get("secret") != SECRET_TOKEN:
logging.warning(f"認証失敗: {request.remote_addr}")
return jsonify({"error": "unauthorized"}), 401
action = data.get("action")
symbol = data.get("symbol")
logging.info(f"シグナル受信: {action} {symbol}")
# 注文実行
if action == "buy":
order = exchange.create_market_buy_order(symbol, 0.001)
elif action == "sell":
order = exchange.create_market_sell_order(symbol, 0.001)
else:
return jsonify({"error": "invalid action"}), 400
logging.info(f"注文完了: {order['id']}")
return jsonify({"status": "ok", "order_id": order["id"]})
except Exception as e:
logging.error(f"エラー: {str(e)}")
return jsonify({"error": str(e)}), 500
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
ccxt。 暗号資産取引所のAPIを統一インターフェースで扱えるPythonライブラリ。Binance、Bybit、OKXなど100以上の取引所に対応。FXブローカー(OANDA、FXCM等)の場合は、各ブローカーのPython SDKやREST APIを使う。
環境変数。 APIキーやシークレットはコード内にハードコードしない。必ず環境変数で管理する。
ログ記録。 すべてのWebhook受信と注文実行をログに記録する。問題発生時の原因特定に不可欠だ。
ステップ4: サーバーの公開 — HTTPSの確保
TradingViewのWebhookは、HTTPSのURLにしか送信できない。中継サーバーをインターネットに公開し、SSL証明書を設定する必要がある。
主な方法は3つ。
方法1: VPS + Let’s Encrypt。 FXVM、Vultr (読み方 ヴァルチャー)、などのVPSにサーバーを設置し、Let’s Encryptで無料SSL証明書を取得する。最も自由度が高いが、サーバー管理スキルが必要。
方法2: ngrok(開発・テスト用)。 ローカルPCに一時的なHTTPS URLを割り当てるツール。テストに便利だが、無料プランではURLが毎回変わるため本番運用には不向き。
方法3: Cloudflare Tunnel。 無料でローカルサーバーにHTTPS URLを固定割り当てできる。Cloudflareのセキュリティ機能(DDoS防御、アクセス制御)も利用可能。
開発段階ではngrok、本番運用ではVPS + Let’s EncryptかCloudflare Tunnelを推奨する。
ステップ5: セキュリティ対策 — 絶対に省略しない
自動売買は「お金に直結する」システム。セキュリティの妥協は許されない。
①シークレットトークン認証。 Webhook URLが第三者に漏れた場合、偽リクエストで不正注文が実行される。JSONのsecretフィールドで正当性を検証する。32文字以上のランダム文字列を使う。
②IPアドレス制限。 TradingViewのWebhook送信元IPアドレスは公開されている。サーバー側ファイアウォールで、TradingViewのIPのみ許可する。
③APIキーの権限制限。 取引所APIキーは「注文のみ」許可。「出金」は絶対に許可しない。IPホワイトリストも設定する。
④注文の重複防止。 アラートが短時間に複数回発火する場合がある。タイムスタンプで重複チェックを行い、二重注文を防ぐ。
last_order_time = {}
def is_duplicate(symbol, action, interval_seconds=60):
key = f"{symbol}_{action}"
now = datetime.now()
if key in last_order_time:
elapsed = (now - last_order_time[key]).total_seconds()
if elapsed < interval_seconds:
return True
last_order_time[key] = now
return False
⑤テスト環境の分離。 本番APIに接続する前に、必ずテストネット(Bybit Testnet等)で動作検証を行う。
ストラテジー型のWebhook連携
strategy()を使う方法もある。バックテストとアラートを1スクリプトで管理できるメリットがある。
//@version=6
strategy("Webhook対応ストラテジー", overlay=true)
fast = ta.ema(close, 12)
slow = ta.ema(close, 26)
if ta.crossover(fast, slow)
strategy.entry("Long", strategy.long,
alert_message='{"action":"buy","symbol":"' + syminfo.ticker + '"}')
if ta.crossunder(fast, slow)
strategy.close("Long",
alert_message='{"action":"sell","symbol":"' + syminfo.ticker + '"}')
plot(fast, "短期EMA", color.blue)
plot(slow, "長期EMA", color.red)
alert_message引数を使うと、strategy.entry()やstrategy.close()の実行タイミングで指定メッセージがアラートに含まれる。バックテストで検証済みのロジックをそのままWebhook経由の自動売買に転用できる。
Pineスクリプトの基本やインジケーターとストラテジーの違いについてはこちら。
→ Pineスクリプト(Pine Script)とは?できること・始め方を完全解説
リスク管理 — 自動売買で破産しないために
自動売買の最大のリスクは「人間が見ていないときに暴走すること」だ。以下は最低限の実装。
最大ポジション数の制限。 シグナル連続発火で大量ポジションを持つことを防ぐ。
MAX_POSITIONS = 3
def check_position_limit(exchange, symbol):
positions = exchange.fetch_positions([symbol])
open_count = sum(1 for p in positions if float(p["contracts"]) > 0)
return open_count < MAX_POSITIONS
1回あたりのリスク制限。 1トレードの最大損失を口座資金の1〜2%に制限する。
日次損失上限。 1日の累積損失が一定額を超えたら、その日の自動売買を停止する。
異常検知と通知。 エラー発生時にSlack/LINE/メールで即通知する。
import requests
def notify_slack(message):
webhook_url = os.environ.get("SLACK_WEBHOOK_URL")
if webhook_url:
requests.post(webhook_url, json={"text": f"⚠️ {message}"})
緊急停止機能。 1分以内に自動売買を停止できる手順を確立しておく。APIキー無効化、サーバーシャットダウン、全ポジション決済など、複数の停止手段を確保する。
対応取引所・ブローカー
暗号資産。 ccxtライブラリでBybit、Binance、OKX、Bitgetなどに対応。テストネットがある取引所を選ぶと開発がスムーズ。
海外FX。 OANDA(REST API v20)、FXCM(REST API)、cTrader(FIX/REST API)。各ブローカーのAPIドキュメントに沿って接続する。
国内株式。 auカブコム証券(kabuステーションAPI)など。Webhook連携サービスのTradestand(旧TradeStudio)もあるが、稼働状況は要確認。
Webhook中継サービス。 3Commas、Cornixなどの連携サービスを使えば、サーバー構築なしで自動売買が可能。設定は簡単だが、サービス側にAPIキーを預けるリスクがある。
運用開始前のチェックリスト
本番稼働前に、以下をすべて確認する。
テストネットでの動作確認は完了したか。シークレットトークンは十分な長さのランダム文字列か。APIキーの権限は「注文のみ」に制限しているか。WebhookのURLはHTTPSか。重複注文防止の仕組みはあるか。最大ポジション数制限はあるか。日次損失上限はあるか。異常通知の設定は完了しているか。緊急停止手順は確立しているか。すべてのWebhook受信と注文をログに記録しているか。
1つでも「NO」があるなら、本番稼働は見送るべきだ。
よくある質問
Q: Pineスクリプトだけで自動売買はできる?
直接はできない。Pineスクリプトはシグナル検出とアラート発信まで。注文実行はWebhook経由で外部サーバーから行う。
Q: TradingView無料プランでもWebhookは使える?
使えない。Webhook機能はPro以上の有料プランで利用可能。
Q: 遅延はどのくらいある?
アラート発火から約定まで通常1〜5秒。スキャルピングのような超短期売買には向かない。1時間足以上の戦略が適している。
Q: TradingViewが落ちたらどうなる?
アラートが発火せず注文も実行されない。ポジションを持ったまま停止するリスクがあるため、取引所側でストップロス注文を別途入れておくのが安全策。
Q: プログラミング経験がなくても自動売買できる?
中継サーバーの構築にはPython等の知識が必要。3CommasやCornixなどの連携サービスなら、プログラミングなしでも可能だが自由度は下がる。
まとめ
Pineスクリプトで自動売買を実現する構成は、「Pine(シグナル)→ TradingView(Webhook)→ 中継サーバー(注文生成)→ 取引所API(約定)」の4段構成だ。
Pineスクリプトが担うのはシグナルの検出とアラートの発火まで。実際の注文執行は外部サーバーが担う。この役割分担を理解していれば、システム全体の設計で迷うことはない。
最も重要なのはセキュリティとリスク管理。シークレットトークン認証、APIキーの権限制限、重複注文防止、最大ポジション制限、日次損失上限、異常通知、緊急停止手順。これらを省略した自動売買は、利益以上のリスクを抱えることになる。
まずはテストネットで小さく始めて、1つずつ確認しながら本番に移行しよう。













