内容
# 暗影皮层
使用ShadowAlpha MCP和Robinhood MCP的自动股票交易中央决策引擎。 一个简洁、开源、自行托管的模板:它通过一个适配器合约(ShadowAlpha的MCP是参考)吸收来自任何来源的信号,通过可互换的决策策略运行它们,管理开放仓位并具有可自定义的退出逻辑,并通过受保护的执行层路由纸质或实时订单,所有这些都由一个设置文件驱动,即您的策略。
Shadow Cortex首先构建为与 **[ShadowAlpha](https://shadowalpha.ai)** 接口并在其信号上进行交易:分析师预测带有跟踪记录,热点扫描仪,AI信念分析以及您关注的投资组合/策展都通过ShadowAlpha的MCP作为引擎的原生信号馈送。任何其他源都可以通过相同的适配器合约插入。
这是一个 **参考实现和免费赠送**,而非产品或服务。您持有自己的密钥,自己运行,自己承担风险。它不受ShadowAlpha公司的支持。
> **不是投资建议。** 该引擎打印、提出或执行的任何内容都不是建议。您拥有每个上限,每个止损和每个后果,包括选择禁用它们。自动交易可能会迅速亏损。在信任它之前请阅读代码。
## 目录
- [要求](#要求)
- [快速入门(零凭证,真实性无关)](#快速入门零凭证真实性无关)
- [引擎工作原理](#引擎工作原理)
- [仪表盘](#仪表盘)
- [三种场景](#三种场景)
- [您的策略是一个设置文件](#您的策略是一个设置文件)
- [上限模型(在实时使用前阅读)](#上限模型在实时使用前阅读)
- [退出规则](#退出规则)
- [环境变量](#环境变量)
- [连接您的账户(无需终端)](#连接您的账户无需终端)
- [真实使用(先使用模拟)](#真实使用先使用模拟)
- [启用AI决策器](#启用AI决策器)
- [从Claude Desktop驱动引擎(或任何MCP客户端)](#从Claude-Desktop驱动引擎或任何MCP客户端)
- [扩展它](#扩展它)
- [仓库地图](#仓库地图)
- [状态,日志和重置](#状态日志和重置)
- [开发](#开发)
- [故障排除](#故障排除)
- [许可证和免责声明](#许可证和免责声明)
## 要求
- **Node.js ≥ 20** 和npm。 就是这样:演示,测试和仪表板都可以在离线状态下运行,无需凭证和网络。
- 可选,只有当您需要时:ShadowAlpha MCP令牌(实时信号),Anthropic API密钥(AI决策器/叙述器),Robinhood账户(实时监控/交易)。
## 快速入门(零凭证,真实性无关)
### 选项A:让AI为您设置
不熟悉GitHub或终端吗? 将此提示粘贴到可以运行计算机命令的AI编码助手(Claude Code,Cursor等)中。 它安装离线演示并将您的AI变成该引擎的专家:
```text
在计算机上设置Shadow Cortex(一个开源,自我托管的纸质交易引擎模板):
1. 检查是否安装了git和Node.js 20或更高版本;如果缺少,请帮助我安装。
2. 将https://github.com/shadowalpha-ai/shadow-cortex.git克隆到一个合适的目录中。
3. 在该目录中运行:npm install && npm run ui:build && npm run dev(保持运行)。
4. 在浏览器中打开http://127.0.0.1:7777。 此演示使用固定数据:无账户,无凭证,无真实资金。 如果没有交易提案出现,请在“设置”选项卡中取消选中“仅限市场时间”。
5. 在建议我任何事情之前,请成为该引擎的专家。 阅读:README.md; docs/DATAPOINTS.md(每个数据点进入标准都可以); docs/AUTHORING.md(扩展合约); docs/robinhood-discovery.md(实时经纪人集成); CLAUDE.md; 和.claude/skills/edit-strategy/SKILL.md(AI如何安全地编辑策略)。 活动策略文件是profiles/scenario3.json。
6. 然后给我一个游览:仪表板显示的内容,如何确认演示交易以及安全模型(模拟vs实时;执行关闭/确认/自动;我拥有的上限)。 除非我明确要求,否则永远不要连接真实账户,启用实时模式或启用自动执行。
```
### 选项B:自己动手
```
git clone https://github.com/shadowalpha-ai/shadow-cortex.git
cd shadow-cortex
npm install
npm run ui:build
npm run dev
```
这启动 **场景3,模拟模式,确认执行,确定性决策器** 对抗可重放的固定数据:无网络,无密钥,无真实经纪人。 几秒钟内,基于规则的入场提案出现在仪表板上,带有确认/拒绝按钮:
```
买入 $NVDA — “ShadowAlpha 热点 + 分析师支持”的规则匹配。 0.134481 股 @ ~$185.9 ≈ $25.00
等待确认(仪表板确认/拒绝,或CLI)。
```
**在约10秒内确认** ,您将看到整个生命周期:纸质仓位出现,重复价格攀升到高水位,市场管理循环的跟踪止损触发卖出提案,高水位标记关闭,整个过程记录在`state/audit.jsonl`中。 要重新播放:`rm -rf state && npm run dev`.
演示配置文件仅在市场时间内交易(`marketHoursOnly: true`; 它抑制提案创建和执行门控)。 在晚上或周末运行? 在“设置”选项卡中取消选中 **仅限市场时间** (或编辑配置文件)以在任何时候重放固定演示。 拒绝提案还会启动每个符号的冷却期(`entry.rejectionCooldownMinutes`,默认为30),因此引擎不会立即再次询问同一符号。
## 引擎工作原理
一个稳定的核心,可插拔的边缘和一个设置文件。 两个简单的循环完成工作: **接收循环** 将传入信号转换为交易提案, **管理循环** 监控开放仓位。 每个买入或卖出订单都必须通过单个受控门控。
```mermaid
flowchart TD
subgraph SRC["信号馈送:插入您自己的"]
direction LR
SA1(["想法和热点<br/>ShadowAlpha 扫描仪"])
SA2(["分析师预测<br/>带有跟踪记录"])
SA3(["投资组合/策展<br/>复制您关注的"])
CU(["自定义平台<br/>添加您自己的适配器"])
end
SRC -->|"轮询和标准化为信号"| WIN
subgraph INTK["接收循环:查找新交易"]
WIN["新信号<br/>删除重复项; 尊重市场时间"]
ENR["符号丰富:按需获取<br/>Robinhood 指标(ta.*),<br/>ShadowAlpha 信念 + 预测统计"]
DEC["决策者<br/>您的规则卡,或AI; 每个<br/>非决策解释(entry_skipped)"]
WIN --> ENR --> DEC
end
subgraph MGMT["管理循环:监控开放仓位"]
REC["与经纪人同步仓位<br/>经纪人的记录为准"]
EXIT["退出规则<br/>止损(固定,跟踪,ATR),部分 +<br/>全额利润目标,盈亏平衡,时间限制"]
REC --> EXIT
end
DEC -->|"买入提案"| RTR
EXIT -->|"卖出提案"| RTR
QT["价格报价<br/>经纪人,ShadowAlpha或样本文件"] -.current price.-> DEC
QT -.current price.-> EXIT
RTR["提案路由器<br/>每个符号一个待处理交易<br/>拒绝冷却; 普通英文理由"]
RTR -->|"仅记录,询问我或自动"| GATE
GATE{{"执行门控<br/>订单发生的唯一途径"}}
GATE ==>|"上限,价格带和确认均通过"| BRK
BRK[("经纪人<br/>纸质模拟器或Robinhood代理MCP")]
BRK -->|"仓位,成交,账户权益"| REC
GATE -.拒绝.-> AUD
RTR -.活动.-> AUD
BRK -.成交.-> AUD
BRK -.实时价格.-> QT
AUD[["审计日志和状态文件<br/>每个操作和非操作,解释"]]
```
策略本身位于一个位置,具有三个编辑器,均通过相同的故障关闭验证:
```mermaid
flowchart LR
CHAT(["MCP上的聊天AI<br/>Claude Desktop 或任何MCP客户端"])
PANEL(["仪表板<br/>设置面板"])
AGENT(["编码AI代理<br/>Claude Code 或任何模型"])
API["设置API<br/>故障关闭验证,<br/>属性审计跟踪"]
PROF[("配置文件(JSON)<br/>这是策略")]
ENG["运行引擎<br/>在重启时应用"]
CHAT ==>|"保存策略工具"| API
PANEL ==>|"保存"| API
API ==>|"验证后写入"| PROF
AGENT ==>|"直接编辑文件"| PROF
PROF -->|"加载启动; 再次验证"| ENG
PROF -. "文件更改→重启横幅" .-> PANEL
```
### 安全规则:通过构建保证
- **任何来源,相同核心。** 核心永远不知道信号来自哪里。 `信号`是唯一的合约,入口规则读取其`字段`字典,因此新的数据源插入时无需更改核心。
- **一个订单路径。** 执行门控是订单发生的唯一途径。 没有决策者,即使是完整的AI代理,都不能绕过它或超过您设置的上限。
- **仅上限阻止新买入。** 暴露上限和每日亏损停止新购买。 卖出减少风险的订单永远不会被阻止; 止损始终通过。
- **经纪人是真相的来源。** 仓位,成交和账户权益从经纪人处读取并在每个管理周期中更新。 引擎纠正自身以匹配经纪人,而不是反过来。
- **拒绝而不是猜测。** 无效设置拒绝运行。 信号缺少必填字段,该规则失败而不是猜测。 默认情况下,引擎处于纸质交易模式,执行已关闭。
- **一切都被记录。** 每个提案,放弃,确认,拒绝,成交和设置更改都被追加到审计日志中,包括信号为何未成为交易(`entry_skipped`)以及哪个客户端(仪表板,MCP AI,脚本)保存了每个设置。
## 仪表盘
演示配置文件还会在 **http://127.0.0.1:7777** 启动实时监控仪表盘:权益/现金/每日损益瓷砖,仓位跟踪峰值(高水位标记),带有理由的提案卡和审计轨迹,均通过SSE流式传输。 构建React应用一次,引擎就会提供:
```
npm run ui:build # 一次(以及UI更改后)
npm run dev # 引擎 + 仪表板在127.0.0.1:7777
```
对于热重载UI开发,在第二个终端中运行`npm run ui:dev`; Vite在自己的端口上提供应用程序,并将`/api`代理到正在运行的引擎。
在`execution: "confirm"`模式(演示的默认模式)中,提案出现 **确认/拒绝按钮**:浏览器回答与CLI相同的确认门控,未回答的提案在其TTL过期时静默拒绝。 仪表盘按配置文件启用(`"ui": { "enabled": true }`;在安全默认值中关闭)和 **仅绑定到127.0.0.1**:确认和设置端点修改执行和策略,必须从不监听网络。
**设置选项卡** 是运行策略的完整读写界面:模式,执行,上限,退出,大小,来源和可视化 **入口规则构建器**,您可以选择来源并约束其数据字段(`analystRating ≥ 55`,`confidence ≥ 0.7`,...)。 编辑通过与引擎启动相同的故障关闭路径验证,保存到活动配置文件,并显示“重启应用”横幅。 监视选项卡的 **活动策略** 卡显示运行规则的纯英语,因此无论谁是作者,您都可以看到引擎正在执行的操作:您,面板还是AI代理。
### 使用自己的AI代理编辑策略
配置文件 *是* 策略,因此您的编码代理(Claude Code 或任何模型)可以直接更改它:它编辑`profiles/<active>.json`,运行`npm run validate-profile -- <path>`以确认其有效且可启动,仪表盘在~2秒内显示更改为重启横幅并显示差异。 请参阅`edit-strategy`技能和 [`docs/AUTHORING.md`](docs/AUTHORING.md).
## 三种场景
一个引擎,三个姿态,由设置选择,从不编辑核心代码:
| | 入场决策 | 退出决策 | 执行 |
|---|---|---|---|
| **场景1**:全AI代理 | AI | AI(可选编程停止) | `auto` 在上限内 |
| **场景2**:AI进入,规则退出 *(推荐自动化)* | AI | **编程停止拥有结果** | `auto` 在上限内 |
| **场景3**:AI建议,您执行 *(默认,最安全)* | 任何决策者 | 仅建议 | `confirm` / `off` |
场景2是最佳位置:AI选择购买内容,但不能自行退出; 出口作为代码运行。 随附示例配置文件:[`profiles/scenario1.json`](profiles/scenario1.json),[`profiles/scenario2.json`](profiles/scenario2.json),[`profiles/scenario3.json`](profiles/scenario3.json).
**场景预设永远不会在未经明确启用的情况下启用自动化。** 场景1/2配置文件必须显式声明`mode`和`execution`,否则引擎拒绝运行。 无效设置始终拒绝运行; 验证失败关闭,从不打开。
## 您的策略是一个设置文件
配置文件即策略,配置文件即设置文件:
```
npm start -- --profile profiles/scenario2.json
```
您可以保留多个配置文件(`conservative-consensus.json`,`aggressive-buzz.json`,...),并在启动时选择一个。 配置文件的主要块,均在加载时进行故障关闭验证:
- **`mode`**:`paper`(默认)或`live`。
- **`execution`**:一个旋钮,没有模糊状态。 `off`(仅计算和记录提案),`confirm`(您批准每个订单),或`auto`(在上限内执行)。
- **`caps`**:您的风险限制(请参阅 [上限模型](#上限模型在实时使用前阅读))。
- **`entry`**:决策者(`rules`或`claude`)及其规则卡:每个来源的标准超过信号字段,以及冷却期。 每个数据点,卡片都可以控制,在 [docs/DATAPOINTS.md](docs/DATAPOINTS.md) 中编目。
- **`exit`**:每个仓位的退出策略(请参阅 [退出规则](#退出规则))。
- **`sizing`**:固定美元(默认,可支持分数功能; $25个职位在任何股价下都是$25个职位),固定整股,或权益百分比。 硬编码$1的最低订单金额。
- **`sources`**:哪些信号适配器运行及其每个来源的配置; 凭证通过env引用,从不内联。
- **`quoteSource`**:管理循环获取价格的位置。 `fixture`(可重放系列; 支持离线演示),`broker`(交易经纪人价格; 您将实时使用),或`shadowalpha`(通过MCP `get_price`的外部馈送)。
- **Cadence**:`intakePollMs`,`managementPollMs`,`marketHoursOnly`。
- **`ui`**:仪表盘开启/关闭和端口。
### 每个数据点,一个参考
[docs/DATAPOINTS.md](docs/DATAPOINTS.md) 列出了 **所有** 入场标准可以控制的内容:每个馈送的字段(创意/热点,分析师预测,投资组合/策展),ShadowAlpha符号丰富度(`conviction.*`,`predictions.*`),Robinhood技术指标(`ta.*`,包括任意周期语法和上游指示器类型尚未连接),和`window.*`聚合类型,具有类型,建议的默认值和每个含义。 AI客户端获取相同的目录,您的实际投资组合名称填充在,从`get_strategy` MCP工具或`GET /api/settings` → `availableFieldCatalog`。
## 上限模型(在实时使用前阅读)
- **您拥有每个上限**:`maxSharesPerOrder`,`maxOpenPositions`,`maxDollarsPerPosition`,`maxDailyLoss`和每个停止。 设置它们,放松它们或禁用它们设置为`null`。 引擎施加自己的地板。
- **引擎的一个不变式是忠实执行。** 强制执行的上限在执行层为每个决策者强制执行; AI不能决定“用户设置$500但我将执行$5,000”。
- **上限仅限入口,永远退出。** 止损卖出风险; 卖出减少风险的订单永远不会被阻止; 仅新的风险才受到限制。
- **长线,仅限美国股票,v1**。看跌信号意味着“不要买入/如果持有则退出”,而不是“做空”。
预设默认值(可自由编辑):每订单10股,5个开放仓位,每个仓位$500,$100最大日损,填充价格区间1%。
## 退出规则
管理循环根据每个开仓位的有效配置文件退出策略进行评估。所有规则都是价格和时间的纯函数; 它们中的任何一个都可以设置为`null`,并且任何组合都可以组合:
| 规则 | 设置 | 默认值 |
|---|---|---|
| 从成本价计算的止损 | `stopLossPct` | 5% |
| 跟踪止损(从最高价开始) | `trailingStopPct` | 7% |
| 仅在获得收益后开始跟踪 | `trailActivationPct` | 关闭 |
| 获利目标 | `takeProfitPct` | 15% |
| 基于时间的退出 | `maxHoldDays` | 3 天 |
| 基于波动率(ATR)的止损低于峰值 | `atrStopMultiplier` × ATR(`atrPeriod`) | 关闭 |
| 死钱退出(N天后无变动) | `breakevenDays` + `breakevenMinMovePct` | 关闭 |
| 部分获利 | `partialTpPct` + `partialCloseFraction` | 关闭 |
每个仓位的最高水位标记在状态文件中持续存在并在引擎重启后存活下来。分数股的注意事项:经纪人通常不支持分数数量的止损订单,因此对于分数仓位,管理循环实际上是 * 唯一的保护措施; 如果您想使用经纪人端的原住民止损,请按整股计算仓位大小。
## 环境变量
## 连接您的账户(无需终端)
## 真实使用(先使用模拟)
## 启用AI决策器
## 从Claude Desktop驱动引擎(或任何MCP客户端)
## 扩展它
## 仓库地图
## 状态,日志和重置
## 开发
## 故障排除
## 许可证和免责声明
## 环境变量
| 变量 | 用途 |
|---|---|
| `SHADOWALPHA_MCP_TOKEN` | ShadowAlpha MCP token,用于实时信号。可选;Connections面板可以将token保存到 `state/` 目录下,如果两者都存在,环境变量优先。 |
| `ANTHROPIC_API_KEY` | 启用Claude决策器和LLM叙述器。没有它,引擎将回落到确定性规则决策器和模板理由:关闭时失败,从不开放失败。 |
| `ROBINHOOD_OAUTH_PATH` | 覆盖保存的Robinhood token位置(默认 `state/robinhood-oauth.json`)。 |
| `SHADOW_CORTEX_REPO`,`SHADOW_CORTEX_URL` | 由Claude Desktop扩展自动设置,以便MCP服务器可以找到存储库和正在运行的引擎。很少手动设置。 |
## 连接您的账户(无需终端)
所有连接都来自仪表盘的 **设置 → 连接** 面板:
1. **ShadowAlpha**:将您的MCP token(ShadowAlpha付费功能)粘贴到连接面板并点击 **连接**。引擎在保存到 `state/`(仅所有者文件,gitignored;凭证从不存储在配置文件中)之前,会在实时服务器上验证它。更喜欢环境变量?导出 `SHADOWALPHA_MCP_TOKEN` 代替;它始终优先于保存的文件。
2. **Robinhood**:点击 **连接 Robinhood**。Robinhood的批准页面在新选项卡中打开(也需要在应用程序中批准);仪表盘自行完成OAuth握手并显示您的代理账户,屏蔽。 (终端流程 `npm run robinhood:connect` 仍然存在并落在同一位置。)
3. **将您的源代码切换为实时**:在设置 → 源代码中,将每个ShadowAlpha源代码的传输方式从 `fixture(演示数据)` 切换为 `live`。直到您这样做,像“Momentum”这样的投资组合名称都是虚构的示例数据。
4. **重启**:在连接面板中点击 **重启引擎**。连接和设置在重启时生效;`npm run dev` 启动的监视器会将引擎恢复原状。
## 真实使用(先从模拟开始)
1. **真实信号:** 连接ShadowAlpha(上文)并将您的源代码的传输方式切换为 `live`。
2. **真实价格:** 管理循环无法在没有报价的情况下运行止损。连接Robinhood后,设置 `"quoteSource": "broker"` 以按经纪人的交易报价定价; `"shadowalpha"` 也可用作外部馈送,如果您希望在没有经纪人连接的情况下获得实时价格。
3. **AI决策(可选):** 切换到Claude决策器 - 参见下面的 [启用AI决策器](#启用AI决策器)。
4. **模拟交易** 只要您信任您的配置文件。 PaperBroker 按照实时报价填写,并在 `state/` 中记录损益。
5. **实时监控和交易(Robinhood)。** 实时经纪人是官方的Robinhood代理交易MCP,采用 **混合** 工作流程:引擎读取您的真实仓位,以便退出针对您实际持有的仓位,而入口则由您(或您的AI代理)在 `confirm` 模式下批准。它的 **只读映射经过真实捕获的有效载荷验证** (参见 [发现读出](docs/robinhood-discovery.md)),包括Robinhood的代理账户隔离:适配器发现代理可以触及的单个账户,并且写入永远不会离开它。
通过 **设置 → 连接 → 连接 Robinhood** (或在终端中运行 `npm run robinhood:connect`,结果相同)进行一次连接。令牌存储在 `state/robinhood-oauth.json`(仅所有者,gitignored)中。然后是推荐的 **仅监控** 姿势:仪表盘上的真实账户,无法进行订单操作:
```jsonc
{ "mode": "live", "liveBroker": "robinhood", "execution": "off",
"quoteSource": "broker", "marketHoursOnly": true }
```
没有连接,`"mode": "live"` 拒绝启动(关闭时失败,错误名称为连接命令)。在无人值守的轮询下,订单响应形状和令牌生命周期仍在验证中;保持 `execution` 在 `off` / `confirm` 和权益较小。
## 启用AI决策器
默认情况下,确定性 `rules` 决策器从您的规则卡中选择入口。 可选的 `claude` 决策器用Claude模型取代此步骤:它接收新鲜信号、您的仓位和当前报价,并提出带有单句理由的入口。 无论运行哪个决策器,以下三点始终成立:它只能 *提议* (执行门控强制执行每个上限和确认门控),长仅在代码中强制执行,出口始终按代码运行。
启用它需要三个步骤;中间步骤有一个陷阱。
1. **获取API密钥** 在console.anthropic.com上。这是一个计费API,独立于Claude订阅。密钥永远不会进入配置文件或仪表板;引擎仅从环境中读取它。
2. **从具有密钥的shell启动引擎。** 陷阱:仪表板的重启按钮用它 *最初启动* 的环境重新生成引擎,因此在新终端中导出密钥并单击重启不会改变任何内容。停止引擎,然后:
```
export ANTHROPIC_API_KEY=sk-ant-...
npm run dev
```
3. **切换决策器并重启。** 任何表面都有效:设置 → 模式和执行 → 决策器 → `claude`,然后保存并重启;或要求您的连接的AI通过 `save_strategy` 执行此操作;或直接在配置文件中编辑`"decider"`。
**验证它已生效:** 监视器状态栏显示 `decider claude`,并且新提案带有 `claude` 作为其决策器。 如果密钥对引擎不可见,它仍会以规则决策器启动(关闭时失败),并且仪表板会显示一个警报横幅,准确指出此问题。
**成本控制(您拥有它们,就像每个上限一样):** 仅当新信号到达时才调用决策器,从不按计时器调用,并且配置文件中的 `claude` 块中的两个制动器限制了最坏的情况。 `minSecondsBetweenCalls` (默认30)将信号突发折叠成一个批处理调用:延迟的信号在窗口中等待,并在间隔通过时一起决定,延迟但从不丢弃。 `maxCallsPerDay` (默认500)阻止AI决策在UTC当天剩余时间,一旦花费;每个阻止的符号在事件馈送中显示为 `entry_skipped`,表示预算已用完。 将任一设置为 `null` 以禁用。 注意:导出密钥后, *叙述器* 也开始使用LLM来表达提案理由(每个提案一次调用,任何失败时的模板回退)- 即使在规则决策器下也会发生这种情况。
在 **模拟模式下,使用 `execution: "confirm"`** 并阅读一段时间的理由,然后再让它接近真实资金。
## 从Claude Desktop(或任何MCP客户端)驱动引擎
引擎自带MCP服务器:聊天AI可以监视账户,读取和重写策略(与所有其他路径相同的关闭验证),确认或拒绝提案,并启动/重启引擎。 有三种连接方式(都在设置 → 连接 → 本地AI应用程序中显示):
1. **Claude Desktop一键扩展**: 从仪表板下载 `shadow-cortex.dxt`,双击它,点击安装。 扩展程序在启动时 ping 引擎,因此只要Claude Desktop正在运行,仪表板的本地AI芯片就会显示活动。 .dxt 在下载时捆绑了服务器代码;更新Shadow Cortex后,请重新下载并重新安装它。 注意,Claude Desktop的“添加自定义连接器” URL字段仅用于远程https服务器;本地服务器通过stdio连接扩展程序。 不要将引擎隧道连接到互联网以获取https链接。
2. **其他本地MCP应用程序** (Cursor,自定义代理):在引擎运行时,将它们指向 `http://127.0.0.1:7777/mcp`。
3. **手动配置** (任何stdio MCP客户端):添加到 `claude_desktop_config.json`:
```json
{
"mcpServers": {
"shadow-cortex": {
"command": "npx",
"args": ["-y", "tsx", "/ABSOLUTE/PATH/TO/shadow-cortex/src/tools/mcp-server.ts"]
}
}
}
```
然后直接对话:“我的账户怎么样?”,“将跟踪止损调整为3%并重启”,“确认该NVDA提案”。十四种工具涵盖了整个曲面(`get_status`,`get_strategy`,`validate_strategy`,`save_strategy`,`confirm_proposal`,`start_engine`,...)。 AI获得了一个控制杆,而不是一个旁路:策略保存通过与仪表板相同的验证,启用自动执行需要相同的显式同意握手,并且确认的提案仍然面临每个执行门控检查。 编码代理(Claude Code等)不需要MCP;配置文件是他们的接口(参见上面的“使用您自己的AI代理编辑策略”)。
## 扩展
核心是一个稳定的脊柱,带有插件套接字。 完整的合约位于 [`docs/AUTHORING.md`](docs/AUTHORING.md) 中,编写完成后,您可以将它交给AI代理并说“连接到X”:
- **添加信号源:** 实现 `SignalSource` (一个轮询器;摄取循环每个刻度调用 `poll()`),归一化为一个 `Signal` 形状,并使用核心帮助器注册到 `src/sources/registry.ts`。 下游可能不知道信号来自哪里。 HTTP / TradingView webhook变体在指南中概述。
- **添加入口规则/决策器:** 实现 `Decider`:获取 `DecisionContext`,返回 `Proposal[]`。 决策器仅提议;执行门控强制执行。
- **添加出口规则:** 扩展 `src/exits/policies.ts` (价格和时间的纯函数)和 `exit` 设置块。
- **添加策略:** 编写JSON配置文件。 大多数用户从不触摸核心代码。
## 仓库地图
```
src/core/ 锁定形状(Signal,Proposal,Position),帮助器,状态,审计
src/engine/ 摄取循环,管理循环,提案路由器,编排器
src/entry/ 入口规则卡:每个源的信号字段标准
src/sources/ MCP客户端,三个ShadowAlpha馈送适配器,注册表
src/deciders/ 规则(默认),claude(密钥门控),注册表
src/exits/ 出口策略库(纯函数)
src/execution/ 执行门控(强制执行所有上限),PaperBroker,Robinhood经纪人,报价
src/narrator/ 理由生成(模板回退,可选LLM)
src/settings/ zod模式,安全默认值,关闭加载器
src/tools/ 监视器(npm run dev),验证配置文件,robinhood-connect,MCP服务器
src/ui/ 仪表板API服务器(快照,SSE,确认);仅限本地主机
ui/ React仪表板(Vite;自己的包,引擎依赖保持精简)
profiles/ 每个场景的一个示例配置文件
fixtures/ 零凭证演示的可重放数据
docs/ 创作指南,Robinhood发现读出
experimental/ 捕获的Robinhood MCP有效载荷,支持发现读出
test/ 完整套件:所有绿色且零凭证
```
## 状态,日志和重置
引擎持久化的所有内容都存储在gitignored的 `state/` 目录中:
- `state/audit.jsonl`:具有每个提案,删除,确认,拒绝,拒绝,填充和设置更改的追加式审计日志。
- 引擎状态文件:经纪人无法返回的内容(每个仓位的最高水位线,已见信号去重键,待处理提案,每日损失锚点)。 在启动时加载,然后与经纪人核对。
- 保存的凭证:ShadowAlpha令牌和 `robinhood-oauth.json`(仅所有者文件)。
`rm -rf state` 为您提供出厂重置(并断开已保存的帐户);fixture演示文稿在重置后完全相同。
## 开发
```
npm test # vitest:完整的套件,在线运行,无需凭证
npm run typecheck # tsc --noEmit,严格
npm run ui:build # 将仪表板构建到ui/dist
npm run ui:dev # 热加载仪表板开发服务器(代理/api)
npm run validate-profile -- <path> # 在不启动的情况下检查配置文件
```
所有外部(源,经纪人,LLM,MCP客户端)都位于具有模拟的接口后面,因此整个套件在没有凭证和网络的情况下运行。
## 故障排除
- **没有提案出现?** 演示配置文件仅限市场时间。 在设置中取消选中 **仅限市场时间** (或设置 `"marketHoursOnly": false`),以重放演示文稿的晚上和周末。 还要检查每个符号的拒绝冷却时间;拒绝提案会在默认情况下使该符号在30分钟内保持沉默。
- **仪表板在127.0.0.1:7777上显示什么?** 至少构建一次 `npm run ui:build`,并确认活动配置文件具有 `"ui": { "enabled": true }` (在安全默认值中关闭)。
- **`mode: "live"` 拒绝启动?** 这是关闭时的失败行为:首先连接Robinhood(设置 → 连接,或 `npm run robinhood:connect`)。 错误名称修正。
- **配置文件编辑未生效?** 设置在重启时生效。 仪表板在配置文件在磁盘上更改时显示带有差异的“重启以应用”横幅。
- **想要一个干净的记录?** `rm -rf state && npm run dev` 从头开始重放演示。
## 许可证和免责声明
MIT; 参见 [LICENSE](LICENSE)。 自托管;您持有您的密钥;没有经纪人托管您的资金。 AI决策器和自动执行是明确的,标记为自担风险的选项。 本存储库是源代码,用于构建,完全由您自行决定和风险使用:不是投资建议,不是支持的产品。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器