更新情報
自動売買環境構築シリーズを刷新しました(✅ 旧版購入者様への特典あり)
この度、
自動売買
環境構築シリーズを2026年最新版へとアップデートしました。
本シリーズはこれまで有料記事として提供してまいりましたが、今回の刷新を機に主要ステップを無料公開いたしました。
📢 旧シリーズ(有料記事)をご購入いただいた方へ
これまで多くのフィードバックをいただき、心より感謝申し上げます。旧版をご購入いただいた皆様には、特典をご用意しております。
特典の受け取り方法や代行の詳細については、下記の案内ページをご確認ください。
👉️ (KFO) 環境構築代行・優待特典のご案内
なお、ご購入済みの旧記事(アーカイブ)も引き続き閲覧可能です。
👉️ 旧シリーズ:自動売買環境構築 2025 を見る
TradingView × Node.js | Webhook で株を自動発注する方法 【ログ&バリデーション対応まで】
TradingView
の
アラート
機能を使えば、特定のタイミングで
Webhook
通知を送ることができます。
前回の記事では、
Node.js
側でその通知を受信するところまで解説しました。
今回はいよいよ、その通知を kabu ステーション
API
の発注処理につなげて、実際に株を
自動売買
する仕組みを作っていきます。
📚 前提となる記事
📦 テンプレート販売について
👉 TradingView × Node.js × kabu API 自動売買テンプレートから有料でダウンロード可能です。
シリーズ記事の手順通りでも自力構築は可能です。時間を節約したい方・すぐ動かしたい方はご活用ください。
⚠️ 購入するだけで
自動売買
環境が完成するものではありません。記事に沿って設定・
API
接続・動作確認を行う必要があります。
【環境構築代行 KFO(Kabutech Flex Order)】
「自分でコードを書いてデバッグする時間は、ない」 「とにかく安定環境で運用を始めたい」
という方は、構築を丸投げして「最短距離」で実戦に入ってください。
👉 KFO(Kabutech Flex Order) 環境構築代行サービス詳細はこちら
✅ この記事でわかること
TradingView
の
アラート
通知を使って、
Node.js
から株の発注処理を行う方法をステップ形式で解説します。
この記事を読み終えるころには、以下ができるようになります:
-
Webhook
で株の発注を自動化する方法
- 発注時のエラー内容をログで記録する仕組み
- 不正な通知をブロックする簡易
バリデーション
の導入
🏁 完成イメージ
TradingViewアラート
↓
Webhook通知
↓
Node.js(バリデーション) → ログ記録
↓
kabuステAPIで発注
📁 ディレクトリ構成
kabu-api-demo/
├─ config.js // 固定値を記載
├─ auth.js // 認証トークンを取得する関数
├─ order-data.js // 注文内容を作成するファイル
├─ server.js // Webhook 通知の受信と API 注文処理
├─ send-order.js // 認証+注文を一括で実行するメインスクリプト
├─ logs/ // ログ出力ディレクトリ
└─ node_modules/ // モジュール群
💡 ※本シリーズ内容は「注文処理の構成・学習用サンプル」です。
実運用前に必ずテスト環境または小額で動作確認を行ってください。
🔧 今回の流れ
- すでにある send-order.js を再利用可能な関数形式にする
-
Webhook
サーバーから sendOrder() を呼び出して発注を行う
STEP1 | send-order.js を関数化して外部から呼び出せるようにする
まずは、これまで CLI(コマンド処理) 用に書いていた send-order.js を、モジュールとして再利用できる構成に変更します。
📁 前回記事までで作成した kabu-api-demo フォルダ内にある send-order.js を、そのまま活用していきます。
// send-order.js
const axios = require("axios");
const { config } = require("./config");
const { getToken } = require("./auth");
const { createOrderData } = require("./order-data.js");
async function sendOrder({ symbol, qty, action }) {
try {
const token = await getToken();
const orderData = createOrderData({ symbol, qty, action });
const res = await axios.post(
`${config.baseUrl}/kabusapi/sendorder`,
orderData,
{
headers: {
"Content-Type": "application/json",
"X-API-KEY": token,
},
},
);
console.log("✅ 注文成功:", res.data);
return res.data;
} catch (err) {
if (err.response) {
console.error("❌ APIエラー:", err.response.status, err.response.data);
} else {
console.error("❌ 通信エラー:", err.message);
}
throw err;
}
}
module.exports = { sendOrder };
STEP2 | Webhook を受信して、発注処理を流す
server.js では、前回までに
Webhook
通知の受信までは完了していました。
ここに、受信したデータをもとに createOrderData() で注文データを作成し、sendOrder() で
API
に送信する処理を追加していきます。
// server.js
const express = require("express");
const { sendOrder } = require("./send-order");
const app = express();
app.use(express.json()); // JSONボディをパース
// 動作確認用のエンドポイント(GET /)
app.get("/", (req, res) => {
res.send("サーバーは正常に動作しています!");
});
// Webhookを受け取るエンドポイント(POST /webhook)
app.post("/webhook", async (req, res) => {
const timestamp = new Date().toISOString();
// 受信データのログ出力
console.log(`[${timestamp}] ✅ Webhook受信: ${JSON.stringify(req.body)}`);
// リクエストボディから必要なパラメータを抽出(デフォルト値あり)
const { symbol, qty, action } = req.body;
try {
// 注文処理の呼び出し
const result = await sendOrder({ symbol, qty, action });
// 成功時のログ
console.log(`[${timestamp}] ✅ 注文成功: ${JSON.stringify(result)}`);
res.status(200).send("Order sent");
} catch (err) {
// エラー詳細の抽出
const errorInfo = err.response?.data || err.message || err;
// エラーログ
console.error(`[${timestamp}] ❌ 注文エラー:`, errorInfo);
res.status(500).send("Order failed");
}
});
// サーバー起動(ポート3000)
app.listen(3000, () => {
console.log("🚀 Webhook サーバー起動中(ポート 3000)");
});
💡 補足:server.js を起動中の場合は再起動してください。
すでに server.js を起動中の場合は、上記の変更を反映させるために一度サーバーを停止し、再起動してください。
変更内容が反映されないままでは、新たに追加した注文処理が動作しません。
(Ctrl + C で停止 → node server.js で再起動)
curl で localtunnel に向けた POST リクエスト送信テスト
Webhook
を受信するサーバーが起動したら、
curl
コマンドを使って、実際に通知が届いたときと同じ形式のリクエストを送って動作確認してみましょう。
-
ポート 3000(server.js)を外部公開
lt --port 3000
💡 lt --port 3000 の実行で表示された URL を、下記の https://your-url.loca.lt の部分に置き換えてください。
※
localtunnel
の使い方は、前回記事でも紹介しています。
-
リクエスト送信テスト
curl.exe -X POST https://your-url.loca.lt/webhook -H "Content-Type: application/json" -d '{\"symbol\":\"8306\",\"qty\":100,\"action\":\"BUY\"}'
STEP3 | TradingView の Webhook 通知から実際に発注する。
TradingView
の
アラート
に以下のような
JSON
を設定:
信用新規成行買い
{
"symbol": "8306",
"qty": 100,
"action": "BUY"
}
| パラメータ |
内容 |
| symbol |
銘柄コード(例:8306) |
| qty |
株数(例:100) |
| action |
BUY / SELL / CLOSE_LONG / CLOSE_SHORT |
補足:本記事の実装は
成行
注文までが対象です。
指値
注文の実装は
約定
の確認やキャンセル処理などを考慮する必要があり、導入として難易度が上がるため今回は扱っていません。
将来的に
指値
注文を実装したい場合は、
約定
状況の取得や注文キャンセルの仕組みの追加が必要です。
STEP3 まで完了!本当にお疲れさまでした 🎉
ここまでたどり着いたあなたは、ついに 「自分だけの日本株・
自動売買
環境」 を構築できたことになります。
Webhook受信
↓
発注データ作成
↓
kabuステAPIで注文実行
実は、株の
自動売買
をここまで個人で構築して動かしている人は、実はまだごく少数。
コードや
Webhook
の仕組みなど、慣れない作業も多かったと思いますが、しっかりここまで完走できたのは本当にすごいことです。
✅️ この環境を土台にすれば、
「
ストラテジー
の精度向上」や「複数銘柄の自動化」「通知と発注の条件分岐」など、
さらなるステップアップも目指せます。
まずは、自分で構築した仕組みがしっかり注文を出せているかをテストしてみましょう!
JSON の設定例:
TradingView
の
アラート
に目的に応じた json を設定します。
下記のツールを利用すれば、入力項目を選ぶだけで注文用
JSON
を作成できます。
👉️ 自動売買用 注文JSONジェネレーター
💡 銘柄や株数は適宜変更してください。
信用新規成行買い
{
"symbol": "8306",
"qty": 100,
"action": "BUY"
}
信用新規成行売り
{
"symbol": "8306",
"qty": 100,
"action": "SELL"
}
信用返済成行買い
{
"symbol": "8306",
"qty": 100,
"action": "CLOSE_SHORT"
}
信用返済成行売り
{
"symbol": "8306",
"qty": 100,
"action": "CLOSE_LONG"
}
STEP4 |エラーログを保存して原因を“見える化”しよう
ここまででも特にエラー等がおこらない限りは、
自動売買
を開始できる状態です。
でも…このままでは「失敗したときの原因が見えません」。
システムを運用していくと、こんなトラブルに出くわします:
- kabu ステーション
API
が起動していなかった
- 通知内容が不完全だった
-
API
トークン
が期限切れになっていた
そのときにログがないと原因を突き止められません。
✅ ログ付きの Webhook 受信処理(try-catch で記録)
// server.js
const express = require("express");
const fs = require("fs");
const path = require("path");
const { sendOrder } = require("./send-order");
const app = express();
app.use(express.json()); // JSONボディをパース
// logsディレクトリのパスを指定(なければ作成)
const logDir = path.join(__dirname, "logs");
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir);
}
// 動作確認用のエンドポイント(GET /)
app.get("/", (req, res) => {
res.send("サーバーは正常に動作しています!");
});
// Webhookを受け取るエンドポイント(POST /webhook)
app.post("/webhook", async (req, res) => {
const timestamp = new Date().toISOString();
const logFileName = path.join(
logDir,
`webhook-${timestamp.split("T")[0]}.log`,
);
// Webhook受信ログ
const receivedLog = `[${timestamp}] ✅ Webhook受信: ${JSON.stringify(
req.body,
)}\n`;
fs.appendFileSync(logFileName, receivedLog);
console.log(receivedLog.trim());
// リクエストボディから必要なパラメータを抽出(デフォルト値あり)
const { symbol, qty, action } = req.body;
try {
// 想定外の action はエラーを返す
const validActions = ["BUY", "SELL", "CLOSE_LONG", "CLOSE_SHORT"];
if (!validActions.includes(action)) {
const errorLog = `[${timestamp}] ❌ 想定外の action を検出: ${JSON.stringify(req.body)}\n`;
console.error(errorLog.trim());
fs.appendFileSync(logFileName, errorLog);
// Webhook側にも明示的にエラーを返す
return res.status(400).json({
error: "Invalid action",
action,
received: req.body,
});
}
// 注文処理の呼び出し
const result = await sendOrder({ symbol, qty, action });
// 成功ログ
const successLog = `[${timestamp}] ✅ 注文成功: ${JSON.stringify(
result,
)}\n`;
console.log(successLog.trim());
fs.appendFileSync(logFileName, successLog);
res.status(200).send("Order sent");
} catch (err) {
// エラーログ
const errorInfo = err.response?.data || err.message || err;
const errorLog = `[${timestamp}] ❌ 注文エラー: ${JSON.stringify(
errorInfo,
)}\n`;
console.error(errorLog.trim());
fs.appendFileSync(logFileName, errorLog);
res.status(500).send("Order failed");
}
});
// サーバー起動(ポート3000)
app.listen(3000, () => {
console.log("🚀 Webhook サーバー起動中(ポート 3000)");
});
🔎 ログがあると助かるケース
| 状況 |
問題 |
ログがあれば |
| 発注できない |
API が失敗しても無反応 |
原因メッセージが残る |
| データが欠けてる |
symbol や qty が null |
通知内容を検証できる |
| API トークン切れ |
403 エラーで失敗 |
再認証が必要と気づける |
✅ 実際に送ってログを確認してみよう
ここまで設定ができたら、実際に
curl
や
TradingView
(TV)から
Webhook
通知を送ってみましょう。
送信が成功していれば、logs/ フォルダ内に日時付きのログファイルが自動で作成されているはずです。
ログファイルができていれば、
Webhook
受信 → 注文処理 → ログ保存までが正しく動いている証拠です。
💡 発展型として作成されたログを
Slack
に自動送信するようにすれば、出先やスマホからでもリアルタイムで状況を把握できて便利です。
このあたりの連携方法は、今後のステップであらためてご紹介していきます。
おわりに|ここまでで基本はOK!でも…
今回の手順で、
Webhook
受信 → 注文処理 → ログ保存 の最小限の
自動売買
環境は完成しました。
個人でここまで構築できるのは本当にすごいことです🎉
ただし、安定運用するにはまだ工夫が必要です。
ここからは少しハードルが上がりますが、ひとつずつ押さえておくと安心です:
VPS 環境
VPS
を使えば、停電や自宅ネットワーク遮断でも 安定稼働・注文が継続可能です。リモート操作やシステム監視の知識が求められます。
👉️ Xserver Windows VPS の登録手順はこちら
Slack でスマホでも約定・ログ管理
Webhook
→
Slack
API
を組み合わせれば、外出先でも注文状況やエラーをリアルタイム監視可能。 Bolt
トークン
管理、
JSON
フォーマットの整備が必要です。
Cloudflare
外部公開 URL を安全に運用するために必要。
DNS 設定、SSL/TLS 暗号化、WAF(Web Application Firewall)による不正アクセス防止などにより、安全で安定した
Webhook
受信環境を構築できます。
👉 Cloudflare Tunnelで自動売買環境を安定公開する
PM2 での永続化・死活監視
Node.js
サーバーをクラッシュや再起動後も自動復帰(死活監視)させ、ログローテーションやプロセスマネジメントを
PM2
で管理できます。
エラーハンドリングやリトライ処理の強化
API
呼び出し失敗タイムアウト時や
ポジション
管理の不備に備えて retry 機能や promise チェーン制御、タイムアウト設定など、コード設計の工夫が必要です。
💡 本シリーズの無料ステップはここまで。
「もっと安定した環境で動かしたい」という方は、KFO(環境構築代行)もご活用ください。
👉 KFO(Kabutech Flex Order) 環境構築代行サービス詳細はこちら