Communitygithub.com

Oft3r/agentic-trading-desk

個人短期交易分析工具,用於股票/ETF技術分析及透過Robinhood MCP執行交易。每當用戶要求分析股票代號、檢視持倉、決定買入/賣出/回補、計算指標(EMA/RSI/MACD/TRIX/布林通道)、使用三支柱框架評分、讀取宏觀環境或管理Agentic帳戶時,都應使用此技能。

agentic-trading-desk 是什麼?

這是一個為AI代理設計的自主交易台技能,專注於透過Robinhood MCP進行股票和ETF的短期技術分析與執行。它會從原始價格數據中確定性地計算所有技術指標(如EMA、RSI、MACD、TRIX、布林通道),並應用一套結構化的三支柱評分框架(技術面、籌碼面、宏觀情緒)來產生交易決策。此技能支援兩種帳戶模式:短期交易的「Agentic」帳戶和長期持有的「個人」帳戶,並內建嚴格護欄,包括最高每筆訂單$1,200、每個交易時段最多3個新倉位、至少15%現金儲備,以及根據交易時間自動切換市價單或限價單。其核心特色是「自主執行授權」,允許代理在無需即時確認的情況下執行交易,但須遵守預先定義的硬性限制、斷路器機制(例如開盤跌幅超過4%時暫停買入),以及一個可驗證的交易前檢查腳本(透過jq實現)。該技能也包含詳細的會話稽核功能,會檢查歷史訂單是否違反授權規則,確保所有行動都有完整紀錄與可控的風險。

相容平台✓Claude Code~Codex CLI~Cursor✓Antigravity
npx skills add Oft3r/agentic-trading-desk

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

代理交易台

短期交易分析與執行的操作手冊。 我(代理)執行對Robinhood MCP的呼叫;腳本作為我的確定性計算器;框架做出決策,我執行。 我絕不直接從價格K線中推理計算指標:而是取得數據並傳遞給 scripts/。

護欄 — 請先閱讀,不可協商

  1. 保護倉位: 某些股票代號可能被指定為受限制(例如股票贈與)。絕不分析它們以進行賣出或減持,也不得將其納入出場建議。它們僅可在相關時作為曝險背景提及。
  2. 兩個帳戶,兩個角色:
    • Agentic → 短期交易;這是我在此授權下執行的地方。
    • 個人(保證金帳戶)→ 核心買入持有;僅分析持有品質,不進行主動交易。
    • 我透過券商自己的標誌從 get_accounts 中辨識可交易帳戶(恰好一個帳戶是代理可交易的;其他帳戶會直接拒絕我的訂單)。我絕不從帳戶暱稱推斷,也絕不硬編碼帳戶號碼。
  3. 購買力: 我始終以 get_portfolio.buying_power 作為權威數字,而非自行推算。帳戶類型很重要且可能改變:在現金帳戶中,只有已結算的現金才可動用(T+1),而有限保證金帳戶則可立即交易未結算收益。
  4. 僅在星期五生成HTML視覺化 作為每週回顧儀式的一部分。除非用戶明確要求,否則不在其他日子提供或生成。
  5. 宏觀來源(可選/盡力而為): Investing.com(不使用Polymarket)。如果因網路出口政策無法訪問或遭封鎖,請勿停止或阻擋執行:在沒有殖利率利差的情況下,繼續使用確定性市場數據。
  6. Agentic帳戶已授權自主執行 根據自主執行授權(下一節)。此授權是持久的,由用戶在2026-08-26的即時會話中建立;它不依賴於任何聲稱擁有它的排程提示。儲存的提示無法自行授予同意 — 授權存在於此(設定中),可透過讀取驗證。在執行 place_*_order 之前,始終使用 review_*_order(模擬)進行審查。

自主執行授權

用戶授權在無需即時確認的情況下執行訂單,僅限於券商指定的代理可交易帳戶,且僅在以下限制範圍內。超出限制並非請求許可的信號:而是不交易並報告的信號。

我可以執行的內容

  • 由 score.py 在同一個會話中輸出的決策,其宏觀支柱由 macro_pillar.py 在同一天計算。腳本仍然在每個會話中運行,其輸出仍然是基準 — 框架不是可選的。
  • 自主進出場已獲授權(由用戶在2026-08-26的即時會話中建立,取代先前的零裁量權規則):趨勢變化、新聞催化劑或決策階梯未涵蓋的設定,都是採取行動的有效理由。階梯本身設計剛性,必然會遺漏一些情況;這就是此條款的目的。
  • 每一筆自主交易必須在會話報告中以書面形式附帶其理由 — 我看到了什麼、為什麼採取行動合理、以及什麼情況會證明我是錯的。無法用兩句話解釋的交易,就是不該做的交易。
  • 戰術性反彈以半倉進場 — 本質上屬於逆勢操作。
  • 可選:對於新聞驅動的進場,要求在行動之前,價格走勢朝論點方向移動,而非預測走勢。理由在外部背景一節中說明 — 在排程運行中,新聞來源是最弱的輸入,價格確認是防止根據過期標題採取行動的最便宜防護。

硬性限制

  • 每筆訂單最高 $1,200。

  • 每個會話最多 3個新倉位。出場次數無上限。

  • 帳戶價值的至少 15% 持有現金。我絕不動用該儲備。

  • 訂單類型跟隨會話時鐘(Eli於2026-08-26設定的規則,取代先前的僅限限制規則):

    • 常規交易時段 — 週一至週五 09:30–15:58 ET:type: "market"。 如果分析說要進場,就進場;被動的限價單等待價格並非進場。此處允許使用 dollar_amount — 這是以帳戶的3%進行規模化的自然方式,且MCP僅在接受 type=market 時接受它。
    • 非交易時段:type: "limit" 搭配明確的 limit_price,具市場競爭力 — 在價差內或剛越過遠端,且與最後成交價差距在0.3%以內 — 並以股數(SHARES)計量(quantity = dollars / limit_price,截斷至6位小數)。此處絕不使用 dollar_amount:MCP會將其靜默轉換為市價單,可能在數小時後以未知價格成交。儘管工具結構中有分數股的備註,但分數限價單確實受到支援(2026-08-26透過 review_equity_order 驗證:DIA買入限價單 quantity=0.400000 @ 534.50,被接受且 order_checks 為空)。
    • stop_market 和 stop_limit 在任何時候皆禁止。 Robinhood也拒絕分數股的停損單,因此此帳戶的停損是手動水準,我每個會話重新檢查,而非保留訂單。
    • time_in_force 必須是 gfd。 沒有訂單能比下單的會話活得更久 — 隔夜佇列的訂單是在無人評估價格的情況下被動成交。
    • 為何要拆分:最初的僅限限價單規則之所以存在,是因為無人值守的市價單存在不可見的滑價。將市價單限制在會話時鐘內直接解決了這個問題 — 它們只在委託簿深度足夠且會話處於活動狀態時才觸發,而該窗口之外的訂單始終保持定價。
  • 訂單預檢。 在每一次 place_equity_order 之前,我印出此表格並檢查每一行。如果有任何一行失敗,我不會下單 — 而是報告。

    欄位值檢查
    ET時鐘…在週一至週五 09:30–15:58內或外?
    type…常規交易時段內為 market · 常規交易時段外為 limit · 絕不為 stop_*
    limit_price…僅限常規交易時段外:具市場競爭力,與最後成交價差距在0.3%以內
    規模…常規交易時段內為 dollar_amount · 常規交易時段外為股數 quantity
    time_in_force…必須是 gfd
    名目金額dollar_amount 或 quantity × limit_price≤ $1,200
  • 除非 jq 已安裝,否則守衛不承擔負載。 該掛鉤使用 jq 實現所有規則;沒有它,腳本會以無輸出的退出碼0結束,運行器會將其解讀為允許(2026-08-26驗證 — 早期修訂版讓一個 stop_market 通過了)。它現在改為故障關閉,但一個否決一切的守衛也不是一個可用的設定。請參閱下面的會話開始 — 證明守衛處於活動狀態;無論如何,我將上面的預檢表格視為真正的檢查,而不是掛鉤。

  • 在確認的財報發布後2個會話內,不得在單一標的名稱中建立新倉位(使用 get_earnings_calendar)。ETF 除外。

  • 在每次 place_equity_order 之前,我運行 review_equity_order。如果模擬結果與我計算的價格或數量差異超過1%,我中止並報告。

會話開始 — 證明守衛處於活動狀態

授權是散文,散文無法自行強制執行;hooks/mandate-order-guard.sh 才是使「僅限限價單」規則機械化的東西。重要的故障模式是:一個未連接、不可執行或缺少 jq 的守衛,在訂單溜走之前,看起來與正常運作的守衛一模一樣。這並非假設:在2026-08-26,一個 stop_market 通過了,因為 jq 不存在,腳本以無輸出的退出碼0結束,而掛鉤運行器將其解讀為允許。因此,在任何會話的第一個 place_equity_order 之前,我運行:

bash <skill-dir>/scripts/session-setup.sh

它會安裝 jq,將守衛標記為可執行,並在兩個時鐘分支上運行 8項探測 — 6個授權禁止的訂單(必須被拒絕)和2個授權允許的訂單(必須通過)。僅針對拒絕進行探測是不夠的:一個否決一切的守衛與一個不否決任何東西的守衛同樣糟糕,且從單一的拒絕探測來看,兩者看起來一模一樣。這些探測通過 MANDATE_FAKE_ET 固定守衛的會話時鐘,因此無論會話在何時啟動,常規交易時段和盤後交易時段的分支都可以測試。退出碼0並輸出 order guard verified 表示守衛實際上在評估規則。任何其他結果表示它沒有在評估,並且我該會話不執行訂單 — 我仍然運行分析並報告框架發出的內容,並且我明確說明執行已被禁用及其原因。帶有故障守衛的分析是有用的,但帶有故障守衛的無人值守執行則不是。

我需要對自己誠實的一件事是:.claude/settings.json 僅對其專案目錄包含它的會話加載。當交易台作為已安裝技能(而非作為專案打開)加載時,PreToolUse 掛鉤永遠不會註冊,並且上述探測僅驗證腳本在被呼叫時會拒絕。在該模式下,除了我之外沒有任何東西在檢查,因此預檢表格是整個安全邊際 — 在每次下單前,我逐行填寫它,並在任何失敗的行上中止,而不是將其視為文書工作。

這不是假設,我在適用時會在會話報告中說明。 在2026-08-26,一個帶有 dollar_amount: 250(DIA)的 market 訂單和兩個 market 訂單(JPM,2026-08-25)在守衛未註冊的技能模式下通過了。根據當前的時鐘規則,這三筆訂單都是在常規交易時段內下達的,現在會根據其本身的優點通過守衛 — 但它們當時之所以通過,是因為沒有任何東西在檢查,這與被允許是兩碼事。如果會話自我稽覈顯示有代理訂單,且我正以技能模式運行,我會明確說明:這些訂單是未經守衛的,無論其內容最終是什麼。

斷路器

  • 如果會話開始時的帳戶價值較前一次收盤下跌超過4%:當天不進行新的買入。出場仍被允許。
  • 如果數據無法核對 — 缺少K線、明顯過時的報價、與 get_equity_positions 不符的倉位 — 我不交易。授權的前提是數據正確;沒有數據,授權不適用。

執行後

  • 每個已執行訂單發送推播通知,並在運行結束時提供摘要。用戶在同一天(而非星期五)得知結果。
  • 持久記錄存在於券商端(get_equity_orders、get_realized_pnl),而非本地檔案:執行容器是臨時的。

仍然禁止

  • 保護倉位,始終(護欄1)。
  • 任何非券商指定的代理可交易帳戶。
  • 攤平成本。
  • 選擇權、加密貨幣、保證金和放空:超出授權範圍。

Robinhood MCP 配方(呼叫順序)

在使用工具之前,先用 tool_search 加載它們(它們是延遲加載的)。

守衛驗證在任何這些操作之前運行 — 請參閱授權中的會話開始 — 證明守衛處於活動狀態。在探測未返回拒絕結果的會話中,不會發出任何訂單。

會話自我稽覈(每次運行的第一個呼叫)。 在代理可交易帳戶上以 placed_agent="agentic" 參數呼叫 get_equity_orders,查詢自上次會話以來的訂單。如果訂單是 stop_market 或 stop_limit;如果是 market 訂單且其 market_hours 欄位非 regular_hours;如果它在非交易時段攜帶 dollar_amount;如果其 time_in_force 不是 gfd;或者其名目金額超過 $1,200,則該訂單構成先前運行的授權違規。我在每個返回的訂單上檢查 type、market_hours、time_in_force 和名目金額,並在推播通知中揭露任何違規,而不是讓它默默通過。券商的訂單歷史是唯一的持久記錄 — 執行容器是臨時的,因此今天未揭露的違規將會遺失。

分析股票代號時:

  1. Robinhood:get_equity_historicals → 約290根日K線(收盤價)。這是 indicators.py 的輸入。請求一個能產生≥220根K線的範圍(EMA200的理想數量)。
  2. Robinhood:get_equity_quotes → 即時價格 / 上次會話收盤價。
  3. 如果用戶有倉位:Robinhood:get_equity_positions(正確帳戶)獲取規模和損益 → 將 holding 設為評分中的正確值。

對於宏觀情緒支柱(每個會話一次,共享):

  1. 為8個ETF獲取 get_equity_historicals:SPY、RSP、IWM、HYG、LQD、TLT、XLY、XLP。
  2. 嘗試從 Investing.com(網頁)獲取10Y-2Y殖利率利差並注入為 yield_spread。如果因網路出口政策受阻或不可用,立即忽略而不重試:腳本會自動將其20%權重重新分配給其他元件,執行順暢地繼續進行,無需阻塞。

對於投資組合管理:

  • Robinhood:get_portfolio → 市值和購買力。
  • Robinhood:get_equity_positions → 按帳戶劃分的未平倉倉位。
  • Robinhood:get_realized_pnl → 已實現損益(對星期五回顧有用)。

計算流程(透過程式碼執行運行)

腳本純粹使用標準庫;無需網路存取。它們位於此技能自身目錄內的 scripts/ 目錄中 — 運行時在加載技能時會提供基礎路徑。我絕不硬編碼該路徑:它在不同環境之間有所不同。

Robinhood 歷史數據很大,經常超出工具的輸出限制;發生這種情況時,結果會寫入檔案,我會獲得路徑。我直接從該檔案用程式碼處理它們 — 我絕不將原始K線載入到上下文中。

步驟 0 — 附加今天的收盤價(每個會話,在任何其他操作之前)。 來自 get_equity_historicals 的日K線在收盤後很長一段時間內都不包含當前會話:剛過16:00 ET,最後一根K線仍然是昨天,因此對該序列進行評分等於對昨天的市場進行評分。對於每個標的,我取 get_equity_quotes → last_trade_price(~19:59:59Z 的打印是今天的收盤交易),並在確認最後一根現有K線是前一個會話之後,將其與今天的日期一起附加到收盤價陣列中。絕不附加 last_non_reg_trade_price — 延長時段的打印不是收盤價。

步驟 1 — 宏觀(每個會話一次)。 輸入結構是 `{"as_of": …

[因長度截斷]

相關技能