Communityコーディング&開発github.com

bhardwajaditya/trader-in-broker

インド株(NSE、BSE)の注文を執行するためのツールです。/trader-in-riskで承認された注文を、Zerodha Kite(デフォルト)またはUpstox向けに変換し、明示的な許可なしには何も送信しません。

trader-in-broker とは?

このスキルは、インドの株式ブローカー(Zerodha KiteまたはUpstox)を介して実際の注文を執行するための厳格なゲートウェイです。注文が実際に市場に出るには、/trader-in-riskによるリスクチェック合格、`config.json`での`paper: false`設定、ユーザーによるチャットでの明示的な承諾、そして各`place_order`呼び出しに対するClaudeのAllow onceカードのクリックという4つの条件をすべて満たす必要があります。 特に、インドのブローカーがブレケット注文を提供しなくなったため、1つの取引(エントリー、ストップ、ターゲット)は3つの注文(エントリーの買い、SL-Mストップ、LIMITターゲット)に分割され、ストップとターゲットはリンクされておらず(OCOではありません)、いずれかが約定したら他方をキャンセルする必要がある点が重要です。各チケットは、推定コスト(手数料、STT、印紙税、GST)とストップ時の最大損失をルピー表示します。 デフォルトではペーパートレーディングモードで動作し、ローカルのシミュレーション元帳に取引を記録します(インドのブロッカーにはペーパー口座がないため)。ライブモードにするには、`paper: false`の設定とユーザーの明示的な承諾が必要です。また、MIS(日内)取引は、ブローカーによる自動スクエアオフ(約15:20 IST)よりも前の15:10 ISTまでに、`flatten`コマンドで強制的に決済する必要があります。 このスキルはClaude CodeとClaude Desktopの両方で動作し、APIキーやトークンがチャットに漏洩しないように設計されています(Zerodha Kiteのセットアップでは、ユーザーは自分のMCPサーバーを実行し、ブラウザ経由でログインします)。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/bhardwajaditya/day-trader-skill-india/tree/main/trader-in-broker

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

trader-in-broker は何をしますか?

Order Executorは、このパックの中で実際の注文につながる可能性がある唯一のスキルであるため、最も厳格です。注文が市場に届くのは、毎回、すべての注文に対して、以下のゲートを通過した場合のみです。

  1. trader-in-riskが本日、この正確な注文を承認した(フィンガープリントで照合。trader-in-risk/check.pyと同じORDER_FIELDSとハッシュ)。
  2. trader-in/config.jsonで"paper": false。ペーパーモード(デフォルト)では何も送信されず、約定はローカルのシミュレーション元帳に記録されます。
  3. ユーザーがチャットでこの注文に対して明示的な承諾を入力した。
  4. ユーザーがClaudeの許可カードで「Allow once」をクリックした(place_order呼び出しごとに)。これは、注文ツールが「承認が必要」に設定されているためです。

承諾がなければ、注文は発行されません。承諾は1つのチケット(その買い注文、およびストップ注文とターゲット注文のレッグ)をカバーし、バッチでは扱いません。

${CLAUDE_SKILL_DIR} はこのスキルのフォルダ(このSKILL.mdがある場所)です。

python3 "${CLAUDE_SKILL_DIR}/ticket.py" show                      # すべてのチケットを表示(READYかどうかに関わらず)
python3 "${CLAUDE_SKILL_DIR}/ticket.py" approve --index 1 --reply "yes"
python3 "${CLAUDE_SKILL_DIR}/ticket.py" paper-fill --index 1 --price 1196.30           # ペーパーモード:買い
python3 "${CLAUDE_SKILL_DIR}/ticket.py" paper-fill --symbol RELIANCE --side sell --qty 12 --price 1212.70 --leg target
python3 "${CLAUDE_SKILL_DIR}/ticket.py" paper                     # ペーパー元帳と損益を表示
python3 "${CLAUDE_SKILL_DIR}/ticket.py" result --index 1 --leg entry --status placed --broker-id ID --filled-qty 12 --filled-price 1196.30
python3 "${CLAUDE_SKILL_DIR}/ticket.py" result --index 1 --leg stop --status placed --broker-id ID
python3 "${CLAUDE_SKILL_DIR}/ticket.py" fill --symbol RELIANCE --side sell --qty 12 --price 1212.70 --leg target
python3 "${CLAUDE_SKILL_DIR}/ticket.py" flatten --symbol RELIANCE --qty 12
python3 "${CLAUDE_SKILL_DIR}/ticket.py" log

ticket.pyはブローカーと通信しません。チケットをレンダリングし、返信がその注文に対する実際の承諾であるかどうかを確認し、ペーパー元帳を管理し、フラットンチケットを作成し、ログをtrader-in/state/broker.jsonに保持します。--now "2026-10-27 10:15"(または単に10:15)でISTの時刻を固定できます。シンボルはRELIANCE、RELIANCE.NS、NSE:RELIANCE、M&M、BSE:500325、500325.BOとして受け入れられます。

読み取りと書き込みの対象

ファイル内容
trader-in/orders.json提案された注文(trader-in-budgetが書き込み、flattenが置き換えます)
trader-in/config.jsonbroker(kiteまたはupstox)、paper、product、flat_by、costs、capital_inr
trader-in/state/risk.jsontrader-in-riskの判定結果。本日のPASSのみがREADY
trader-in/state/broker.jsonすべての承諾、拒否、発注、レッグ発注および約定。各エントリの最大損失(コスト込み)を含む
trader-in/state/paper.jsonペーパー元帳:現金、オープンポジション、クローズドトレード、推定コスト控除後の実現損益
trader-in/portfolio.json現金と株式(ポジションはRELIANCE.NSのようなsymbolでキー付けされ、exchangeを含む)
trader-in/plan.jsonflattenのためのフラットバイ時間
trader-in/universe.json(Upstox用)スキャナーからのISIN(存在する場合)
trader-in/state/EQUITY_L.csv(Upstox用)NSEの株式リスト。ISINが必要なときに一度ダウンロードされます

1トレード、3つの注文(ブレケット注文を読む前に毎回確認)

trader-in-budgetは1つの「ブレケット」(エントリー、ストップ、ターゲット)を書き込みます。ZerodhaとUpstoxはこれに対してブレケット注文を提供しなくなったため、チケットはそれを以下のように変換します。

レッグ注文タイミング
1エントリー価格での買い指値(または成行)、MISまたはCNC今
2SL-Mでの売り、trigger_price = ストップ価格レッグ1が約定した後のみ
3ターゲット価格での指値売りレッグ1が約定した後のみ

レッグ2と3はリンクされていません(OCOではありません)。 一方が約定しても、もう一方は有効のままです。すぐにキャンセルしないと、ユーザーが空売り状態になる(MISの場合)か、注文が拒否される(CNCの場合)可能性があります。/trader-in-alertsはストップとターゲットの価格レベルを監視し、いずれかに達したときに警告を発します。レッグ1が約定する前に発注された場合、レッグ2と3は単なる売り注文となり、空売りを開始する可能性があります。

すべてのチケットは、推定コスト(仕様§6:MISのレッグごとの手数料 min(₹20, 0.03%)、STT、取引所手数料、SEBI手数料、印紙税、18% GST)と、ストップ時の最大損失(往復コストを含む) を表示します。同じ数値は、trader-in-riskの日次損失制限のために記録されます。コストは常に推定値です。実際のコストは契約通知書に記載されています。

ペーパートレーディング(デフォルト)

インドのブローカーにはペーパー口座がないため、ペーパートレーディングはtrader-in/state/paper.jsonのローカル元帳で行われます。どこにも送信されません。

  1. ticket.py showでREADYなチケットを表示し、ユーザーが承諾し、ticket.py approveを実行します。
  2. エントリー価格で取引が成立したら、ticket.py paper-fill --index N(指値価格)または--price Pを実行します。買い指値は、その指値以上では約定しません。
  3. ストップまたはターゲットで取引が成立したら、その1つの売りを記録します:paper-fill --symbol RELIANCE --side sell --qty 12 --price 1188.10 --leg stop。元帳は総損益、推定往復コスト、および純損益を記録します。
  4. ticket.py paperは現金、オープンポジション、および実現損益を表示します。

ペーパーエントリはplacedとして記録され("paper": true)、trader-in-riskはそれをライブ取引とまったく同じように、1日あたりのトレード数と日次損失制限に対してカウントします。

セットアップA: Zerodha Kite(公式MCPサーバー)— デフォルト

Zerodhaのサーバーは github.com/zerodha/kite-mcp-server(MITライセンス、Go)です。2026-10-27時点のソースとREADME(最新コミット5e044dc、タグv0.4.0-dev24)で確認済みです。

ホスト型サーバーは注文を発注できません。 READMEには、ホスト型のhttps://mcp.kite.trade/mcpは「セキュリティ上の理由から、破壊的な取引操作を除外している」と記載されており、Zerodha自身のページでは読み取り専用と説明されています(1つのZ-Connectの投稿ではGTT注文が例外であるとされていますが、スコープは時間の経過とともに変更されているため、接続後にClaudeのツールリストで確認してください)。無料でAPIキーは不要です。loginツールはKiteのリンクを返し、ユーザーは自分のKiteパスワードと2FAを使用してブラウザでログインします。チャットでログインすることはありません。

ホスト型、読み取り専用(相場、保有銘柄、ポジション、証拠金、注文、履歴):

  • Claude Desktop: 設定 > 開発者 > 設定を編集 で、claude_desktop_config.example.jsonから"kite"ブロックを追加します(npx mcp-remote https://mcp.kite.trade/mcpを実行します。Node.jsが必要です)。再起動します。
  • Claude Code: claude mcp add --transport http kite https://mcp.kite.trade/mcp(または同じnpx mcp-remoteコマンドをstdioサーバーとして:claude mcp add kite -- npx mcp-remote https://mcp.kite.trade/mcp)。

Claudeを介して注文を発注するには、ユーザーは自身のコピーのサーバーを自身のKite Connectアプリで実行する必要があります。

  1. developers.kite.tradeでKite Connectアプリを作成します(現在の価格はそこで確認してください)。リダイレクトURLはローカルサーバーのコールバックを指す必要があります。サーバーソースでは、コールバックパスはAPP_HOST:APP_PORT(デフォルトはhttp://localhost:8080/callback)上の/callbackです。このエンドツーエンドのテストは行っていません。
  2. 2026年4月1日以降、Zerodhaのサポートページによると、APIによる注文発注にはZerodhaにホワイトリスト登録された静的IPが必要です(NSE/SEBIのリテールアルゴルール)。静的IPのない自宅の接続では、注文が拒否される可能性があります。ライブで使用する前に、Zerodhaの現在のルールを確認してください。
  3. ビルド:git clone https://github.com/zerodha/kite-mcp-server && cd kite-mcp-server && go build -o kite-mcp-server(Go 1.21以上)。
  4. claude_desktop_config.example.jsonから"kite-orders"ブロックを追加します。バイナリへのフルパス、APP_MODE stdio、そしてユーザーはKITE_API_KEYとKITE_API_SECRETをそのファイル自体に入力します。Claude Codeの場合:claude mcp add kite-orders -e APP_MODE=stdio -e KITE_API_KEY="$KITE_API_KEY" -e KITE_API_SECRET="$KITE_API_SECRET" -- /full/path/to/kite-mcp-server。値は事前にユーザー自身のシェルでエクスポートしておきます。両方が必要でない場合は、kite / kite-ordersのいずれか1つだけを保持します。
  5. 再起動し、Claudeにloginを呼び出すよう依頼します。ユーザーはリンクを開いてログインします。Kiteセッションは毎日期限切れになります(Kite Connectアクセストークンは翌朝まで有効)。したがって、毎取引日に再ログインすることを想定してください。

キーとトークンはチャットに入力しないでください。 それらを要求したり、設定ファイルを会話に読み戻したりしないでください。ユーザーがキーやトークンを貼り付けた場合は、そのメッセージを削除し、developers.kite.tradeで再生成するように指示してください。

ツールの権限。 カスタマイズ > コネクタ(Claude Desktop)で、Kiteサーバーを開き、以下を設定します。

  • place_order、modify_order、cancel_order、place_gtt_order、modify_gtt_order、delete_gtt_order:承認が必要。常に許可しないでください。
  • 読み取り専用ツール(get_profile、get_margins、get_holdings、get_positions、get_orders、get_order_history、get_order_trades、get_trades、get_gtts、get_quotes、get_ltp、get_ohlc、get_historical_data、search_instruments、login):常に許可で問題ありません。
  • Claude Codeでは、.claude/settings.jsonでそれらをaskに保持します:"permissions": {"ask": ["mcp__kite-orders__place_order", "mcp__kite-orders__modify_order", "mcp__kite-orders__cancel_order"]}。注文ツールをallowに入れないでください。サーバーは読み取り専用コピーとしてEXCLUDED_TOOLS=place_order,modify_order,cancel_orderも受け入れます。

place_orderの引数(サーバーソースから):variety(regular)、exchange(NSE/BSE)、tradingsymbol、transaction_type(BUY/SELL)、quantity(整数)、product(MIS/CNC)、order_type(MARKET/LIMIT/SL/SL-M)、price(LIMIT、SL)、trigger_price(SL、SL-M)、validity(DAY)、オプションのtag(≤ 20文字。チケットはtrin + フィンガープリントの16進数12文字を追加して、後で注文を見つけられるようにします)。サーバーのツールにはmarket_protection引数はありません。NSEは現在、APIのMARKETおよびSL-M注文にマーケットプロテクションを適用しているため、成行注文はブローカーによって保護された指値注文に変換される場合があります。指値エントリーはこれを回避します。BSEの場合、Kiteのtradingsymbolはスクリプト名であり、数値コードではありません。search_instrumentsで検索してください。

セットアップB: Upstox("broker": "upstox")

  • Upstoxの公式MCPサーバー(https://mcp.upstox.com/mcp、upstox/upstox-plugin-marketplaceプラグインのupstox-mcpからインストール)は読み取り専用です。Upstoxのページでは、これを介して注文を発注することはできないとされています。接続は毎日期限切れになります(ブラウザでのOAuth同意)。
  • Upstoxの公式エージェントスキル(/plugin install upstox-skill@upstox-plugins-official(Claude Codeで。事前に/plugin marketplace add upstox/upstox-plugin-marketplaceを実行))は、v3注文APIで注文を発注できます。これは、UPSTOX_ACCESS_TOKEN環境変数(ユーザーが自分のシェルで設定し、チャットでは決して設定しない)から日次アクセストークンを読み取り、独自のプレビューを表示し、確認を待ちます。Upstoxは、プレーンなClaude Desktopチャットでは実行されないと述べています。
  • または、ユーザーはチケットからUpstoxアプリで注文を発注します。

チケットは、POST https://api-hft.upstox.com/v3/order/place(v2の/v2/order/placeは非推奨とされています。sliceを除いて同じフィールドを受け入れます)の本文を出力します:quantity(整数)、product(I イントラデイ = MIS、D デリバリー = CNC)、validity DAY、price(MARKET / SL-Mの場合は0)、instrument_token、order_type、transaction_type、disclosed_quantity 0、trigger_price(SL / SL-M以外は0)、is_amo false(Upstoxは無視します)、tag、およびmarket_protection: -1(自動)。MARKETおよびSL-Mの場合。APIの成行注文では0は拒否されるためです。

instrument_tokenはNSE_EQ|<ISIN>(またはBSE_EQ|<ISIN>)です。ISINは、優先順に、--isin、注文内のisin、trader-in/universe.json(スキャナーから)、またはNSEのEQUITY_L.csv(一度ブラウザのUser-Agentを使用してtrader-in/state/EQUITY_L.csvにダウンロード。archives.、次にnsearchives.)から取得されます。 BSEの制限: NSEリストはNSEシンボルのみをマッピングします。500325.BOのようなBSEスクリプトコードはマッピングできないため、--isinを渡してください。.BO名のシンボルの場合、NSEリストのISINが使用されます(同じ会社)。ただし、確認してください。ここではUpstoxのインストゥルメントファイル形式を検証していません。ISINがない場合、ライブのUpstoxチケットはREADYになりません。ペーパーチケットにはISINは必要ありません。

手順:エントリー

  1. ticket.py showを実行します。READYなチケットのみがユーザーに表示されます。READYでもBLOCKEDでもないチケットは、/trader-in-riskに戻されます(broker JSONがありません)。
  2. 1つのチケットを表示し、OCOではないという警告を含めて、「この注文を発注しますか?「はい」または「いいえ」で答えてください。」と尋ねます。質問ごとに1つの注文です。「すべてにはい」を提供しないでください。
  3. ticket.py approve --index N --reply "<ユーザーの返信を一字一句そのまま>"を実行します。「記録されませんでした」は、返信がこの注文に対する明示的な承諾ではなかったことを意味します(「もちろん」、「ハーン」、「すべてにはい」、別の銘柄や数量を指定した承諾など)。再度尋ねてください。決して自分で返信を承諾に変換しないでください。
  4. ペーパーモード: 上記のようにpaper-fillを実行します。ライブ、Kite: レッグ1のJSONを正確に使用してplace_orderを呼び出します。ユーザーはAllow onceをクリックします。約定を確認し(get_order_history / get_positions)、次にレッグ2のplace_order、次にレッグ3を、それぞれ独自のAllow onceとともに行います。ライブ、Upstox: 同じ順序で、1レッグずつ、本文をUpstoxエージェントスキルまたはアプリに渡します。
  5. 各ライブレッグを記録します:ticket.py result --index N --leg entry|stop|target --status placed|denied|failed --broker-id <id>(エントリーには--filled-qty、--filled-price)。エントリーのみがtrader-in-riskの注文としてカウントされます。レッグはleg_placedとして記録されます。失敗した注文は、新しいチェックと新しい承諾なしには再試行されません。

手順:オープン中、およびflat_byまでに決済

  • /trader-in-alertsはストップ、ターゲット、およびフラットバイ時間を監視します。
  • ストップまたはターゲットが約定した場合:ライブでは、ticket.py fill ... --leg stop(他のレッグを今すぐキャンセルするように促します。get_orders、次にcancel_order、承認が必要)。ペーパーモードでは、paper-fill ... --leg stopを実行します。
  • flat_by(デフォルト15:10 IST)までに、まだオープンしているものはすべて決済されます。ブローカーは約15:20 ISTからオープンなMISポジションを自動スクエアオフし、それに対して手数料を請求します(Zerodhaは1注文あたり₹50 + GSTとしています)。そのため、彼らに任せないでください。
    1. ライブ:ブローカーに何株保有しているか尋ねます:get_positions(読み取り専用)。
    2. ticket.py flatten --symbol RELIANCE --qty 12は、MARKET売り(同じ商品)をtrader-in/orders.jsonに書き込みます。

...(以下省略)

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

bhardwajaditya/trader-in-alerts

Price Alerts for Indian stocks (NSE, BSE). Rings when a price, a stop or the opening bell hits. Turns the trade plan into three alerts in one go (the stop, the target and "flat by" at your flat-by time, 15:10 IST by default, before brokers square off MIS at about 15:20), plus above / below / stop / target levels in rupees, percent moves from the previous close for stocks and for Nifty, Bank Nifty or Sensex, any time of day, the 09:15 IST opening bell and the 09:00 pre-open, each ringing once so you are not spammed. Reminds you that the stop and target are separate orders at Zerodha, Upstox and other Indian brokers (no OCO for MIS): when one fills, cancel the other. Knows NSE hours in IST with the 2026 NSE holidays, the Budget-day and Muhurat special sessions, fetches free delayed Yahoo quotes for .NS / .BO tickers one at a time, and writes trader-in/prices.json (INR) for sizing and the risk check. Use when the user says "alert me when", "tell me if Reliance hits 1,200", "watch my stop", "watch my trade",…

bhardwajaditya/trader-in-news

News Monitor for Indian stocks (NSE / BSE). Tracks breaking news on every stock you watch and flags what moves it: Yahoo Finance and Google News (India edition) headlines, each company's exchange corporate announcements on NSE with a BSE fallback (financial results, board meeting outcomes, dividends, buybacks, acquisitions, credit ratings, KMP resignations and appointments, insider trading / SAST, promoter pledges, fund raising) and how far each stock is from the previous close in rupees. Shows only what is new since the last check, newest first, in IST, tags each item (earnings, analyst, deal, capital, people, halt, regulatory, macro...) and never repeats one. Use when the user says "any news on Reliance", "why is TCS moving", "news on my Nifty watchlist", "morning briefing", "pre-market news", "check NSE announcements", "any corporate announcements", "did HDFC Bank file anything", "monitor the news on my Indian stocks", or after /trader-in-scanner finds setups.

関連スキル