🐍『TradingViewのストラテジーで自動売買したい...』を現実にする方法【第4回:GMOコイン × TradingView × Python 完全攻略編】
🔥 「TradingViewのストラテジーで自動売買できたら最高なのに...」
TradingViewでバックテストしたら、年利30%のストラテジーができた。
でも手動で売買するの面倒すぎる...
シグナル出るたびにスマホ確認して、注文出して...
いや、自動化したい。
この記事では、TradingView × GMOコイン API × Pythonで完全自動売買システムを構築する方法を解説します。
2025年版、最新のAPI仕様に完全対応。
🤔 なぜGMOコインなのか
API連携でFX自動売買するなら、国内ではGMOコインが有力な選択肢です。
GMOコイン APIの強み
| 項目 | GMOコイン | OANDA |
|---|---|---|
| 最小取引単位 | 100通貨 | 1,000通貨 |
| API手数料 | 0.002% | 無料(スプレッド内包) |
| ドキュメント | 10言語サンプル | 日本語あり |
| 無料トライアル | 30日間 | なし |
| TradingView連携 | 公式対応 | 自作必要 |
2025年4月の神アップデート
GMOコインが大幅にAPI仕様を改善:
変更前:最小注文数量 10,000通貨変更後:最小注文数量 100通貨 ← 🔥これがデカい
変更前:API手数料 1通貨ごとに0.002円変更後:約定金額 × 0.002%100通貨から取引できるようになったことで、少額から自動売買を始められる。
📐 システム構成図
TradingView │ │ ストラテジーのシグナル発火 ▼Webhook送信(JSON) │ ▼サーバー(GCF (Google Cloud Functions) / VPS) │ │ Pythonでリクエスト処理 ▼GMOコイン API │ │ 注文実行 ▼自動売買完了!🎉ポイント:
- TradingViewのWebhookは**有料プラン(Pro以上)**が必要
- サーバーはGCF (Google Cloud Functions)(サーバーレス)かVPSを使う
🚀 準備編
Step 1:GMOコインで口座開設
- GMOコイン公式サイトへ
- 「口座開設」から申し込み
- 本人確認書類をアップロード
- 審査通過後、ログイン可能に
- 「外国為替FX」を有効化する
Step 2:APIキーを取得
1. GMOコインにログイン2. 「API」メニューへ3. 「APIキー新規追加」をクリック4. 以下を設定: - APIキー名:自由(例:TradingViewBot) - 権限:注文、照会にチェック5. 「追加」をクリック6. APIキーとシークレットをメモ(二度と表示されない!)⚠️ APIキーは絶対に他人に見せない。 資産を自由に動かせる鍵です。
Step 3:TradingView有料プランに加入
Webhookを使うにはPro以上が必要。
| プラン | 月額 | Webhookアラート数 |
|---|---|---|
| Pro | $12.95 | 20個 |
| Pro+ | $24.95 | 100個 |
| Premium | $49.95 | 400個 |
おすすめ:Proで十分。1ストラテジーなら20アラートで足りる。
💻 実装編:GMOコイン API
基本構成
# gmo_fx_api.pyimport hmacimport hashlibimport timeimport jsonimport requestsfrom datetime import datetime
class GMOFxAPI: """GMOコイン 外国為替FX API クライアント"""
BASE_URL = "https://forex-api.coin.z.com/private"
def __init__(self, api_key: str, api_secret: str): self.api_key = api_key self.api_secret = api_secret
def _create_signature(self, timestamp: str, method: str, path: str, body: str = "") -> str: """署名を作成""" text = timestamp + method + path + body sign = hmac.new( self.api_secret.encode(), text.encode(), hashlib.sha256 ).hexdigest() return sign
def _request(self, method: str, path: str, data: dict = None) -> dict: """APIリクエストを実行""" timestamp = str(int(time.time() * 1000)) body = json.dumps(data) if data else ""
headers = { "API-KEY": self.api_key, "API-TIMESTAMP": timestamp, "API-SIGN": self._create_signature(timestamp, method, path, body), "Content-Type": "application/json" }
url = self.BASE_URL + path
if method == "GET": response = requests.get(url, headers=headers) elif method == "POST": response = requests.post(url, headers=headers, data=body)
return response.json()
def get_account(self) -> dict: """口座情報を取得""" return self._request("GET", "/v1/account")
def get_positions(self) -> dict: """ポジション一覧を取得""" return self._request("GET", "/v1/openPositions")
def place_order(self, symbol: str, side: str, size: int) -> dict: """ 成行注文を出す symbol: "USD_JPY" など side: "BUY" or "SELL" size: 取引数量(100通貨単位) """ data = { "symbol": symbol, "side": side, "executionType": "MARKET", "size": str(size) } return self._request("POST", "/v1/order", data)
def close_position(self, position_id: str, size: int) -> dict: """ポジションを決済""" data = { "positionId": position_id, "executionType": "MARKET", "size": str(size) } return self._request("POST", "/v1/closeOrder", data)
def close_all_positions(self, symbol: str) -> list: """指定通貨ペアの全ポジションを決済""" positions = self.get_positions() results = []
if positions.get("data"): for pos in positions["data"]["list"]: if pos["symbol"] == symbol: result = self.close_position( pos["positionId"], int(pos["size"]) ) results.append(result)
return results使用例
import osfrom gmo_fx_api import GMOFxAPI
# 初期化api = GMOFxAPI( api_key=os.environ["GMO_API_KEY"], api_secret=os.environ["GMO_API_SECRET"])
# 口座情報を確認account = api.get_account()print(f"口座残高: {account['data']['balance']}円")
# USD/JPYを100通貨買いresult = api.place_order("USD_JPY", "BUY", 100)print(f"注文結果: {result}")
# ポジション確認positions = api.get_positions()print(f"保有ポジション: {positions}")
# 全決済api.close_all_positions("USD_JPY")print("全決済完了!")💻 実装編:Webhookサーバー
TradingViewからのWebhookを受信し、GMOコインに注文を出すサーバーを作ります。
Flask版(VPS向け)
# webhook_server.pyimport osimport jsonfrom flask import Flask, request, jsonifyfrom gmo_fx_api import GMOFxAPI
app = Flask(__name__)
# API初期化api = GMOFxAPI( api_key=os.environ["GMO_API_KEY"], api_secret=os.environ["GMO_API_SECRET"])
# セキュリティ用のシークレットWEBHOOK_SECRET = os.environ.get("WEBHOOK_SECRET", "your_secret_here")
@app.route("/webhook", methods=["POST"])def webhook(): """TradingViewからのWebhookを処理""" try: # シークレット検証 data = request.json if data.get("secret") != WEBHOOK_SECRET: return jsonify({"error": "Unauthorized"}), 401
# シグナル取得 action = data.get("action") # "BUY" or "SELL" or "CLOSE" symbol = data.get("symbol", "USD_JPY") size = int(data.get("size", 100))
print(f"受信: action={action}, symbol={symbol}, size={size}")
# 注文実行 if action == "BUY": # 売りポジションがあれば決済 api.close_all_positions(symbol) result = api.place_order(symbol, "BUY", size)
elif action == "SELL": # 買いポジションがあれば決済 api.close_all_positions(symbol) result = api.place_order(symbol, "SELL", size)
elif action == "CLOSE": result = api.close_all_positions(symbol)
else: return jsonify({"error": "Invalid action"}), 400
print(f"結果: {result}") return jsonify({"success": True, "result": result})
except Exception as e: print(f"エラー: {e}") return jsonify({"error": str(e)}), 500
if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)GCF (Google Cloud Functions)版(サーバーレス)
# main.pyimport osimport jsonfrom flask import jsonifyfrom gmo_fx_api import GMOFxAPI
api = GMOFxAPI( api_key=os.environ["GMO_API_KEY"], api_secret=os.environ["GMO_API_SECRET"])
WEBHOOK_SECRET = os.environ["WEBHOOK_SECRET"]
def webhook_handler(request): """Cloud Functionsのエントリーポイント""" try: # ボディをパース body = request.get_json()
# シークレット検証 if body.get("secret") != WEBHOOK_SECRET: return jsonify({"error": "Unauthorized"}), 401
action = body.get("action") symbol = body.get("symbol", "USD_JPY") size = int(body.get("size", 100))
# 注文実行 if action == "BUY": api.close_all_positions(symbol) result = api.place_order(symbol, "BUY", size) elif action == "SELL": api.close_all_positions(symbol) result = api.place_order(symbol, "SELL", size) elif action == "CLOSE": result = api.close_all_positions(symbol) else: return jsonify({"error": "Invalid action"}), 400
return jsonify({"success": True, "result": result}), 200
except Exception as e: return jsonify({"error": str(e)}), 500💻 実装編:TradingView設定
ストラテジーにアラートを追加
TradingViewのPine Scriptストラテジーで、エントリー/エグジット時にアラートを発火させます。
//@version=5strategy("MA Cross Strategy", overlay=true)
// パラメータshortPeriod = input.int(5, "短期MA")longPeriod = input.int(20, "長期MA")
// 移動平均計算shortMA = ta.sma(close, shortPeriod)longMA = ta.sma(close, longPeriod)
// プロットplot(shortMA, color=color.blue, title="短期MA")plot(longMA, color=color.red, title="長期MA")
// エントリー条件longCondition = ta.crossover(shortMA, longMA)shortCondition = ta.crossunder(shortMA, longMA)
// エントリーif longCondition strategy.entry("Long", strategy.long) alert('{"secret":"your_secret","action":"BUY","symbol":"USD_JPY","size":"1000"}', alert.freq_once_per_bar)
if shortCondition strategy.entry("Short", strategy.short) alert('{"secret":"your_secret","action":"SELL","symbol":"USD_JPY","size":"1000"}', alert.freq_once_per_bar)⚠️注意: alert内のsizeはご自身の戦略に合わせて調整してください。Python側のデフォルト(100通貨)と異なると意図しないロット数で発注される可能性があります。
アラート設定手順
1. TradingViewでストラテジーをチャートに追加2. 右上の「アラート」ボタンをクリック3. 以下を設定: - 条件:ストラテジー名 → 注文が発注された時 - Webhook URL:https://your-server.com/webhook - メッセージ:そのまま(ストラテジーのalert()が使われる)4. 「作成」をクリック🖥️ デプロイ編
方法1:VPS + Flask(おすすめ)
# 1. VPSを契約(ConoHa、さくら、Vultrなど)
# 2. SSHで接続ssh root@your-server-ip
# 3. Python環境構築apt update && apt install python3 python3-pippip3 install flask requests
# 4. ファイルをアップロードscp gmo_fx_api.py webhook_server.py root@your-server-ip:~/
# 5. 環境変数を設定export GMO_API_KEY="your_key"export GMO_API_SECRET="your_secret"export WEBHOOK_SECRET="your_webhook_secret"
# 6. 起動(screenで永続化)screen -S botpython3 webhook_server.py
# Ctrl+A, D で抜ける方法2:GCF (Google Cloud Functions)
# 1. GCPプロジェクトを作成# 2. Cloud Functionsで関数を作成# 3. ランタイムをPython 3.xに設定# 4. 環境変数を設定(GMO_API_KEY, GMO_API_SECRET, WEBHOOK_SECRET)# 5. HTTPトリガーを有効化# 6. TradingViewのWebhook URLにCloud FunctionsのURLを設定メリット:サーバー管理不要、従量課金で安い、日本リージョンあり デメリット:初期設定がやや複雑
🧪 テスト手順
Step 1:GMOコイン API単体テスト
# test_api.pyfrom gmo_fx_api import GMOFxAPI
api = GMOFxAPI("your_key", "your_secret")
# 口座情報取得できるか確認account = api.get_account()print(account)
# 小さい注文でテスト(100通貨)result = api.place_order("USD_JPY", "BUY", 100)print(result)
# すぐ決済api.close_all_positions("USD_JPY")Step 2:Webhookサーバー単体テスト
# curlでWebhookをシミュレートcurl -X POST http://localhost:5000/webhook \ -H "Content-Type: application/json" \ -d '{"secret":"your_secret","action":"BUY","symbol":"USD_JPY","size":"100"}'Step 3:TradingViewからの統合テスト
- TradingViewでアラートを設定
- チャートを操作してシグナルを発火させる
- GMOコインの注文履歴を確認
- 注文が入っていれば成功!🎉
⚠️ 注意点
注意①:レート制限
GMOコイン APIは1秒に1リクエストの制限がある。
import time
def safe_request(func, *args, **kwargs): """レート制限を守る""" time.sleep(1) # 1秒待つ return func(*args, **kwargs)注意②:エラーハンドリング
APIは失敗することがある。リトライ処理を入れること。
def place_order_with_retry(api, symbol, side, size, max_retries=3): for i in range(max_retries): try: result = api.place_order(symbol, side, size) if result.get("status") == 0: return result print(f"注文失敗({i+1}回目): {result}") except Exception as e: print(f"エラー({i+1}回目): {e}") time.sleep(2) raise Exception("注文に失敗しました")注意③:30日間無料トライアルを活用
GMOコインのAPI、最初の30日間は無料で試せる。
本番運用前に十分テストすること。
📝 第4回まとめ
今回学んだこと:
-
GMOコイン APIの強み
- 最小100通貨から取引可能
- 10言語のサンプルコード
- 30日間無料トライアル
-
システム構成
- TradingView → Webhook → サーバー → GMOコイン API
-
実装方法
- GMOFxAPIクラスで注文・決済
- FlaskでWebhookサーバー構築
- TradingViewのストラテジーでアラート発火
-
デプロイ
- VPS + Flask が簡単でおすすめ
- GCF (Google Cloud Functions)ならサーバー管理不要
🔜 次回予告:EA購入・選び方ガイド
第5回では、EAを購入する方法を解説します。
- GogoJungleの使い方
- 良いEAの見分け方
- 詐欺EAに騙されない方法
- おすすめEAランキング
「自作は無理だけど、いいEA欲しい!」 という人は必見です!
💬 最後に
TradingView × GMOコイン × Python
この組み合わせ、マジで最強だと思う。
- TradingViewで自由にストラテジー開発
- バックテストで検証
- Webhookで自動発注
- GMOコインで少額から本番運用
プログラミングできる人にとっては、これ以上の環境はない。
ぜひこの記事のコードをベースに、あなただけの自動売買システムを構築してみてほしい。
「自分のコードが、実際にお金を動かしてる...」
この感動、プログラマーなら分かるはず。
📚 シリーズ記事
- 第1回:業者選び完全ガイド
- 第2回:トラリピ設定の極意
- 第3回:MT4/MT5でEA運用
- 第4回(この記事):Python × GMOコイン × TradingView
- 第5回:EA購入・選び方ガイド
🎁おすすめツール・サービス
※上記リンクにはプロモーション(広告)が含まれています
量子相場謀略|ホソノP
ブログでは書けない本音のトレード戦略とEA開発の裏側を公開。 データに基づいた検証で、再現性のある手法だけをお届けします。