「株テック | Kabutech Lab.」は、日本株トレードを初心者向けに解説するメディアです。

ツールの使い方や考え方、環境構築方法を学ぶ場として、主に以下の内容を解説しています:

  • TradingViewを使ったバックテスト・ストラテジーの実践情報
    (プログラミング知識がなくても始めやすい検証ツールです)
  • 三菱UFJ eスマート証券のkabu APIを使った環境構築
    (日本株の発注が可能な数少ないAPI接続サービスです)

バックテストは自作プログラム(Pandasなど)で応用可能、発注は他の証券会社のRSSなどでも対応できます。
特定の証券会社やツールを強く推奨するものではありません。

以下の点にご留意ください:

  • 個別銘柄の売買や投資判断の助言は行いません。
  • サンプルのストラテジーやコードは学習・検証用の参考資料であり、実際の売買や利益を保証しません。
  • バックテストは過去データに基づく結果であり、将来の成果を保証しません。
  • 自動売買環境はエラーハンドリングと十分な整備が必須です。
  • 市場変動、システム障害、予期せぬ遅延やエラーなどのリスクがあります。

投資はあくまで自己責任です。リスクを理解して慎重に取り組んでください。

当サイトでは一部アフィリエイト広告を利用しています (プライバシーポリシー)。

ご質問はこちらまでお気軽にどうぞ。

TradingViewのWebhookとkabu APIを連携して株を自動発注 | Node.jsで処理実装・ログ対応ガイド

更新情報

自動売買環境構築シリーズを刷新しました(✅ 旧版購入者様への特典あり)

この度、 自動売買 環境構築シリーズを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/    // モジュール群

💡 ※本シリーズ内容は「注文処理の構成・学習用サンプル」です。 実運用前に必ずテスト環境または小額で動作確認を行ってください。

🔧 今回の流れ

  1. すでにある send-order.js を再利用可能な関数形式にする
  2. 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 コマンドを使って、実際に通知が届いたときと同じ形式のリクエストを送って動作確認してみましょう。

  1. ポート 3000(server.js)を外部公開

    lt --port 3000
    

    💡 lt --port 3000 の実行で表示された URL を、下記の https://your-url.loca.lt の部分に置き換えてください。
    localtunnel の使い方は、前回記事でも紹介しています。

  2. リクエスト送信テスト

    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) 環境構築代行サービス詳細はこちら

🧭 はじめての方へ:基礎 → 実践 → 設計 → 検証 → 理論。最短で再現性に辿り着くためのロードマップ
👉️ Kabutech Lab.のおすすめの進め方

自動売買環境構築 無料学習ステップ一覧

本シリーズは、自動売買環境構築を基礎から応用まで実践的に学べる構成です。
STEP1: 体験 → STEP2: 事前ガイド → STEP3以降: 実践活用

※ 環境構築からVPS設定・Cloudflare・Slack連携などすべて丸投げで代行するプランもあります

📈 【無料】テクニカル分析

テクニカル指標をTradingViewで実践活用

詳しく見る

🛠️ 自動売買の構築

TradingView, kabu API を使った環境構築

詳しく見る

📊 戦略設計

戦略を検証し、改善するための手法と実装

詳しく見る

🔧 ストラテジー作成

Pineスクリプトでの戦略実装をガイド

詳しく見る

📦 システム拡張

Slack連携/プロセス監視で安定・拡張

詳しく見る
背景画像
「戦略が、自律する。」