mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-07-06 20:41:14 +08:00
feat: route nofxos data requests through claw402 x402 payment
When CLAW402_WALLET_KEY env var is set, all nofxos.ai data API calls (AI500, OI rankings, NetFlow, price rankings, etc.) are automatically routed through claw402.ai with x402 USDC payment instead of direct free access. - New Claw402DataClient for GET requests with x402 payment flow - Endpoint mapping: /api/xxx -> /api/v1/nofx/xxx - MakeClaw402SignFunc helper for reusable payment signing - Auto-detection: if CLAW402_WALLET_KEY is set, claw402 mode activates - Fallback: without wallet key, direct nofxos.ai access (backward compatible) Env vars: CLAW402_WALLET_KEY=0x... # wallet private key for payment CLAW402_URL=https://claw402.ai # optional, defaults to claw402.ai
This commit is contained in:
@@ -388,7 +388,7 @@ func (a *Agent) thinkAndActStream(ctx context.Context, userID int64, lang, text
|
||||
return a.noAIFallback(lang, text)
|
||||
}
|
||||
|
||||
// No tool calls → done with tool loop
|
||||
// No tool calls → LLM is done deciding, produce final response
|
||||
if len(resp.ToolCalls) == 0 {
|
||||
if !toolsUsed {
|
||||
// No tools were ever called — the non-streaming probe already has the answer.
|
||||
@@ -397,8 +397,10 @@ func (a *Agent) thinkAndActStream(ctx context.Context, userID int64, lang, text
|
||||
a.history.Add(userID, "assistant", resp.Content)
|
||||
return resp.Content, nil
|
||||
}
|
||||
// Tools were used in previous rounds, LLM gave final answer without streaming.
|
||||
// This shouldn't normally happen (we break and stream below), but handle it.
|
||||
// Tools were used in previous rounds. Stream the final response
|
||||
// for better UX (the non-streaming probe gave us text, but for
|
||||
// consistency with the streaming contract, re-request with streaming).
|
||||
// However, resp.Content already has the answer so just emit it.
|
||||
onEvent(StreamEventDelta, resp.Content)
|
||||
a.history.Add(userID, "assistant", resp.Content)
|
||||
return resp.Content, nil
|
||||
@@ -420,20 +422,17 @@ func (a *Agent) thinkAndActStream(ctx context.Context, userID int64, lang, text
|
||||
messages = append(messages, mcp.Message{Role: "tool", Content: result, ToolCallID: tc.ID})
|
||||
}
|
||||
|
||||
// After tool execution, stream the next LLM response for real-time UX.
|
||||
// Omit tools so LLM can't start another tool round — it must produce text.
|
||||
streamReq := &mcp.Request{Messages: messages, Ctx: ctx}
|
||||
streamText, streamErr := a.aiClient.CallWithRequestStream(streamReq, func(chunk string) {
|
||||
onEvent(StreamEventDelta, chunk)
|
||||
})
|
||||
if streamErr != nil {
|
||||
a.logger.Error("stream post-tool response failed", "error", streamErr, "round", round)
|
||||
return a.noAIFallback(lang, text)
|
||||
// If this is the last allowed round, break to stream the final response below.
|
||||
// Otherwise, continue loop — next iteration's CallWithRequestFull will check
|
||||
// if LLM wants more tools.
|
||||
if round == maxToolRounds-1 {
|
||||
break
|
||||
}
|
||||
a.history.Add(userID, "assistant", streamText)
|
||||
return streamText, nil
|
||||
}
|
||||
|
||||
// Stream the final response after all tool rounds are complete.
|
||||
// Omit tools so LLM produces text, not more tool calls.
|
||||
|
||||
// Exhausted all tool rounds — stream the final synthesis response
|
||||
finalReq := &mcp.Request{Messages: messages, Ctx: ctx}
|
||||
finalText, err := a.aiClient.CallWithRequestStream(finalReq, func(chunk string) {
|
||||
|
||||
250
docs/NOFXi-Investor-Deck.md
Normal file
250
docs/NOFXi-Investor-Deck.md
Normal file
@@ -0,0 +1,250 @@
|
||||
# NOFXi — The AI That Trades For You
|
||||
|
||||
> **一句话:NOFXi 是全球首个跨市场 AI 交易 Agent,它越用越懂你,让每个人都拥有自己的 AI 交易团队。**
|
||||
|
||||
---
|
||||
|
||||
## 问题:万亿美元市场的痛
|
||||
|
||||
全球散户交易者超过 **1.5 亿人**,管理着超过 **70 万亿美元**的资产。但他们面临三个致命问题:
|
||||
|
||||
### 😩 信息过载,决策瘫痪
|
||||
- 加密货币 24/7 不停盘,美股港股 A 股时区不同
|
||||
- Twitter 一条推文、一份 CPI 数据、一次鲸鱼转账,都可能引发剧烈波动
|
||||
- 散户不可能全天候盯盘,错过就是真金白银
|
||||
|
||||
### 🔧 工具割裂,操作低效
|
||||
- 看加密用 TradingView,炒美股用 Robinhood,做港股用富途
|
||||
- 每个平台一套逻辑,一套密码,一套 UI
|
||||
- **没有人能同时管理多个市场** — 除非你有一个团队
|
||||
|
||||
### 🧠 量化是富人的游戏
|
||||
- 顶级量化策略年化 30-100%,但需要 Python + 数据工程 + 百万级资金门槛
|
||||
- 散户只能追涨杀跌,用"感觉"交易
|
||||
- **信息不对称 = 财富不对等**
|
||||
|
||||
---
|
||||
|
||||
## 解决方案:NOFXi
|
||||
|
||||
### NOFXi 不是一个交易工具。它是你的 AI 交易团队。
|
||||
|
||||
想象你雇了一个私人交易员:
|
||||
- 他 **24/7 在线**,永远不休息
|
||||
- 他同时看着 **加密货币、美股、港股** 三个市场
|
||||
- 他记得你的每一笔交易,**从你的成功和失败中学习**
|
||||
- 你用 **自然语言** 跟他沟通 —「美股跌太多了,帮我抄底 NVDA」
|
||||
- 他不是一个人 — 他背后是一个 **AI 投研团队**,多空辩论后才下单
|
||||
|
||||
这就是 NOFXi。
|
||||
|
||||
---
|
||||
|
||||
## 五大核心能力
|
||||
|
||||
### 🧠 1. 交易记忆网络 — 越用越聪明
|
||||
|
||||
**传统工具是无记忆的。** 你用了三年的 TradingView,它依然不知道你是谁。
|
||||
|
||||
NOFXi 不一样:
|
||||
- 每一笔交易都在积累 **交易记忆** — 不是简单的交易记录,是经验和直觉
|
||||
- 它知道你在 BTC 暴跌时容易恐慌卖出,会**提前提醒你冷静**
|
||||
- 它记得上次美联储加息时你的持仓表现,会**主动调整策略**
|
||||
- 用了三个月的 NOFXi 和新用户的完全不同 — **它长成了你的形状**
|
||||
|
||||
**护城河:** 用户迁移成本极高。你可以换一个交易软件,但你换不掉一个了解你交易风格的 AI 伙伴。
|
||||
|
||||
> 💡 类比:Spotify 的推荐算法用了几年才懂你的音乐品味。NOFXi 用几个月就能读懂你的交易性格。
|
||||
|
||||
---
|
||||
|
||||
### ⚔️ 2. 多 AI 博弈决策 — 不是一个模型,是一支投研团队
|
||||
|
||||
**一个 AI 做交易 = 一个分析师拍脑袋。**
|
||||
|
||||
华尔街的决策流程是:分析师出报告 → 交易员制定方案 → 风控审核 → 执行。NOFXi 把这个流程 AI 化:
|
||||
|
||||
- **多头分析师**(AI #1):寻找做多理由
|
||||
- **空头分析师**(AI #2):寻找做空理由和风险
|
||||
- **策略师**(AI #3):综合多空观点,制定交易方案
|
||||
- **风控官**(AI #4):审核方案,检查仓位/杠杆/止损是否合理
|
||||
- **执行员**:只有通过风控审核的交易才会执行
|
||||
|
||||
**这不是噱头。** 这是机构级的决策框架,首次用 AI 实现并普惠到每一个散户。
|
||||
|
||||
**护城河:** 多 AI 博弈的 prompt 工程、决策权重、冲突解决机制 — 这些 know-how 需要大量实战迭代,不是开源代码能复制的。
|
||||
|
||||
---
|
||||
|
||||
### 🌍 3. 全市场统一 Agent — 一个大脑管所有资产
|
||||
|
||||
**现状:** 加密货币、美股、港股、A股 — 四个市场,四个工具,四种逻辑。
|
||||
|
||||
**NOFXi:** 一个 Agent,一个对话框,管理你的所有资产。
|
||||
|
||||
实际场景:
|
||||
- 「BTC 大跌了,帮我把 30% 仓位转移到黄金 ETF 避险」
|
||||
- 「美股盘前看看科技股,如果 NVDA 跌超 3% 帮我抄底」
|
||||
- 「港股通买入腾讯 1000 股,同时在 Binance 做空等量的 crypto 对冲」
|
||||
|
||||
**这是真正的跨市场资产管理。** 目前市场上没有产品能做到这一点。
|
||||
|
||||
**护城河:**
|
||||
- 技术复杂度:9 家加密交易所 + Alpaca(美股)+ LongPort(港股)+ 沪港通(A股),每个都有不同的 API、结算规则、交易时段
|
||||
- 跨市场策略积累:对冲、轮动、套利 — 这些策略在单一市场工具上根本无法实现
|
||||
- **先发优势:** 第一个做到的就是标准制定者
|
||||
|
||||
**已接入:**
|
||||
|
||||
| 市场 | 交易所/券商 | 状态 |
|
||||
|------|-----------|------|
|
||||
| 加密货币 | Binance, Bybit, OKX, Bitget, KuCoin, Gate, Hyperliquid, Aster, Lighter | ✅ 已上线 |
|
||||
| 美股 | Alpaca (Paper + Live) | 🔨 开发中 |
|
||||
| 港股 | LongPort 长桥 | 📋 设计完成 |
|
||||
| A股 | 沪港通 | 📋 规划中 |
|
||||
|
||||
---
|
||||
|
||||
### 🏪 4. 记忆市场 — 复制交易员的大脑,不是操作
|
||||
|
||||
**eToro 的 Copy Trading 让你复制别人的交易操作。但操作不等于智慧。**
|
||||
|
||||
NOFXi 的记忆市场是一个全新的范式:
|
||||
|
||||
- 顶级交易员可以将自己的 **Agent 记忆** 打包出售
|
||||
- 你买到的不是一串交易信号 — 是他的 **风险偏好、判断框架、踩过的坑**
|
||||
- 你可以在他的记忆基础上继续训练,让 Agent 同时拥有**你的习惯 + 他的经验**
|
||||
|
||||
**商业模型:**
|
||||
- 交易员上传记忆 → 定价(月订阅 / 一次性购买)
|
||||
- 平台抽成 20-30%
|
||||
- 记忆有评分系统(基于实盘表现的胜率、最大回撤、夏普比率)
|
||||
- **顶级记忆可以卖到数千甚至数万美元** — 因为它代表的是真实的交易智慧
|
||||
|
||||
**护城河:** 网络效应。用户越多 → 记忆越丰富 → 平台越有价值 → 新用户越想来。这是一个自增强飞轮。
|
||||
|
||||
> 💡 类比:GitHub 是代码的网络,NOFXi 是交易智慧的网络。
|
||||
|
||||
---
|
||||
|
||||
### 💬 5. 自然语言策略 — 说人话,做量化
|
||||
|
||||
**传统量化需要:** Python + pandas + backtrader + 数据清洗 + 服务器部署 = 半年学习 + 百万资金门槛。
|
||||
|
||||
**NOFXi 只需要一句话:**
|
||||
|
||||
> 「当 BTC 的 RSI 低于 30,同时美股期货是绿的,用 10% 仓位做多 BTC,止损 3%,止盈 8%」
|
||||
|
||||
NOFXi 做什么:
|
||||
1. **理解语义** — 解析你的策略意图
|
||||
2. **转化为可执行规则** — 自动绑定指标、触发条件、风控参数
|
||||
3. **7×24 监控** — 条件满足自动执行
|
||||
4. **持续复盘** — 策略执行后自动评估表现,建议优化
|
||||
|
||||
**这是量化民主化。** 让知识成为门槛,而不是编程能力。
|
||||
|
||||
**护城河:** 自然语言到交易策略的语义理解是一个极其困难的 NLP 问题 — 模糊表述、缺失参数、矛盾条件都需要处理。这需要大量真实用户数据的迭代。
|
||||
|
||||
---
|
||||
|
||||
## 技术壁垒
|
||||
|
||||
### 为什么别人做不了?
|
||||
|
||||
| 壁垒 | 说明 |
|
||||
|------|------|
|
||||
| **多市场管道工程** | 9 家 CEX + 美股 + 港股 + A股,每个 API 不同,结算规则不同,时区不同。光是对接就需要数万行代码,维护更是无底洞 |
|
||||
| **交易记忆模型** | 不是简单的数据库。需要将用户行为、市场环境、决策结果三者关联,形成可迁移的"经验向量" |
|
||||
| **多 AI 博弈框架** | 多个 LLM 实时辩论并达成共识,需要精密的 prompt 工程和冲突解决机制 |
|
||||
| **自然语言策略引擎** | 从模糊的人类表述到精确的量化规则,容错率要求极高 — 一个误解可能导致真金白银的损失 |
|
||||
| **实战数据飞轮** | 每一笔真实交易都在训练系统。竞品从零开始,我们已经在积累 |
|
||||
|
||||
### 不是开源能解决的
|
||||
|
||||
NOFXi 的核心代码确实使用了开源组件(Go, React, LLM API)。但护城河不在代码本身:
|
||||
|
||||
- **数据护城河** — 用户交易记忆、策略执行数据、跨市场关联数据
|
||||
- **Know-how 护城河** — 多 AI 决策的权重调优、记忆压缩算法、自然语言策略的容错机制
|
||||
- **网络效应护城河** — 记忆市场的供需双边网络
|
||||
|
||||
> 💡 类比:Twitter 的代码很简单,但没人能复制 Twitter 的网络。
|
||||
|
||||
---
|
||||
|
||||
## 市场机会
|
||||
|
||||
### TAM(Total Addressable Market)
|
||||
|
||||
| 市场 | 规模 | 来源 |
|
||||
|------|------|------|
|
||||
| 全球散户交易市场 | $70T+ 资产 | World Federation of Exchanges |
|
||||
| 加密交易工具 | $3.2B (2025) → $12B (2030) | Grand View Research |
|
||||
| 智能投顾 | $5.9T AUM (2025) → $16T (2030) | Statista |
|
||||
| Copy Trading | $2.2B (2025) → $4B (2028) | MarketsandMarkets |
|
||||
|
||||
### 切入路径
|
||||
|
||||
**Phase 1 — 加密交易者(现在)**
|
||||
- 7×24 市场,用户对 AI 工具接受度最高
|
||||
- 已接入 9 家交易所,产品可用
|
||||
- 目标:1000 活跃用户,验证 PMF
|
||||
|
||||
**Phase 2 — 跨市场交易者(Q3 2026)**
|
||||
- 加入美股 + 港股,吸引更高净值用户
|
||||
- 记忆市场上线,开启平台效应
|
||||
- 目标:10,000 用户,月交易量 $100M+
|
||||
|
||||
**Phase 3 — 智能资产管理(2027)**
|
||||
- DeFi + CeFi + TradFi 三位一体
|
||||
- 从交易工具进化为资产管理 Agent
|
||||
- 目标:100,000 用户,AUM $1B+
|
||||
|
||||
---
|
||||
|
||||
## 竞品对比
|
||||
|
||||
| 维度 | 3Commas | Pionex | eToro | 量化平台 | **NOFXi** |
|
||||
|------|---------|--------|-------|---------|-----------|
|
||||
| 加密交易 | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| 美股/港股 | ❌ | ❌ | ✅(有限) | 部分 | ✅ |
|
||||
| AI 自主决策 | ❌ | ❌ | ❌ | 部分 | ✅ |
|
||||
| 多 AI 博弈 | ❌ | ❌ | ❌ | ❌ | ✅ |
|
||||
| 交易记忆 | ❌ | ❌ | ❌ | ❌ | ✅ |
|
||||
| 自然语言策略 | ❌ | ❌ | ❌ | ❌ | ✅ |
|
||||
| 记忆市场 | ❌ | ❌ | Copy Trade | ❌ | ✅ |
|
||||
| 跨市场对冲 | ❌ | ❌ | ❌ | ❌ | ✅ |
|
||||
|
||||
**NOFXi 不是在现有赛道里做得更好 — 它开辟了一个新赛道。**
|
||||
|
||||
---
|
||||
|
||||
## 商业模式
|
||||
|
||||
| 收入来源 | 模式 | 预期 |
|
||||
|---------|------|------|
|
||||
| **Pro 订阅** | $29-99/月,解锁高级 AI 模型 + 更多交易对 + 更长记忆 | 主要收入 |
|
||||
| **记忆市场抽成** | 交易员出售记忆,平台抽 20-30% | 平台收入 |
|
||||
| **交易量分成** | 与交易所合作,交易量返佣 | 被动收入 |
|
||||
| **企业版** | 为基金/机构定制 Agent | 高客单价 |
|
||||
|
||||
---
|
||||
|
||||
## 团队(待补充)
|
||||
|
||||
_[这里需要补充团队背景]_
|
||||
|
||||
---
|
||||
|
||||
## 融资需求(待补充)
|
||||
|
||||
_[融资金额、用途、里程碑]_
|
||||
|
||||
---
|
||||
|
||||
## 一句话总结
|
||||
|
||||
> **NOFXi 正在构建交易智慧的网络。每个用户都在训练自己的 AI 交易团队,每个交易员的经验都能被分享和增值。这不是又一个交易工具 — 这是交易的未来。**
|
||||
|
||||
---
|
||||
|
||||
*NOFXi — Trade Smarter, Together.*
|
||||
BIN
docs/NOFXi-Investor-Deck.pptx
Normal file
BIN
docs/NOFXi-Investor-Deck.pptx
Normal file
Binary file not shown.
244
docs/NOFXi-Teaser-Final.md
Normal file
244
docs/NOFXi-Teaser-Final.md
Normal file
@@ -0,0 +1,244 @@
|
||||
# NOFXi
|
||||
|
||||
NOFX:GitHub 11,132 star,2,853 fork,峰值数万月活用户,真实交易收入。9 家主流加密交易所实盘运行。我们把它升级成了 AI 原生版。
|
||||
|
||||
NOFXi 是垂直于交易领域的 AI Agent。大模型让交易意图表达变简单,Agent 架构让执行变自动化,NOFX 的引擎让执行变专业。三者合一:简单、专业、可自动化。
|
||||
|
||||
---
|
||||
|
||||
## 这件事为什么现在能做
|
||||
|
||||
三个条件在 2026 年同时成熟。
|
||||
|
||||
Reasoning model(o3、DeepSeek-R1)让 AI 第一次能处理多步骤交易决策——综合多个指标、多个时间框架、多个市场的复杂判断。一年前的模型做不到这一点。
|
||||
|
||||
Agent 协议标准化了。MCP、Tool Calling、Skill 架构这些基础设施成熟了,AI 能真正调用外部工具、持续运行、自主决策。交易是这套能力最天然的落地场景。
|
||||
|
||||
监管态度在松动。Composer 拿到了 SEC 注册,Alpaca 作为 API-first 券商服务了大量第三方。监管开始接受 AI 辅助交易,前提是人类保留最终决策权。
|
||||
|
||||
窗口打开了。但 AI 能理解交易意图只是起点,能可靠地执行才是终点。
|
||||
|
||||
---
|
||||
|
||||
## 30 秒理解 NOFXi 在做什么
|
||||
|
||||
> Alice 在 Telegram 对 NOFXi 说:「BTC 跌破 6 万了,帮我在 Binance 做多 0.5 BTC,止损 3%,同时在 Alpaca 买入 $5000 的黄金 ETF 对冲。」
|
||||
>
|
||||
> NOFXi 30 秒内查询了两个市场的实时价格,计算仓位和止损点位,生成两笔待确认订单。Alice 点了确认,两笔单同时执行。
|
||||
>
|
||||
> 第二天 BTC 继续跌,触发止损,NOFXi 自动平仓并通知 Alice。总亏损控制在预设范围内,黄金 ETF 还在盈利。
|
||||
>
|
||||
> 整个过程 Alice 没有打开过任何交易所 App。
|
||||
|
||||
一个对话框,跨两个市场,自动执行,风险可控。这就是 NOFXi。
|
||||
|
||||
---
|
||||
|
||||
## 第一件事:让智能交易即插即用
|
||||
|
||||
今天想让 AI 帮你交易,流程是这样:装 Agent 平台折腾环境,找交易 Skill 一个个装,去交易所申请 API Key 搞权限配置,发现 Skill 之间不兼容或交易所接口又改了。大部分人在这个过程中放弃。
|
||||
|
||||
NOFXi 把这个流程压缩到一步。预装全套交易 Skill,交易所配置统一化,Skill 之间的依赖和协同出厂就是通的。异动监控发现机会 → Agent 分析判断 → 交易引擎下单 → 风控同步检查,这条链路不需要用户自己搭。
|
||||
|
||||
为什么我们能做到这一点:不是从零做起。NOFX 已经把交易引擎跑通了——9 家交易所的对接、策略执行、风控机制。NOFXi 是在这个成熟引擎上加 Agent 层,不是同时做十件事。
|
||||
|
||||
---
|
||||
|
||||
## 一套协议覆盖所有市场
|
||||
|
||||
NOFXi 把不同交易所和券商的差异抹平在统一的执行协议下。
|
||||
|
||||
为什么这件事比看起来难:Binance 和 Bybit 的保证金计算方式不同。Hyperliquid 是链上合约,有 gas 和滑点问题。OKX 的止损单在持仓模式切换后行为会变。每家的精度、错误码、WebSocket 格式全不一样。15,000+ 行对接代码处理的就是这些差异。新交易所接入周期从行业平均数月压缩到 1-2 周。
|
||||
|
||||
目前状态:
|
||||
- 加密货币 9 家交易所已上线运行(Binance、Bybit、OKX、Bitget、KuCoin、Gate、Hyperliquid、Aster、Lighter)
|
||||
- 美股通过 Alpaca 接入开发中
|
||||
- 港股通过长桥设计完成
|
||||
|
||||
后续规划:A 股通过沪港通、更多券商接入。
|
||||
|
||||
跨市场能力不只是功能卖点。加密市场有强周期性,牛市万人用熊市剩百人。覆盖美股和港股意味着 NOFXi 不依赖单一市场周期,用户在任何行情下都有理由留在平台上。
|
||||
|
||||
---
|
||||
|
||||
## 让 AI 可被信任地交易
|
||||
|
||||
交易场景下 LLM 幻觉不是错误回答,是真金白银的损失。我们在实战中遇到过 AI 编造股票价格、编造持仓记录的情况。
|
||||
|
||||
解决方案不是加 prompt,是架构层的硬约束:
|
||||
|
||||
- 所有交易数据必须从交易所 API 实时获取,AI 被禁止从训练数据输出任何价格或持仓信息
|
||||
- 每笔交易生成待确认订单,用户确认后才执行,5 分钟未确认自动取消
|
||||
- 连续亏损达阈值时系统自动熔断,独立于 AI 决策
|
||||
- 系统任何单点故障都不会影响用户的持仓安全
|
||||
|
||||
这些是被动踩坑得来的经验。但更重要的是主动安全机制:代码开源可审计、定期安全审查、API Key 本地存储不上传(自部署版)或 AES-256 加密存储且只需交易权限不需提款权限(云端版)。
|
||||
|
||||
底层模型采用无关架构,支持 GPT、Claude、DeepSeek 等主流 LLM 热切换。不绑定任何一家模型供应商,模型涨价或不可用时可以无缝切换。
|
||||
|
||||
---
|
||||
|
||||
## 核心能力封装好了,生态还能无限扩展
|
||||
|
||||
NOFXi 的核心交易能力是封闭打磨的——行情、下单、风控、监控、策略这些预装 Skill 经过真实交易验证,质量我们自己把控。
|
||||
|
||||
在核心之上,NOFXi 的 Skill 架构允许第三方接入。一个外部服务要接进来,写一份描述文件、封装工具接口,Agent 自动学会调用,不用改 NOFXi 代码。
|
||||
|
||||
这打开了几个方向:
|
||||
|
||||
- VergeX(我们的另一个产品,定位 AI Trading Layer)的社区策略可以直接被 NOFXi 用户订阅执行。两个产品独立运营,互相导流
|
||||
- 第三方量化团队的信号、链上数据(Nansen)、情绪数据(Santiment)、财经新闻都可以作为 Skill 接入
|
||||
- 新交易所和券商接入周期 1-2 周
|
||||
- 风控服务、回测工具、税务计算都可以扩展
|
||||
|
||||
类比 iPhone + App Store:核心体验苹果自己做,生态应用第三方做。NOFXi 的能力天花板不取决于团队规模,取决于有多少优秀供应商接进来。
|
||||
|
||||
---
|
||||
|
||||
## 竞品都只做了一块
|
||||
|
||||
3Commas 和 Pionex 有百万用户,但它们是参数化机器人,不是 AI。Composer 拿了 YC 做自然语言策略,但只做美股、闭源不可扩展。ElizaOS 是开源 Agent 框架,但交易能力几乎为零。AlgosOne 做全自动 AI 交易,完全黑箱。
|
||||
|
||||
| | AI 对话 | 跨市场 | 安全层 | 开箱即用 | 可扩展 | 开源 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| **NOFXi** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| 3Commas | ❌ | ❌ | ⚠️ | ✅ | ❌ | ❌ |
|
||||
| Composer | ✅ | 美股 only | ⚠️ | ✅ | ❌ | ❌ |
|
||||
| ElizaOS | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ |
|
||||
| AlgosOne | ❌ | 部分 | ❌ 黑箱 | ✅ | ❌ | ❌ |
|
||||
|
||||
为什么别人只做了一块?因为同时做好 Agent 架构和交易工程需要两个领域的深度。大部分团队只有其中一个。我们的情况不同:NOFX 已经把交易引擎跑通了(11K star 证明了这一点),NOFXi 是在已有引擎上加 Agent 层,不是从零全铺。
|
||||
|
||||
---
|
||||
|
||||
## 市场有多大
|
||||
|
||||
- 全球加密衍生品日交易量 $100B+,散户交易者 5000 万+
|
||||
- 全球股票散户交易者 1.5 亿+,管理资产 $70T+
|
||||
- AI 交易工具市场 $3.2B(2025)→ $12B(2030)
|
||||
- 智能投顾 AUM $5.9T(2025)→ $16T(2030)
|
||||
- AI 交易工具在散户中的渗透率不到 1%
|
||||
|
||||
切入点:从加密交易者开始(7×24、AI 接受度最高、监管最宽松),向美股港股扩展。
|
||||
|
||||
---
|
||||
|
||||
## 怎么卖
|
||||
|
||||
第一步:存量转化。NOFX 社区 11K star 是天然种子用户,通过 GitHub、Discord、Telegram 直接触达。
|
||||
|
||||
第二步:交易社区渗透。TradingView、币安广场、Twitter 交易 KOL 合作。NOFXi 即插即用的特性让 KOL 可以直接演示完整流程。
|
||||
|
||||
第三步:交易所 BD。与交易所合作推广,交易所获得交易量增长,我们获得返佣和渠道。
|
||||
|
||||
第四步:Skill 生态驱动。第三方策略供应商在 NOFXi 上发布策略自带流量,每多一个优质策略就多一批用户。
|
||||
|
||||
关键指标链路:开源安装量 → Pro 转化率 → 月活交易用户 → 平台交易量。
|
||||
|
||||
---
|
||||
|
||||
## 怎么赚钱
|
||||
|
||||
**订阅**:开源版免费获客。Pro 约 99 元/月(云端托管 + 核心 Skill)。Premium 约 299 元/月(全市场 + 高级风控)。Enterprise 面议。对比:量化实盘年费 3000+ 元,NOFXi Pro 年费约 1200 元。
|
||||
|
||||
**交易所返佣**:用户交易量带来的返佣,加密交易所通常 20-40%。随规模线性增长的被动收入。
|
||||
|
||||
**Skill 生态抽成**:第三方付费 Skill 平台抽成 20-30%。App Store 模式。
|
||||
|
||||
**机构服务**:基金和资管的定制 Agent。高客单价,长期合同。
|
||||
|
||||
---
|
||||
|
||||
## 开源与商业化
|
||||
|
||||
核心 Agent 和交易引擎开源。云端服务和高级 Skill 付费。
|
||||
|
||||
开源的价值:获客成本接近零、社区帮助迭代、代码可审计建立信任。
|
||||
|
||||
竞品 fork 怎么办:开源世界同品类只剩一个赢家。11K star 的社区在持续迭代,fork 拿到的是快照,拿不走社区和持续维护能力。
|
||||
|
||||
---
|
||||
|
||||
## 合规
|
||||
|
||||
不托管资金。用户的钱始终在用户自己的交易所和券商账户。API Key 只需交易权限,不需提款权限。
|
||||
|
||||
人机协同 = 人类保留最终决策权。法律上是辅助工具。Composer 已拿到 SEC 注册,路径验证过。
|
||||
|
||||
渐进式进入:加密先行,美股通过持牌券商 Alpaca,港股通过持牌券商长桥。借助已有合规基础设施,不自己拿牌照。
|
||||
|
||||
开源 = 每行代码可审计。
|
||||
|
||||
---
|
||||
|
||||
## 技术架构
|
||||
|
||||
NOFXi 构建在 OpenClaw Agent 架构之上。OpenClaw 是开源通用 AI Agent 框架,提供运行时、Skill 加载和工具调用协议。NOFXi 专注交易领域深度。
|
||||
|
||||
关系类似 App 与操作系统。好处:不从零搭框架,OpenClaw 社区通用能力可直接复用。风险可控:OpenClaw 开源无锁定,必要时可 fork 独立演进。
|
||||
|
||||
---
|
||||
|
||||
## 关于壁垒
|
||||
|
||||
执行层的可靠性需要真实交易场景的持续迭代。9 家交易所、上万笔真实交易积累的工程经验,不是复制代码能获得的。
|
||||
|
||||
11K star 的社区是自增强的飞轮:用户多 → 贡献者多 → 产品更好 → 用户更多。开源世界先跑起来的项目会变成标准。
|
||||
|
||||
Skill 生态是另一层:用户用的 Skill 越多,迁移成本越高。供应商越多,用户越多,供应商越想接入。
|
||||
|
||||
交易领域的信任壁垒尤其高。用户把真钱放进来,没有 track record 的新产品没人敢用。NOFX 万级用户验证过的安全性,这个信任需要时间积累。
|
||||
|
||||
---
|
||||
|
||||
## 这件事做大了会变成什么
|
||||
|
||||
短期:交易者的 AI 助手,覆盖加密和美股。
|
||||
|
||||
中期:跨市场交易的标准入口。用户不需要关心背后连的是哪个交易所和券商,NOFXi 是统一界面。第三方 Skill 生态形成后,平台效应开始发挥。
|
||||
|
||||
长期:AI Agent 做交易这件事的基础设施层。当 AI Agent 成为每个人的标配时,它们需要一个可靠的交易执行层。NOFXi 就是那个层。
|
||||
|
||||
对标参考:Stripe 不开银行,只做支付接口,现在估值 $65B。NOFXi 不开交易所,只做 AI 交易执行层。
|
||||
|
||||
---
|
||||
|
||||
## 团队
|
||||
|
||||
[待补充]
|
||||
|
||||
## 融资
|
||||
|
||||
[待补充]
|
||||
|
||||
---
|
||||
|
||||
## 我们自己问过自己的问题
|
||||
|
||||
### 11K star 能转化多少付费用户?
|
||||
|
||||
开源转商业化的转化率通常 1-3%。11K star 也不等于 11K 活跃用户。我们不指望 star 直接变收入。star 的价值是品牌认知和信任背书——用户选交易工具时,万人社区验证过的项目 vs 全新项目,决策成本完全不同。真正的付费转化靠产品体验和交易价值。
|
||||
|
||||
### 跨市场是不是摊太薄了?
|
||||
|
||||
加密、美股、港股、A 股是四个不同的世界。我们不打算同时做。路径是:加密先跑通(已完成),美股跟上(在做),港股和 A 股是中长期。每进一个新市场,前提是上一个已稳定运行。统一协议让新市场接入边际成本可控,但我们不会为叙事牺牲深度。
|
||||
|
||||
### 99 元/月是不是太低?
|
||||
|
||||
刻意的。第一阶段目标是用户规模不是 ARPU。量化实盘年费 3000+ 的用户已有方案,我们要抓被价格挡在门外的更大群体。后续通过 Premium 和 Enterprise 拉高客单价,交易所返佣随量增长。当前用户增长优先于利润率。
|
||||
|
||||
### 竞品加个 AI 功能不就追上了?
|
||||
|
||||
可能的。3Commas 加 AI 对话、Composer 做加密、ElizaOS 加交易 Skill——都有可能。但他们各自要跨的那一步都不小。3Commas 围绕参数化规则设计,加 AI 意味着重写核心决策层。Composer 进加密要对接 9 家交易所。ElizaOS 加交易要从零建安全层。每一步至少半年。我们的优势不是他们做不了,是我们已经做了。窗口是这半年到一年。
|
||||
|
||||
### 极端行情、交易所宕机、用户索赔怎么办?
|
||||
|
||||
交易所宕机:支持多交易所分仓,单一交易所不可用不影响其他仓位。极端滑点:熔断机制在异常波动时暂停开新仓,但已有仓位滑点风险无法完全消除,用户协议中明确。法律免责:定位交易辅助工具,不提供投资建议,不做资金托管,用户协议明确风险责任,上线前经法律审查。
|
||||
|
||||
### 依赖 OpenClaw 的风险?
|
||||
|
||||
OpenClaw 开源,代码在手,不存在供应商锁定。最坏情况社区停止维护——fork 继续演进,成本是增加底层维护。当前风险很低,社区活跃,团队对架构有深入理解。核心价值在交易层不在框架层。框架可替换,15,000 行交易代码和 9 家交易所经验不可替换。
|
||||
|
||||
### Stripe 类比是不是太大了?
|
||||
|
||||
是的。Stripe 的 TAM 是万亿级,NOFXi 是百亿级。我们不是说自己会成为 Stripe,是说商业模式结构相似:不做交易所,做连接层和执行层,按交易量和服务收费。在百亿级市场做到头部,对早期投资的回报倍数已经足够。
|
||||
235
docs/NOFXi-Teaser.md
Normal file
235
docs/NOFXi-Teaser.md
Normal file
@@ -0,0 +1,235 @@
|
||||
# NOFXi Teaser
|
||||
|
||||
NOFX:GitHub 11,132 star,2,853 fork,峰值数万活跃用户,真实交易收入。9 家主流交易所实盘对接。我们把它升级成了 AI 原生版。
|
||||
|
||||
NOFXi 是一个垂直于交易领域的 AI Agent。大模型让交易意图表达变简单,Agent 架构让执行变自动化,NOFX 的交易引擎让执行变专业。三者合一,让用户的交易同时做到简单、专业、可自动化。
|
||||
|
||||
---
|
||||
|
||||
## 这件事为什么现在能做
|
||||
|
||||
三个条件在 2026 年同时成熟了:
|
||||
|
||||
第一,模型能力到了拐点。Reasoning model(o3、DeepSeek-R1)的出现让 AI 第一次能处理多步骤交易决策——不是简单的"RSI 低了就买",而是综合多个指标、多个时间框架、多个市场的复杂判断。这在一年前的模型上做不到。
|
||||
|
||||
第二,Agent 协议标准化了。MCP(Model Context Protocol)、Tool Calling、Skill 架构这些基础设施成熟了。AI 不再只能聊天,它能真正调用外部工具、持续运行、自主决策。交易是这套能力最天然的应用场景。
|
||||
|
||||
第三,监管态度在松动。Composer 在美国拿到了 SEC 注册。Alpaca 作为 API-first 券商服务了大量第三方交易应用。监管开始接受"AI 辅助交易"的定位,前提是人类保留最终决策权。
|
||||
|
||||
窗口已经打开。但进入真实资金场景后,把链路跑通只是第一步。AI 会编造数据、交易所之间差异巨大、风控缺失、跨市场没人做——这些才是真正的门槛。
|
||||
|
||||
---
|
||||
|
||||
## 一个具体场景
|
||||
|
||||
> Alice 在 Telegram 对 NOFXi 说:「BTC 跌破 6 万了,帮我在 Binance 做多 0.5 BTC,止损 3%,同时在 Alpaca 买入 $5000 的黄金 ETF 对冲。」
|
||||
>
|
||||
> NOFXi 30 秒内做了四件事:查询 Binance 和 Alpaca 的实时价格、计算仓位和止损点位、生成两笔待确认订单。Alice 在 Telegram 里点了确认,两笔单同时执行。
|
||||
>
|
||||
> 第二天 BTC 继续跌,触发止损。NOFXi 自动平仓并通知 Alice,总亏损控制在预设的 3% 以内。黄金 ETF 那边还在盈利。
|
||||
>
|
||||
> 整个过程 Alice 没有打开过任何交易所 App。
|
||||
|
||||
这就是 NOFXi 在做的事。下面讲我们怎么做到的。
|
||||
|
||||
---
|
||||
|
||||
## 从安装到第一笔交易:5 分钟
|
||||
|
||||
现在想让 AI 帮你交易,流程是这样的:装 Agent 平台、折腾环境、找交易 Skill 一个个装、去交易所申请 API Key 搞权限、发现 Skill 之间不兼容。大部分人在这里放弃了。
|
||||
|
||||
NOFXi 把这个流程压缩到一步。一键安装,预装全套交易 Skill,交易所配置统一化。Skill 之间的依赖和协同出厂就是通的——异动监控发现机会、通知 Agent、Agent 调交易引擎下单、同时触发风控。这条链路不需要用户自己搭。
|
||||
|
||||
这不性感,但这是一切后续价值的前提。
|
||||
|
||||
---
|
||||
|
||||
## 一套协议抹平所有市场差异
|
||||
|
||||
NOFXi 定义了一个 12 方法的 Trader Interface,把不同交易所和券商的差异全部抹平在协议层内部。
|
||||
|
||||
为什么这件事难:Binance 和 Bybit 的保证金计算不同。Hyperliquid 是链上合约,有 gas 和滑点。OKX 的止损单在持仓模式切换后行为会变。每家交易所的精度、错误码、WebSocket 格式全都不一样。
|
||||
|
||||
这不是写一层 wrapper 就行的。15,000+ 行交易所对接代码,9 家加密交易所(Binance、Bybit、OKX、Bitget、KuCoin、Gate、Hyperliquid、Aster、Lighter)已上线运行。美股通过 Alpaca 接入开发中,港股通过长桥设计完成,A 股通过沪港通规划中。
|
||||
|
||||
已完成的部分在真实资金环境验证过。未完成的部分路径清晰、技术方案确定。
|
||||
|
||||
---
|
||||
|
||||
## 让 AI 可被信任地下单
|
||||
|
||||
交易场景下 LLM 的幻觉不是一条错误回答,是一笔真金白银的损失。我们在实战中遇到过 AI 编造股票价格、编造持仓记录、不调工具直接胡说的情况。
|
||||
|
||||
解决方案不是加一条 prompt,是在架构层面做硬约束:
|
||||
|
||||
- 所有价格、持仓、余额数据必须从交易所 API 实时获取,AI 被禁止从训练数据输出任何交易数据
|
||||
- 每笔交易生成待确认订单,用户确认后才执行,5 分钟未确认自动取消
|
||||
- 连续亏损达阈值时系统自动停止开新仓,独立于 AI 决策的硬编码保护
|
||||
- 系统任何单点故障都不会影响用户的持仓安全
|
||||
|
||||
这些约束都是踩坑踩出来的。每一条背后有具体的事故场景。
|
||||
|
||||
API Key 安全:开源自部署版本中,API Key 存储在用户本地,不上传到任何服务器。云端托管版本中,API Key 使用 AES-256 加密存储,且只需要交易权限,不需要提款权限——即使泄露,攻击者也无法转走资金。
|
||||
|
||||
---
|
||||
|
||||
## 开箱有 Skill,不是空壳
|
||||
|
||||
ElizaOS 给你一个空的 Agent 骨架,交易能力自己搭。NOFXi 装上就有东西。
|
||||
|
||||
预装的不是 demo:多交易所执行(9 家差异全部处理)、异动监控(价格+量能+费率+持仓量多维度交叉验证)、跨市场行情(加密+美股+港股+A股+盘前盘后)、策略工作室(可视化构建,不用写代码)、智能下单(确认+风控+熔断三层安全)。
|
||||
|
||||
每一个 Skill 在真实交易中跑过,处理过边界情况,修过 bug。
|
||||
|
||||
---
|
||||
|
||||
## 能接任何优秀的第三方
|
||||
|
||||
NOFXi 基于 Skill 架构,天然支持第三方扩展。一个外部服务要接进来,写一份描述文件、封装几个工具接口,Agent 自动学会调用。不用改 NOFXi 代码。
|
||||
|
||||
这意味着:
|
||||
|
||||
- VergeX(我们的另一个产品,AI Trading Layer,社区驱动策略)的策略可以直接在 NOFXi 中被用户订阅和执行。两个产品各自独立发展,互相增强
|
||||
- 第三方量化团队、信号服务商、数据供应商(链上数据、情绪数据、财经新闻)都可以作为 Skill 接入
|
||||
- 新的交易所和券商实现 12 个方法即可接入,社区可以贡献
|
||||
- 风控服务、回测工具、税务计算都可以扩展
|
||||
|
||||
NOFXi 的能力天花板不取决于我们团队有多少人,取决于有多少优秀的供应商接进来。
|
||||
|
||||
---
|
||||
|
||||
## 为什么现在没人做到这件事
|
||||
|
||||
有人做了一部分。
|
||||
|
||||
3Commas 和 Pionex 有百万用户,验证了交易自动化需求,但它们是参数化机器人,不是 AI,不能对话,策略不能适应市场变化。
|
||||
|
||||
Composer 拿了 YC 的钱做自然语言策略,最接近我们的方向。但它只做美股,不碰加密,闭源不可扩展。
|
||||
|
||||
ElizaOS 是开源 Agent 框架,有社区但交易能力几乎为零。Coinbase AgentKit 只限自家生态。AlgosOne 做全自动 AI 交易但完全黑箱。
|
||||
|
||||
开箱即用、跨市场、AI 对话、人机协同、开放扩展、开源——这些条件要同时满足,需要同时在 Agent 架构和交易工程两个领域有足够深度。大部分团队只有其中一个。
|
||||
|
||||
---
|
||||
|
||||
## 市场规模
|
||||
|
||||
- 全球加密衍生品日交易量 $100B+,散户交易者 5000 万+
|
||||
- 全球股票散户交易者 1.5 亿+,管理资产 $70T+
|
||||
- AI 交易工具市场 $3.2B(2025)→ $12B(2030)
|
||||
- 智能投顾 AUM $5.9T(2025)→ $16T(2030)
|
||||
- AI 交易工具在散户中的渗透率不到 1%
|
||||
|
||||
切入点:从加密交易者开始(7×24 市场,用户对 AI 接受度最高,监管最宽松),再向美股、港股扩展。
|
||||
|
||||
---
|
||||
|
||||
## 我们已经有什么
|
||||
|
||||
NOFX 不是 PPT 项目:
|
||||
|
||||
- GitHub 11,132 star · 2,853 fork
|
||||
- 峰值数万月活跃用户
|
||||
- 真实交易收入
|
||||
- 9 家交易所实盘对接,15,000+ 行经过真实交易验证的代码
|
||||
- VergeX(AI Trading Layer)作为策略生态已独立运行
|
||||
|
||||
NOFXi 是在这个基础上的升级。现有用户是第一批种子用户,现有代码是核心资产。
|
||||
|
||||
---
|
||||
|
||||
## GTM 策略
|
||||
|
||||
第一步:存量转化。NOFX 社区 11K star 用户是天然的种子用户。NOFXi 发布后通过 GitHub、Discord、Telegram 社区直接触达。预期首月转化数千活跃用户。
|
||||
|
||||
第二步:交易社区渗透。TradingView、币安广场、Twitter 交易 KOL 合作。NOFXi 的即插即用特性降低了推广门槛——KOL 可以直接演示"从安装到交易 5 分钟"。
|
||||
|
||||
第三步:交易所 BD。与交易所合作推广 NOFXi,交易所获得交易量增长,我们获得返佣和渠道。双赢。
|
||||
|
||||
第四步:Skill 生态驱动增长。第三方策略供应商在 NOFXi 上发布策略,自带流量。每多一个优质策略,NOFXi 的用户就多一批。
|
||||
|
||||
---
|
||||
|
||||
## 商业模式
|
||||
|
||||
四条收入线:
|
||||
|
||||
**订阅**
|
||||
- 开源版免费自部署,获客和建社区
|
||||
- Pro 约 99 元/月 — 云端运行 + 核心 Skill + 多交易所
|
||||
- Premium 约 299 元/月 — 全市场 + 高级风控 + 专属策略
|
||||
- Enterprise 面议 — 机构定制 + 私有部署
|
||||
- 对比:量化实盘年费 3000+ 元,NOFXi Pro 年费约 1200 元
|
||||
|
||||
**交易所返佣**
|
||||
用户通过 NOFXi 产生的交易量,交易所按比例返佣。加密交易所返佣通常 20-40%。随用户规模线性增长的被动收入。
|
||||
|
||||
**Skill 生态抽成**
|
||||
第三方在 NOFXi 内提供付费 Skill(策略、数据、风控),平台抽成 20-30%。App Store 模式。
|
||||
|
||||
**机构服务**
|
||||
基金、家族办公室、资管机构的定制 Agent。高客单价,长期合同。
|
||||
|
||||
---
|
||||
|
||||
## 开源与商业化
|
||||
|
||||
NOFX 的 11K star 来自开源。NOFXi 延续开源路线——核心 Agent 和交易引擎开源,云端服务和高级 Skill 付费。
|
||||
|
||||
开源的价值:获客成本接近零、社区帮助迭代和测试、代码可审计建立信任(交易领域这一点尤其重要)。
|
||||
|
||||
竞品 fork 了怎么办:代码可以复制,但社区跟不过来。开源世界同品类只有一个赢家——Docker、K8s、React 都是这样。11K star 的社区在帮我们每天迭代,新的 fork 从零开始追的不是代码,是社区信任和持续维护能力。
|
||||
|
||||
---
|
||||
|
||||
## 合规
|
||||
|
||||
NOFXi 不托管资金。用户的钱始终在用户自己的交易所和券商账户。我们通过用户的 API Key 操作,且只需交易权限不需提款权限。
|
||||
|
||||
人机协同设计意味着人类保有最终决策权。确认模式下每笔交易需用户确认;自动模式下用户预设规则和边界。法律上这是辅助工具。
|
||||
|
||||
渐进式市场进入:加密市场监管最宽松先做。美股通过持牌券商 Alpaca 的 API。港股通过持牌券商长桥。A 股通过沪港通合规通道。每个市场借助已有合规基础设施,不自己拿牌照。
|
||||
|
||||
开源 = 代码可审计。对监管来说,这比黑箱产品有本质优势。
|
||||
|
||||
---
|
||||
|
||||
## 技术架构
|
||||
|
||||
NOFXi 构建在 OpenClaw Agent 架构之上。OpenClaw 是开源通用 AI Agent 框架,提供 Agent 运行时、Skill 加载、工具调用协议和多端交互。
|
||||
|
||||
NOFXi 与 OpenClaw 的关系类似 App 与操作系统:OpenClaw 提供底层能力,NOFXi 专注交易领域的深度。好处是不用从零搭 Agent 框架,且 OpenClaw 社区的通用能力可以直接用。
|
||||
|
||||
风险方面:OpenClaw 是开源项目,不存在单一厂商锁定。即使停止维护,可以 fork 独立演进。团队对 OpenClaw 有深入理解和贡献能力。
|
||||
|
||||
---
|
||||
|
||||
## 关于壁垒
|
||||
|
||||
说实话:代码可以复制,API 是公开的。
|
||||
|
||||
但 11K star 的社区每天在帮我们迭代。万级用户帮我们发现边界情况。9 家交易所几百个坑——Bybit 止损静默失败、OKX 持仓模式切换陷阱、LLM 编造价格——每一个都是用户亏钱换来的教训。竞品抄到的是某一天的快照,我们明天又往前走了一步。
|
||||
|
||||
Skill 生态是另一层:用户用的 Skill 越多,迁移到别的产品就越麻烦。供应商越多,用户越多,供应商越想接入。这个飞轮一旦转起来,就是真正的壁垒。
|
||||
|
||||
---
|
||||
|
||||
## 目标用户与增长路径
|
||||
|
||||
第一阶段:NOFX 现有社区的加密交易活跃用户。存量转化,不需要从零获客。
|
||||
|
||||
第二阶段:非技术背景交易者。NOFXi 的即插即用降低了门槛,不会编程的交易者也能用自然语言交易。这个群体远大于技术用户。
|
||||
|
||||
第三阶段:机构和量化团队。Skill 生态成熟后,NOFXi 可以作为机构交易 Agent 基础设施。企业版高客单价。
|
||||
|
||||
关键指标链路:开源版安装量 → Pro 转化率 → 月活跃交易用户 → 交易量。NOFX 已验证前两步,NOFXi 要跑通后两步。
|
||||
|
||||
---
|
||||
|
||||
## 团队
|
||||
|
||||
[待补充]
|
||||
|
||||
## 融资
|
||||
|
||||
[待补充]
|
||||
829
docs/pitch-deck/index.html
Normal file
829
docs/pitch-deck/index.html
Normal file
@@ -0,0 +1,829 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>NOFXi — Investor Deck</title>
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap');
|
||||
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
|
||||
:root {
|
||||
--bg: #07070d;
|
||||
--bg2: #0e0e1a;
|
||||
--card: #12121e;
|
||||
--card2: #1a1a2e;
|
||||
--accent: #6c5cff;
|
||||
--accent2: #00d4aa;
|
||||
--gold: #ffd700;
|
||||
--red: #ff4466;
|
||||
--green: #00cc88;
|
||||
--white: #ffffff;
|
||||
--gray: #8888aa;
|
||||
--gray2: #555566;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Inter', -apple-system, sans-serif;
|
||||
background: var(--bg);
|
||||
color: var(--white);
|
||||
overflow: hidden;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
/* ============ SLIDE SYSTEM ============ */
|
||||
.deck {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.slide {
|
||||
position: absolute;
|
||||
top: 0; left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
padding: 60px 100px;
|
||||
opacity: 0;
|
||||
transform: translateY(30px);
|
||||
transition: all 0.6s cubic-bezier(0.16, 1, 0.3, 1);
|
||||
pointer-events: none;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.slide.active {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
pointer-events: all;
|
||||
}
|
||||
|
||||
.slide::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -50%; left: -50%;
|
||||
width: 200%; height: 200%;
|
||||
background: radial-gradient(ellipse at 30% 20%, rgba(108,92,255,0.06) 0%, transparent 50%),
|
||||
radial-gradient(ellipse at 70% 80%, rgba(0,212,170,0.04) 0%, transparent 50%);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/* ============ NAVIGATION ============ */
|
||||
.nav {
|
||||
position: fixed;
|
||||
bottom: 30px;
|
||||
right: 40px;
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
z-index: 100;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.nav button {
|
||||
background: rgba(255,255,255,0.08);
|
||||
border: 1px solid rgba(255,255,255,0.1);
|
||||
color: var(--white);
|
||||
width: 44px; height: 44px;
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
font-size: 18px;
|
||||
transition: all 0.2s;
|
||||
backdrop-filter: blur(20px);
|
||||
}
|
||||
|
||||
.nav button:hover { background: rgba(108,92,255,0.3); }
|
||||
|
||||
.nav .counter {
|
||||
color: var(--gray);
|
||||
font-size: 13px;
|
||||
padding: 0 12px;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
|
||||
.progress {
|
||||
position: fixed;
|
||||
top: 0; left: 0;
|
||||
height: 3px;
|
||||
background: linear-gradient(90deg, var(--accent), var(--accent2));
|
||||
transition: width 0.4s ease;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
/* ============ TYPOGRAPHY ============ */
|
||||
h1 { font-size: 64px; font-weight: 800; line-height: 1.1; letter-spacing: -2px; }
|
||||
h2 { font-size: 42px; font-weight: 700; line-height: 1.2; letter-spacing: -1px; }
|
||||
h3 { font-size: 28px; font-weight: 600; line-height: 1.3; }
|
||||
p { font-size: 20px; line-height: 1.7; color: var(--gray); }
|
||||
.subtitle { font-size: 24px; color: var(--accent); font-weight: 500; margin-top: 12px; }
|
||||
.big-number { font-size: 56px; font-weight: 800; }
|
||||
.label { font-size: 13px; text-transform: uppercase; letter-spacing: 2px; color: var(--gray); font-weight: 600; }
|
||||
|
||||
.gradient-text {
|
||||
background: linear-gradient(135deg, var(--accent), var(--accent2));
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
/* ============ CARDS ============ */
|
||||
.cards { display: grid; gap: 24px; margin-top: 40px; }
|
||||
.cards-3 { grid-template-columns: repeat(3, 1fr); }
|
||||
.cards-4 { grid-template-columns: repeat(4, 1fr); }
|
||||
.cards-2 { grid-template-columns: repeat(2, 1fr); }
|
||||
|
||||
.card {
|
||||
background: var(--card);
|
||||
border: 1px solid rgba(255,255,255,0.06);
|
||||
border-radius: 20px;
|
||||
padding: 32px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
transition: transform 0.3s, border-color 0.3s;
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
transform: translateY(-4px);
|
||||
border-color: rgba(108,92,255,0.3);
|
||||
}
|
||||
|
||||
.card .icon {
|
||||
font-size: 36px;
|
||||
margin-bottom: 16px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.card h3 { margin-bottom: 12px; font-size: 22px; }
|
||||
.card p { font-size: 16px; line-height: 1.6; }
|
||||
|
||||
.card-accent {
|
||||
background: linear-gradient(135deg, rgba(108,92,255,0.15), rgba(0,212,170,0.08));
|
||||
border-color: rgba(108,92,255,0.2);
|
||||
}
|
||||
|
||||
.card-gold {
|
||||
background: linear-gradient(135deg, rgba(255,215,0,0.08), rgba(255,215,0,0.02));
|
||||
border-color: rgba(255,215,0,0.15);
|
||||
}
|
||||
|
||||
/* ============ FLOW ============ */
|
||||
.flow {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin-top: 32px;
|
||||
}
|
||||
|
||||
.flow-item {
|
||||
background: var(--card);
|
||||
border: 1px solid rgba(255,255,255,0.06);
|
||||
border-radius: 16px;
|
||||
padding: 24px;
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.flow-arrow {
|
||||
color: var(--accent);
|
||||
font-size: 28px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
/* ============ QUOTE ============ */
|
||||
.quote {
|
||||
background: linear-gradient(135deg, rgba(108,92,255,0.1), rgba(0,212,170,0.05));
|
||||
border-left: 4px solid var(--accent);
|
||||
border-radius: 0 16px 16px 0;
|
||||
padding: 28px 36px;
|
||||
margin: 32px 0;
|
||||
font-size: 22px;
|
||||
color: var(--accent2);
|
||||
font-style: italic;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* ============ MOAT BOX ============ */
|
||||
.moat {
|
||||
background: linear-gradient(135deg, rgba(255,215,0,0.06), rgba(255,215,0,0.02));
|
||||
border: 1px solid rgba(255,215,0,0.15);
|
||||
border-radius: 16px;
|
||||
padding: 24px 32px;
|
||||
margin-top: 32px;
|
||||
}
|
||||
|
||||
.moat .moat-label {
|
||||
color: var(--gold);
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 2px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.moat p { color: #cccc99; font-size: 17px; }
|
||||
|
||||
/* ============ FLYWHEEL ============ */
|
||||
.flywheel {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 20px;
|
||||
margin: 40px 0;
|
||||
}
|
||||
|
||||
.flywheel-item {
|
||||
background: var(--card2);
|
||||
border-radius: 50%;
|
||||
width: 140px; height: 140px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
padding: 16px;
|
||||
border: 2px solid rgba(108,92,255,0.2);
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.flywheel-arrow { font-size: 24px; color: var(--accent); }
|
||||
|
||||
/* ============ TAG ============ */
|
||||
.tag {
|
||||
display: inline-block;
|
||||
padding: 6px 16px;
|
||||
border-radius: 20px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.tag-green { background: rgba(0,204,136,0.15); color: var(--green); }
|
||||
.tag-gold { background: rgba(255,215,0,0.15); color: var(--gold); }
|
||||
.tag-accent { background: rgba(108,92,255,0.15); color: var(--accent); }
|
||||
|
||||
/* ============ SPLIT LAYOUT ============ */
|
||||
.split { display: grid; grid-template-columns: 1fr 1fr; gap: 60px; align-items: center; }
|
||||
.split-wide { display: grid; grid-template-columns: 1.2fr 0.8fr; gap: 60px; align-items: start; }
|
||||
|
||||
/* ============ COVER SPECIFIC ============ */
|
||||
.cover { text-align: center; justify-content: center; align-items: center; }
|
||||
.cover h1 { font-size: 84px; margin-bottom: 16px; }
|
||||
.cover .tagline { font-size: 32px; color: rgba(255,255,255,0.7); margin-bottom: 24px; }
|
||||
|
||||
/* Logo animation */
|
||||
@keyframes glow {
|
||||
0%, 100% { text-shadow: 0 0 40px rgba(108,92,255,0.3); }
|
||||
50% { text-shadow: 0 0 80px rgba(108,92,255,0.6), 0 0 120px rgba(0,212,170,0.2); }
|
||||
}
|
||||
.cover h1 { animation: glow 4s ease-in-out infinite; }
|
||||
|
||||
/* ============ BARS ============ */
|
||||
.bar-chart { display: flex; flex-direction: column; gap: 16px; margin-top: 24px; }
|
||||
.bar-row { display: flex; align-items: center; gap: 16px; }
|
||||
.bar-label { width: 160px; font-size: 14px; color: var(--gray); text-align: right; }
|
||||
.bar { height: 36px; border-radius: 8px; display: flex; align-items: center; padding: 0 16px; font-size: 13px; font-weight: 600; }
|
||||
|
||||
/* Responsive */
|
||||
@media (max-width: 1200px) {
|
||||
.slide { padding: 40px 60px; }
|
||||
h1 { font-size: 48px; }
|
||||
h2 { font-size: 32px; }
|
||||
.cards-3, .cards-4 { grid-template-columns: repeat(2, 1fr); }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="progress" id="progress"></div>
|
||||
|
||||
<div class="deck" id="deck">
|
||||
|
||||
<!-- ========== SLIDE 1: COVER ========== -->
|
||||
<div class="slide cover active">
|
||||
<div class="label" style="margin-bottom:20px">CONFIDENTIAL · 2026</div>
|
||||
<h1 class="gradient-text">NOFXi</h1>
|
||||
<div class="tagline">The AI That Trades For You</div>
|
||||
<p style="max-width:700px;text-align:center">全球首个跨市场 AI 交易 Agent<br>越用越懂你 · 多 AI 博弈决策 · 交易智慧网络</p>
|
||||
</div>
|
||||
|
||||
<!-- ========== SLIDE 2: PROBLEM ========== -->
|
||||
<div class="slide">
|
||||
<div class="label">THE PROBLEM</div>
|
||||
<h1>万亿美元市场的痛</h1>
|
||||
<p>1.5 亿散户交易者,$70T+ 资产。三个致命问题:</p>
|
||||
<div class="cards cards-3">
|
||||
<div class="card">
|
||||
<span class="icon">😩</span>
|
||||
<h3 style="color:var(--red)">信息过载</h3>
|
||||
<p>加密 24/7,美股港股 A 股时区不同。一条推文引发暴跌。<br><br><strong style="color:var(--white)">散户不可能全天候盯盘</strong></p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<span class="icon">🔧</span>
|
||||
<h3 style="color:var(--red)">工具割裂</h3>
|
||||
<p>加密用 TradingView,美股用 Robinhood,港股用富途。<br><br><strong style="color:var(--white)">四个市场,四套逻辑</strong></p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<span class="icon">🏦</span>
|
||||
<h3 style="color:var(--red)">量化垄断</h3>
|
||||
<p>顶级量化年化 30-100%。门槛:Python + 百万资金 + 半年学习。<br><br><strong style="color:var(--white)">信息不对称 = 财富不对等</strong></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== SLIDE 3: SOLUTION ========== -->
|
||||
<div class="slide">
|
||||
<div class="label">THE SOLUTION</div>
|
||||
<h1>NOFXi 不是交易工具</h1>
|
||||
<h2 class="gradient-text" style="margin-top:8px">它是你的 AI 交易团队</h2>
|
||||
<div style="margin-top:40px;display:grid;grid-template-columns:repeat(5,1fr);gap:20px">
|
||||
<div style="text-align:center">
|
||||
<div style="font-size:48px;margin-bottom:12px">🕐</div>
|
||||
<h3 style="font-size:18px">24/7 在线</h3>
|
||||
<p style="font-size:14px">永远不休息</p>
|
||||
</div>
|
||||
<div style="text-align:center">
|
||||
<div style="font-size:48px;margin-bottom:12px">🌍</div>
|
||||
<h3 style="font-size:18px">全市场</h3>
|
||||
<p style="font-size:14px">Crypto + 美股 + 港股</p>
|
||||
</div>
|
||||
<div style="text-align:center">
|
||||
<div style="font-size:48px;margin-bottom:12px">🧠</div>
|
||||
<h3 style="font-size:18px">有记忆</h3>
|
||||
<p style="font-size:14px">从你的交易中学习</p>
|
||||
</div>
|
||||
<div style="text-align:center">
|
||||
<div style="font-size:48px;margin-bottom:12px">💬</div>
|
||||
<h3 style="font-size:18px">自然语言</h3>
|
||||
<p style="font-size:14px">「帮我抄底 NVDA」</p>
|
||||
</div>
|
||||
<div style="text-align:center">
|
||||
<div style="font-size:48px;margin-bottom:12px">⚔️</div>
|
||||
<h3 style="font-size:18px">多 AI 博弈</h3>
|
||||
<p style="font-size:14px">辩论后才下单</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="quote" style="margin-top:48px">
|
||||
「美股跌太多了,帮我用 30% 仓位抄底 NVDA,同时做空等量 BTC 对冲风险」<br>
|
||||
<span style="font-size:16px;color:var(--gray);font-style:normal">— 一句话,NOFXi 自动完成跨市场操作</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== SLIDE 4: MEMORY NETWORK ========== -->
|
||||
<div class="slide">
|
||||
<div class="label">CORE CAPABILITY #1</div>
|
||||
<div class="split-wide">
|
||||
<div>
|
||||
<h1>🧠 交易记忆网络</h1>
|
||||
<div class="subtitle">你的 AI 越用越值钱</div>
|
||||
<p style="margin-top:24px">用了三年的 TradingView 依然不知道你是谁。<br>NOFXi 从第一笔交易就在构建你的专属记忆图谱。</p>
|
||||
<div style="margin-top:32px;display:flex;flex-direction:column;gap:20px">
|
||||
<div style="display:flex;gap:16px;align-items:start">
|
||||
<span style="font-size:28px">📊</span>
|
||||
<div><h3 style="font-size:18px;margin-bottom:4px">行为画像</h3><p style="font-size:15px">知道你恐慌时卖出、FOMO 时追高,主动干预情绪化决策</p></div>
|
||||
</div>
|
||||
<div style="display:flex;gap:16px;align-items:start">
|
||||
<span style="font-size:28px">🔗</span>
|
||||
<div><h3 style="font-size:18px;margin-bottom:4px">环境关联</h3><p style="font-size:15px">记住「加息 + 非农超预期 = 你亏 12%」,下次提前预警</p></div>
|
||||
</div>
|
||||
<div style="display:flex;gap:16px;align-items:start">
|
||||
<span style="font-size:28px">📈</span>
|
||||
<div><h3 style="font-size:18px;margin-bottom:4px">进化学习</h3><p style="font-size:15px">每笔盈亏修正判断权重。三个月后,你的 Agent 独一无二</p></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="moat">
|
||||
<div class="moat-label">💰 投资价值</div>
|
||||
<p>用户迁移成本极高 — 换软件 = 从零训练,没人愿意</p>
|
||||
<p style="margin-top:12px">SaaS 梦寐以求的留存率 — 用户越久,Agent 越强,粘性越高</p>
|
||||
<p style="margin-top:16px;font-style:italic;color:var(--gray)">Spotify 用几年懂你的音乐<br>NOFXi 用几个月懂你的交易</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== SLIDE 5: MULTI AI ========== -->
|
||||
<div class="slide">
|
||||
<div class="label">CORE CAPABILITY #2</div>
|
||||
<h1>⚔️ 多 AI 博弈决策</h1>
|
||||
<div class="subtitle">华尔街投研团队,人人可用</div>
|
||||
<p style="margin-top:12px">桥水有 1500 人投研团队。散户只有自己。NOFXi 用 AI 复刻机构决策流水线:</p>
|
||||
<div class="flow" style="margin-top:40px">
|
||||
<div class="flow-item" style="border-color:rgba(0,204,136,0.3)">
|
||||
<div style="font-size:28px;margin-bottom:8px">🟢</div>
|
||||
<h3 style="font-size:16px;color:var(--green)">Bull AI</h3>
|
||||
<p style="font-size:13px">穷尽做多理由<br>挖掘被低估机会</p>
|
||||
</div>
|
||||
<div class="flow-arrow">→</div>
|
||||
<div class="flow-item" style="border-color:rgba(255,68,102,0.3)">
|
||||
<div style="font-size:28px;margin-bottom:8px">🔴</div>
|
||||
<h3 style="font-size:16px;color:var(--red)">Bear AI</h3>
|
||||
<p style="font-size:13px">魔鬼代言人<br>专找风险和空头逻辑</p>
|
||||
</div>
|
||||
<div class="flow-arrow">→</div>
|
||||
<div class="flow-item" style="border-color:rgba(108,92,255,0.3)">
|
||||
<div style="font-size:28px;margin-bottom:8px">🧩</div>
|
||||
<h3 style="font-size:16px;color:var(--accent)">Strategist</h3>
|
||||
<p style="font-size:13px">综合多空博弈<br>输出交易方案</p>
|
||||
</div>
|
||||
<div class="flow-arrow">→</div>
|
||||
<div class="flow-item" style="border-color:rgba(255,215,0,0.3)">
|
||||
<div style="font-size:28px;margin-bottom:8px">🛡️</div>
|
||||
<h3 style="font-size:16px;color:var(--gold)">Risk AI</h3>
|
||||
<p style="font-size:13px">最后一道关<br>不过审 = 不执行</p>
|
||||
</div>
|
||||
<div class="flow-arrow">→</div>
|
||||
<div style="background:var(--accent);border-radius:16px;padding:24px;text-align:center">
|
||||
<div style="font-size:28px;margin-bottom:8px">✅</div>
|
||||
<h3 style="font-size:16px">Execute</h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="moat" style="margin-top:32px">
|
||||
<div class="moat-label">💰 投资价值</div>
|
||||
<p>多 AI 对抗的 prompt 框架 + 辩论收敛算法 + 实战权重调优 — 需要上万笔真实交易迭代。时间壁垒 + 数据壁垒,不是开源能复制的。</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== SLIDE 6: CROSS MARKET ========== -->
|
||||
<div class="slide">
|
||||
<div class="label">CORE CAPABILITY #3</div>
|
||||
<h1>🌍 全市场统一 Agent</h1>
|
||||
<div class="subtitle">一个大脑管所有资产 — 全球唯一</div>
|
||||
<div class="quote" style="margin-top:32px">
|
||||
「BTC 大跌,帮我把 30% 仓位转到黄金 ETF 避险,同时买入港股腾讯 1000 股」
|
||||
</div>
|
||||
<div class="cards cards-3" style="margin-top:24px">
|
||||
<div class="card" style="border-color:rgba(0,204,136,0.3)">
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px">
|
||||
<h3 style="font-size:18px;color:var(--green)">✅ 加密货币</h3>
|
||||
<span class="tag tag-green">已上线</span>
|
||||
</div>
|
||||
<p style="font-size:15px">Binance · Bybit · OKX · Bitget<br>KuCoin · Gate · Hyperliquid<br>Aster · Lighter</p>
|
||||
</div>
|
||||
<div class="card" style="border-color:rgba(255,215,0,0.3)">
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px">
|
||||
<h3 style="font-size:18px;color:var(--gold)">🔨 美股</h3>
|
||||
<span class="tag tag-gold">开发中</span>
|
||||
</div>
|
||||
<p style="font-size:15px">Alpaca<br>Paper Trading + Live<br>盘前盘后支持</p>
|
||||
</div>
|
||||
<div class="card" style="border-color:rgba(108,92,255,0.3)">
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px">
|
||||
<h3 style="font-size:18px;color:var(--accent)">📋 港股 / A股</h3>
|
||||
<span class="tag tag-accent">规划中</span>
|
||||
</div>
|
||||
<p style="font-size:15px">LongPort 长桥<br>沪港通<br>300+ 只大盘股</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="moat" style="margin-top:24px">
|
||||
<div class="moat-label">💰 投资价值</div>
|
||||
<p>12+ 交易所/券商的管道工程极其复杂。先发者 = 标准制定者,后来者从零追赶。</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== SLIDE 7: MEMORY MARKET ========== -->
|
||||
<div class="slide">
|
||||
<div class="label">CORE CAPABILITY #4</div>
|
||||
<h1>🏪 记忆市场</h1>
|
||||
<div class="subtitle">交易智慧的 App Store</div>
|
||||
<div class="split" style="margin-top:32px">
|
||||
<div>
|
||||
<p style="font-size:22px;color:var(--white);line-height:1.6">eToro 让你复制<strong>操作</strong>。<br>NOFXi 让你复制<strong style="color:var(--accent2)">大脑</strong>。</p>
|
||||
<div style="margin-top:28px;display:flex;flex-direction:column;gap:20px">
|
||||
<div style="display:flex;gap:14px;align-items:start">
|
||||
<span style="font-size:24px">1️⃣</span>
|
||||
<p style="font-size:16px">顶级交易员打包 Agent 记忆出售<br><span style="color:var(--gray2)">判断框架 + 风险偏好 + 踩坑经验</span></p>
|
||||
</div>
|
||||
<div style="display:flex;gap:14px;align-items:start">
|
||||
<span style="font-size:24px">2️⃣</span>
|
||||
<p style="font-size:16px">买家在他人记忆上继续训练<br><span style="color:var(--gray2)">你的习惯 + 他的经验 = 超级 Agent</span></p>
|
||||
</div>
|
||||
<div style="display:flex;gap:14px;align-items:start">
|
||||
<span style="font-size:24px">3️⃣</span>
|
||||
<p style="font-size:16px">实盘评分系统<br><span style="color:var(--gray2)">胜率 / 夏普比率 / 最大回撤</span></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="text-align:center">
|
||||
<div class="flywheel">
|
||||
<div class="flywheel-item" style="border-color:var(--accent)">用户<br>越多</div>
|
||||
<div class="flywheel-arrow">→</div>
|
||||
<div class="flywheel-item" style="border-color:var(--accent2)">记忆<br>越丰富</div>
|
||||
</div>
|
||||
<div style="font-size:24px;color:var(--accent);margin:8px 0">🔄</div>
|
||||
<div class="flywheel">
|
||||
<div class="flywheel-item" style="border-color:var(--gold)">新用户<br>越想来</div>
|
||||
<div class="flywheel-arrow">←</div>
|
||||
<div class="flywheel-item" style="border-color:var(--green)">平台<br>越值钱</div>
|
||||
</div>
|
||||
<p style="margin-top:20px;font-size:14px">网络效应飞轮</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="moat" style="margin-top:20px">
|
||||
<div class="moat-label">💰 投资价值</div>
|
||||
<p>GitHub 是代码的网络,NOFXi 是交易智慧的网络。平台抽成 20-30%。双边网络效应 = 越滚越大。</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== SLIDE 8: NL STRATEGY ========== -->
|
||||
<div class="slide">
|
||||
<div class="label">CORE CAPABILITY #5</div>
|
||||
<h1>💬 自然语言策略引擎</h1>
|
||||
<div class="subtitle">量化民主化 — 说人话,做量化</div>
|
||||
<div class="quote" style="margin-top:32px;font-size:20px">
|
||||
「当 BTC RSI < 30 且美股期货是绿的,用 10% 仓位做多,止损 3%,止盈 8%,每周五收盘前平仓」
|
||||
</div>
|
||||
<div class="flow" style="margin-top:32px">
|
||||
<div class="flow-item">
|
||||
<div style="font-size:24px;margin-bottom:8px">🔍</div>
|
||||
<h3 style="font-size:15px;color:var(--accent)">解析语义</h3>
|
||||
<p style="font-size:12px">理解策略意图<br>处理模糊表述</p>
|
||||
</div>
|
||||
<div class="flow-arrow">→</div>
|
||||
<div class="flow-item">
|
||||
<div style="font-size:24px;margin-bottom:8px">⚙️</div>
|
||||
<h3 style="font-size:15px;color:var(--accent)">绑定指标</h3>
|
||||
<p style="font-size:12px">RSI / EMA / MACD<br>自动绑定数据源</p>
|
||||
</div>
|
||||
<div class="flow-arrow">→</div>
|
||||
<div class="flow-item">
|
||||
<div style="font-size:24px;margin-bottom:8px">👁️</div>
|
||||
<h3 style="font-size:15px;color:var(--accent)">7×24 监控</h3>
|
||||
<p style="font-size:12px">条件触发执行<br>不用盯盘</p>
|
||||
</div>
|
||||
<div class="flow-arrow">→</div>
|
||||
<div class="flow-item">
|
||||
<div style="font-size:24px;margin-bottom:8px">📊</div>
|
||||
<h3 style="font-size:15px;color:var(--accent)">持续复盘</h3>
|
||||
<p style="font-size:12px">自动评估表现<br>建议优化</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="split" style="margin-top:32px">
|
||||
<div class="card" style="text-align:center">
|
||||
<p style="font-size:14px;color:var(--red)">传统量化</p>
|
||||
<p style="font-size:28px;font-weight:700;color:var(--red);margin:8px 0">6 个月 + $1M</p>
|
||||
<p style="font-size:13px">Python + 回测框架 + 数据工程</p>
|
||||
</div>
|
||||
<div class="card card-accent" style="text-align:center">
|
||||
<p style="font-size:14px;color:var(--accent2)">NOFXi</p>
|
||||
<p style="font-size:28px;font-weight:700;color:var(--accent2);margin:8px 0">一句话</p>
|
||||
<p style="font-size:13px">知识是门槛,不是编程</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== SLIDE 9: TECH ========== -->
|
||||
<div class="slide">
|
||||
<div class="label">TECHNOLOGY</div>
|
||||
<h1>🔒 技术壁垒</h1>
|
||||
<div class="subtitle">为什么别人做不了?</div>
|
||||
<div style="display:flex;flex-direction:column;gap:16px;margin-top:36px">
|
||||
<div class="card" style="display:flex;gap:24px;align-items:center;padding:20px 28px">
|
||||
<span style="font-size:28px">🔌</span>
|
||||
<div style="flex:0 0 200px"><h3 style="font-size:16px;color:var(--accent2)">统一交易协议层</h3></div>
|
||||
<p style="font-size:15px;flex:1">12+ 交易所/券商,每个 API 完全不同。Stripe 统一支付,NOFXi 统一交易。</p>
|
||||
</div>
|
||||
<div class="card" style="display:flex;gap:24px;align-items:center;padding:20px 28px">
|
||||
<span style="font-size:28px">🤖</span>
|
||||
<div style="flex:0 0 200px"><h3 style="font-size:16px;color:var(--accent2)">Agent 决策引擎</h3></div>
|
||||
<p style="font-size:15px;flex:1">多轮 Tool Calling,5 轮决策循环。新增能力 = 注册工具,LLM 自动学会使用。</p>
|
||||
</div>
|
||||
<div class="card" style="display:flex;gap:24px;align-items:center;padding:20px 28px">
|
||||
<span style="font-size:28px">🔒</span>
|
||||
<div style="flex:0 0 200px"><h3 style="font-size:16px;color:var(--accent2)">安全执行沙箱</h3></div>
|
||||
<p style="font-size:15px;flex:1">确认机制 + Panic Recovery + 数据真实性约束。交易 ≠ 聊天,一个错误 = 真金白银。</p>
|
||||
</div>
|
||||
<div class="card" style="display:flex;gap:24px;align-items:center;padding:20px 28px">
|
||||
<span style="font-size:28px">🔄</span>
|
||||
<div style="flex:0 0 200px"><h3 style="font-size:16px;color:var(--accent2)">自驱进化架构</h3></div>
|
||||
<p style="font-size:15px;flex:1">Sentinel(异动) + Brain(主动) + Learner(学习) — 不需用户干预的自我进化闭环。</p>
|
||||
</div>
|
||||
<div class="card" style="display:flex;gap:24px;align-items:center;padding:20px 28px">
|
||||
<span style="font-size:28px">🌀</span>
|
||||
<div style="flex:0 0 200px"><h3 style="font-size:16px;color:var(--accent2)">实战数据飞轮</h3></div>
|
||||
<p style="font-size:15px;flex:1">每笔真实交易训练系统。竞品从零开始,我们已在积累。时间 = 不可逾越的壁垒。</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== SLIDE 10: ECOSYSTEM ========== -->
|
||||
<div class="slide">
|
||||
<div class="label">ECOSYSTEM</div>
|
||||
<h1>📱 开放生态</h1>
|
||||
<div class="subtitle">NOFXi = 交易世界的 iPhone + App Store</div>
|
||||
<p style="margin-top:12px">Agent 是操作系统,Plugin 是 App。每接入一个伙伴,能力增强一分。</p>
|
||||
<div class="cards cards-4" style="margin-top:32px">
|
||||
<div class="card">
|
||||
<span class="icon">🔌</span>
|
||||
<h3 style="font-size:17px">交易执行</h3>
|
||||
<p style="font-size:14px">Vergex 等量化平台<br>策略/信号一键接入</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<span class="icon">📊</span>
|
||||
<h3 style="font-size:17px">数据源</h3>
|
||||
<p style="font-size:14px">Nansen · Bloomberg<br>Santiment 情绪数据</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<span class="icon">🧮</span>
|
||||
<h3 style="font-size:17px">策略市场</h3>
|
||||
<p style="font-size:14px">第三方策略发布<br>用户订阅 · 平台抽成</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<span class="icon">🛡️</span>
|
||||
<h3 style="font-size:17px">风控服务</h3>
|
||||
<p style="font-size:14px">专业风控团队<br>执行前自动审核</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card card-accent" style="margin-top:24px;padding:24px 32px">
|
||||
<h3 style="font-size:18px;margin-bottom:8px">🤝 Vergex 深度集成</h3>
|
||||
<p style="font-size:15px">策略提供商 + 执行通道 + 数据源 + 品牌联合 —「NOFXi × Vergex 联合策略」</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== SLIDE 11: MARKET ========== -->
|
||||
<div class="slide">
|
||||
<div class="label">MARKET OPPORTUNITY</div>
|
||||
<h1>📈 市场机会</h1>
|
||||
<div class="cards cards-4" style="margin-top:36px">
|
||||
<div class="card" style="text-align:center">
|
||||
<div class="big-number gradient-text">$70T+</div>
|
||||
<p style="font-size:14px;margin-top:8px">全球散户交易资产</p>
|
||||
</div>
|
||||
<div class="card" style="text-align:center">
|
||||
<div class="big-number gradient-text">$12B</div>
|
||||
<p style="font-size:14px;margin-top:8px">加密交易工具 · 2030</p>
|
||||
</div>
|
||||
<div class="card" style="text-align:center">
|
||||
<div class="big-number gradient-text">$16T</div>
|
||||
<p style="font-size:14px;margin-top:8px">智能投顾 AUM · 2030</p>
|
||||
</div>
|
||||
<div class="card" style="text-align:center">
|
||||
<div class="big-number gradient-text">$4B</div>
|
||||
<p style="font-size:14px;margin-top:8px">Copy Trading · 2028</p>
|
||||
</div>
|
||||
</div>
|
||||
<h3 style="margin-top:40px;margin-bottom:20px">切入路径</h3>
|
||||
<div class="cards cards-3">
|
||||
<div class="card" style="border-top:3px solid var(--green)">
|
||||
<span class="tag tag-green" style="margin-bottom:12px">Phase 1 · 现在</span>
|
||||
<h3 style="font-size:20px">加密交易者</h3>
|
||||
<p style="font-size:14px;margin-top:8px">7×24 市场 · AI 接受度最高<br>9 交易所已上线<br><strong style="color:var(--white)">目标:1,000 用户</strong></p>
|
||||
</div>
|
||||
<div class="card" style="border-top:3px solid var(--gold)">
|
||||
<span class="tag tag-gold" style="margin-bottom:12px">Phase 2 · Q3 2026</span>
|
||||
<h3 style="font-size:20px">跨市场交易者</h3>
|
||||
<p style="font-size:14px;margin-top:8px">美股 + 港股 · 记忆市场上线<br>月交易量 $100M+<br><strong style="color:var(--white)">目标:10,000 用户</strong></p>
|
||||
</div>
|
||||
<div class="card" style="border-top:3px solid var(--accent)">
|
||||
<span class="tag tag-accent" style="margin-bottom:12px">Phase 3 · 2027</span>
|
||||
<h3 style="font-size:20px">资产管理 Agent</h3>
|
||||
<p style="font-size:14px;margin-top:8px">DeFi + CeFi + TradFi<br>AUM $1B+<br><strong style="color:var(--white)">目标:100,000 用户</strong></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== SLIDE 12: BUSINESS MODEL ========== -->
|
||||
<div class="slide">
|
||||
<div class="label">BUSINESS MODEL</div>
|
||||
<h1>💵 商业模式</h1>
|
||||
<div class="cards cards-4" style="margin-top:40px">
|
||||
<div class="card" style="text-align:center;border-top:3px solid var(--accent)">
|
||||
<span class="icon">💎</span>
|
||||
<h3>Pro 订阅</h3>
|
||||
<div style="font-size:28px;font-weight:700;color:var(--accent2);margin:12px 0">$29-99/月</div>
|
||||
<p style="font-size:14px">高级 AI 模型<br>更多交易对 · 更长记忆</p>
|
||||
<div class="tag tag-accent" style="margin-top:16px">主要收入</div>
|
||||
</div>
|
||||
<div class="card" style="text-align:center;border-top:3px solid var(--gold)">
|
||||
<span class="icon">🏪</span>
|
||||
<h3>记忆市场</h3>
|
||||
<div style="font-size:28px;font-weight:700;color:var(--accent2);margin:12px 0">抽成 20-30%</div>
|
||||
<p style="font-size:14px">交易员出售记忆<br>平台抽佣</p>
|
||||
<div class="tag tag-gold" style="margin-top:16px">平台收入</div>
|
||||
</div>
|
||||
<div class="card" style="text-align:center;border-top:3px solid var(--green)">
|
||||
<span class="icon">🔄</span>
|
||||
<h3>交易量返佣</h3>
|
||||
<div style="font-size:28px;font-weight:700;color:var(--accent2);margin:12px 0">按量分成</div>
|
||||
<p style="font-size:14px">与交易所合作<br>交易量返佣</p>
|
||||
<div class="tag tag-green" style="margin-top:16px">被动收入</div>
|
||||
</div>
|
||||
<div class="card" style="text-align:center;border-top:3px solid var(--accent2)">
|
||||
<span class="icon">🏢</span>
|
||||
<h3>企业版</h3>
|
||||
<div style="font-size:28px;font-weight:700;color:var(--accent2);margin:12px 0">高客单价</div>
|
||||
<p style="font-size:14px">为基金/机构<br>定制 Agent</p>
|
||||
<div class="tag tag-accent" style="margin-top:16px">高端收入</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== SLIDE 13: OPEN SOURCE BIZ MODEL ========== -->
|
||||
<div class="slide">
|
||||
<div class="label">OPEN SOURCE STRATEGY</div>
|
||||
<h1>🔓 开源商业模式</h1>
|
||||
<div class="subtitle">开源引擎获客,云端服务赚钱</div>
|
||||
<p style="margin-top:8px">Red Hat ($34B) · GitLab ($8B) · Databricks ($43B) — 都是开源公司。</p>
|
||||
<div class="split" style="margin-top:28px">
|
||||
<div>
|
||||
<h3 style="color:var(--accent2);margin-bottom:16px">🆓 开源(免费)→ 获取</h3>
|
||||
<div class="card" style="margin-bottom:12px;padding:20px">
|
||||
<p style="font-size:15px">
|
||||
<strong style="color:var(--white)">交易引擎</strong> — Trader interface + 交易所对接<br>
|
||||
<strong style="color:var(--white)">Agent 框架</strong> — 基础对话 + 工具调用<br>
|
||||
<strong style="color:var(--white)">单用户版</strong> — 自己部署,完全免费
|
||||
</p>
|
||||
</div>
|
||||
<div style="display:flex;flex-wrap:wrap;gap:8px;margin-top:12px">
|
||||
<span class="tag tag-green">开发者社区</span>
|
||||
<span class="tag tag-green">代码可审计=信任</span>
|
||||
<span class="tag tag-green">获客成本趋零</span>
|
||||
<span class="tag tag-green">你的接口=行业标准</span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 style="color:var(--gold);margin-bottom:16px">💰 不开源(收费)→ 变现</h3>
|
||||
<div style="display:flex;flex-direction:column;gap:10px">
|
||||
<div class="card" style="padding:14px 20px;border-left:3px solid var(--gold)">
|
||||
<p style="font-size:14px"><strong style="color:var(--white)">记忆网络</strong> — 云端同步,数据不是代码能复制的</p>
|
||||
</div>
|
||||
<div class="card" style="padding:14px 20px;border-left:3px solid var(--gold)">
|
||||
<p style="font-size:14px"><strong style="color:var(--white)">记忆市场</strong> — 双边平台,自建 GitHub 上面没用户</p>
|
||||
</div>
|
||||
<div class="card" style="padding:14px 20px;border-left:3px solid var(--gold)">
|
||||
<p style="font-size:14px"><strong style="color:var(--white)">多 AI 集群</strong> — 自跑 4 个 LLM $200+/月,我们卖 $29 双赢</p>
|
||||
</div>
|
||||
<div class="card" style="padding:14px 20px;border-left:3px solid var(--gold)">
|
||||
<p style="font-size:14px"><strong style="color:var(--white)">数据飞轮</strong> — 开源版永远比云端版慢一代</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="moat" style="margin-top:24px">
|
||||
<div class="moat-label">一句话</div>
|
||||
<p>代码可以复制,但记忆网络、调优过的 AI 团队、和双边市场不能复制。这是 Red Hat 模式 + App Store 模式。</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== SLIDE 14: CLOSING ========== -->
|
||||
<div class="slide cover">
|
||||
<h1 class="gradient-text" style="font-size:72px">NOFXi</h1>
|
||||
<p style="font-size:26px;color:var(--white);max-width:700px;text-align:center;margin-top:20px;line-height:1.6">
|
||||
正在构建交易智慧的网络。<br>
|
||||
每个用户训练自己的 AI 交易团队,<br>
|
||||
每个交易员的经验都能被分享和增值。
|
||||
</p>
|
||||
<div style="margin-top:32px;font-size:24px;font-weight:600" class="gradient-text">
|
||||
这不是又一个交易工具 — 这是交易的未来。
|
||||
</div>
|
||||
<p style="margin-top:40px;font-size:20px;color:var(--gray)">Trade Smarter, Together.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- NAVIGATION -->
|
||||
<div class="nav">
|
||||
<button onclick="prev()">←</button>
|
||||
<span class="counter" id="counter">1 / 13</span>
|
||||
<button onclick="next()">→</button>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let current = 0;
|
||||
const slides = document.querySelectorAll('.slide');
|
||||
const total = slides.length;
|
||||
const counter = document.getElementById('counter');
|
||||
const progress = document.getElementById('progress');
|
||||
|
||||
function show(n) {
|
||||
slides.forEach(s => s.classList.remove('active'));
|
||||
slides[n].classList.add('active');
|
||||
counter.textContent = `${n + 1} / ${total}`;
|
||||
document.title = `NOFXi Pitch Deck — ${n + 1}/${total}`;
|
||||
progress.style.width = `${((n + 1) / total) * 100}%`;
|
||||
}
|
||||
|
||||
function next() { if (current < total - 1) { current++; show(current); } }
|
||||
function prev() { if (current > 0) { current--; show(current); } }
|
||||
|
||||
document.addEventListener('keydown', e => {
|
||||
if (e.key === 'ArrowRight' || e.key === ' ') { e.preventDefault(); next(); }
|
||||
if (e.key === 'ArrowLeft') { e.preventDefault(); prev(); }
|
||||
if (e.key === 'f') { document.documentElement.requestFullscreen?.(); }
|
||||
});
|
||||
|
||||
// Touch support
|
||||
let touchStartX = 0;
|
||||
document.addEventListener('touchstart', e => { touchStartX = e.touches[0].clientX; });
|
||||
document.addEventListener('touchend', e => {
|
||||
const diff = touchStartX - e.changedTouches[0].clientX;
|
||||
if (Math.abs(diff) > 50) { diff > 0 ? next() : prev(); }
|
||||
});
|
||||
|
||||
show(0);
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
"nofx/logger"
|
||||
"nofx/market"
|
||||
"nofx/provider/hyperliquid"
|
||||
@@ -194,6 +195,21 @@ func NewStrategyEngine(config *store.StrategyConfig) *StrategyEngine {
|
||||
}
|
||||
client := nofxos.NewClient(nofxos.DefaultBaseURL, apiKey)
|
||||
|
||||
// If claw402 wallet key is available, route nofxos requests through claw402
|
||||
if walletKey := os.Getenv("CLAW402_WALLET_KEY"); walletKey != "" {
|
||||
claw402URL := os.Getenv("CLAW402_URL")
|
||||
if claw402URL == "" {
|
||||
claw402URL = "https://claw402.ai"
|
||||
}
|
||||
claw402Client, err := nofxos.NewClaw402DataClient(claw402URL, walletKey, nil)
|
||||
if err == nil {
|
||||
client.SetClaw402(claw402Client)
|
||||
logger.Infof("🔗 NofxOS data routed through claw402 (%s)", claw402URL)
|
||||
} else {
|
||||
logger.Warnf("⚠️ Failed to init claw402 data client: %v (using direct nofxos.ai)", err)
|
||||
}
|
||||
}
|
||||
|
||||
return &StrategyEngine{
|
||||
config: config,
|
||||
nofxosClient: client,
|
||||
|
||||
@@ -82,6 +82,13 @@ func X402DecodeHeader(b64 string) ([]byte, error) {
|
||||
return decoded, nil
|
||||
}
|
||||
|
||||
// MakeClaw402SignFunc creates an X402SignFunc from a private key for claw402 payments.
|
||||
func MakeClaw402SignFunc(privateKey *ecdsa.PrivateKey) X402SignFunc {
|
||||
return func(paymentHeaderB64 string) (string, error) {
|
||||
return SignBasePaymentHeader(privateKey, paymentHeaderB64, "Claw402")
|
||||
}
|
||||
}
|
||||
|
||||
// SignBasePaymentHeader decodes a base64 x402 header, parses it, and signs with
|
||||
// EIP-712 (USDC TransferWithAuthorization).
|
||||
func SignBasePaymentHeader(privateKey *ecdsa.PrivateKey, paymentHeaderB64 string, providerName string) (string, error) {
|
||||
|
||||
112
provider/nofxos/claw402.go
Normal file
112
provider/nofxos/claw402.go
Normal file
@@ -0,0 +1,112 @@
|
||||
package nofxos
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/ecdsa"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"nofx/mcp"
|
||||
"nofx/mcp/payment"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
)
|
||||
|
||||
// Claw402DataClient wraps nofxos API calls through claw402's x402 payment gateway.
|
||||
// Instead of calling nofxos.ai directly, it calls claw402.ai/api/v1/nofx/...
|
||||
// and pays with USDC for each request.
|
||||
type Claw402DataClient struct {
|
||||
claw402URL string
|
||||
privateKey *ecdsa.PrivateKey
|
||||
httpClient *http.Client
|
||||
logger mcp.Logger
|
||||
}
|
||||
|
||||
// NewClaw402DataClient creates a client that routes nofxos requests through claw402.
|
||||
// privateKeyHex is the wallet private key (0x-prefixed hex string).
|
||||
func NewClaw402DataClient(claw402URL, privateKeyHex string, logger mcp.Logger) (*Claw402DataClient, error) {
|
||||
if claw402URL == "" {
|
||||
claw402URL = "https://claw402.ai"
|
||||
}
|
||||
claw402URL = strings.TrimRight(claw402URL, "/")
|
||||
|
||||
if privateKeyHex == "" {
|
||||
privateKeyHex = os.Getenv("CLAW402_WALLET_KEY")
|
||||
}
|
||||
if privateKeyHex == "" {
|
||||
return nil, fmt.Errorf("claw402 wallet private key not set")
|
||||
}
|
||||
|
||||
hexKey := strings.TrimPrefix(privateKeyHex, "0x")
|
||||
pk, err := crypto.HexToECDSA(hexKey)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("invalid claw402 private key: %w", err)
|
||||
}
|
||||
|
||||
return &Claw402DataClient{
|
||||
claw402URL: claw402URL,
|
||||
privateKey: pk,
|
||||
httpClient: &http.Client{Timeout: 30 * time.Second},
|
||||
logger: logger,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// endpoint mapping: nofxos path → claw402 path
|
||||
var endpointMap = map[string]string{
|
||||
"/api/ai500/list": "/api/v1/nofx/ai500/list",
|
||||
"/api/ai500/stats": "/api/v1/nofx/ai500/stats",
|
||||
}
|
||||
|
||||
// mapEndpoint converts a nofxos endpoint to a claw402 endpoint.
|
||||
// For endpoints not in the static map, applies the general pattern:
|
||||
// /api/xxx → /api/v1/nofx/xxx
|
||||
func mapEndpoint(nofxosPath string) string {
|
||||
if mapped, ok := endpointMap[nofxosPath]; ok {
|
||||
return mapped
|
||||
}
|
||||
// General pattern: /api/xxx → /api/v1/nofx/xxx
|
||||
if strings.HasPrefix(nofxosPath, "/api/") {
|
||||
return "/api/v1/nofx/" + strings.TrimPrefix(nofxosPath, "/api/")
|
||||
}
|
||||
return nofxosPath
|
||||
}
|
||||
|
||||
// DoRequest makes a GET request through claw402 with x402 payment.
|
||||
func (c *Claw402DataClient) DoRequest(endpoint string) ([]byte, error) {
|
||||
claw402Path := mapEndpoint(endpoint)
|
||||
// Strip auth= query params (claw402 uses x402 payment, not auth keys)
|
||||
if idx := strings.Index(claw402Path, "?auth="); idx != -1 {
|
||||
claw402Path = claw402Path[:idx]
|
||||
}
|
||||
if idx := strings.Index(claw402Path, "&auth="); idx != -1 {
|
||||
claw402Path = claw402Path[:idx]
|
||||
}
|
||||
|
||||
fullURL := c.claw402URL + claw402Path
|
||||
|
||||
buildReq := func() (*http.Request, error) {
|
||||
req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, fullURL, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.Header.Set("X-Client-ID", "nofx")
|
||||
return req, nil
|
||||
}
|
||||
|
||||
signFn := payment.MakeClaw402SignFunc(c.privateKey)
|
||||
|
||||
body, err := payment.DoX402Request(
|
||||
c.httpClient,
|
||||
buildReq,
|
||||
signFn,
|
||||
"claw402-data",
|
||||
c.logger,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("claw402 data request failed (%s): %w", claw402Path, err)
|
||||
}
|
||||
|
||||
return body, nil
|
||||
}
|
||||
@@ -21,10 +21,11 @@ const (
|
||||
|
||||
// Client is the NofxOS API client
|
||||
type Client struct {
|
||||
BaseURL string
|
||||
AuthKey string
|
||||
Timeout time.Duration
|
||||
mu sync.RWMutex
|
||||
BaseURL string
|
||||
AuthKey string
|
||||
Timeout time.Duration
|
||||
mu sync.RWMutex
|
||||
claw402 *Claw402DataClient // If set, routes requests through claw402
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -71,6 +72,13 @@ func (c *Client) SetConfig(baseURL, authKey string) {
|
||||
}
|
||||
}
|
||||
|
||||
// SetClaw402 enables routing requests through claw402 payment gateway.
|
||||
func (c *Client) SetClaw402(claw402Client *Claw402DataClient) {
|
||||
c.mu.Lock()
|
||||
defer c.mu.Unlock()
|
||||
c.claw402 = claw402Client
|
||||
}
|
||||
|
||||
// GetBaseURL returns the current base URL
|
||||
func (c *Client) GetBaseURL() string {
|
||||
c.mu.RLock()
|
||||
@@ -85,14 +93,22 @@ func (c *Client) GetAuthKey() string {
|
||||
return c.AuthKey
|
||||
}
|
||||
|
||||
// doRequest performs an HTTP GET request with authentication
|
||||
// doRequest performs an HTTP GET request with authentication.
|
||||
// If claw402 client is configured, routes through claw402 payment gateway instead.
|
||||
func (c *Client) doRequest(endpoint string) ([]byte, error) {
|
||||
c.mu.RLock()
|
||||
claw402Client := c.claw402
|
||||
baseURL := c.BaseURL
|
||||
authKey := c.AuthKey
|
||||
timeout := c.Timeout
|
||||
c.mu.RUnlock()
|
||||
|
||||
// Route through claw402 if configured
|
||||
if claw402Client != nil {
|
||||
return claw402Client.DoRequest(endpoint)
|
||||
}
|
||||
|
||||
// Direct call to nofxos.ai
|
||||
url := baseURL + endpoint
|
||||
if !strings.Contains(url, "auth=") {
|
||||
if strings.Contains(url, "?") {
|
||||
|
||||
@@ -390,39 +390,45 @@ func (t *AlpacaTrader) GetMarketPrice(symbol string) (float64, error) {
|
||||
}
|
||||
|
||||
// SetStopLoss places a stop order
|
||||
// SetStopLoss places a stop order. Uses "nofxi-sl-" client_order_id prefix
|
||||
// so CancelStopLossOrders can distinguish SL orders from user-placed stop orders.
|
||||
func (t *AlpacaTrader) SetStopLoss(symbol string, positionSide string, quantity, stopPrice float64) error {
|
||||
side := "sell" // stop loss for long = sell when price drops
|
||||
if positionSide == "SHORT" {
|
||||
side = "buy"
|
||||
}
|
||||
|
||||
order := AlpacaOrderRequest{
|
||||
Symbol: symbol,
|
||||
Qty: fmt.Sprintf("%.4f", quantity),
|
||||
Side: side,
|
||||
Type: "stop",
|
||||
TimeInForce: "gtc",
|
||||
StopPrice: fmt.Sprintf("%.2f", stopPrice),
|
||||
order := map[string]string{
|
||||
"symbol": symbol,
|
||||
"qty": fmt.Sprintf("%.4f", quantity),
|
||||
"side": side,
|
||||
"type": "stop",
|
||||
"time_in_force": "gtc",
|
||||
"stop_price": fmt.Sprintf("%.2f", stopPrice),
|
||||
"client_order_id": fmt.Sprintf("nofxi-sl-%s-%d", symbol, time.Now().UnixNano()),
|
||||
}
|
||||
|
||||
_, err := t.doPost("/v2/orders", order)
|
||||
return err
|
||||
}
|
||||
|
||||
// SetTakeProfit places a limit order as take-profit
|
||||
// SetTakeProfit places a limit order as take-profit.
|
||||
// Uses a "nofxi-tp-" client_order_id prefix so CancelTakeProfitOrders can
|
||||
// distinguish TP orders from user-placed limit orders.
|
||||
func (t *AlpacaTrader) SetTakeProfit(symbol string, positionSide string, quantity, takeProfitPrice float64) error {
|
||||
side := "sell" // take profit for long = sell when price rises
|
||||
if positionSide == "SHORT" {
|
||||
side = "buy"
|
||||
}
|
||||
|
||||
order := AlpacaOrderRequest{
|
||||
Symbol: symbol,
|
||||
Qty: fmt.Sprintf("%.4f", quantity),
|
||||
Side: side,
|
||||
Type: "limit",
|
||||
TimeInForce: "gtc",
|
||||
LimitPrice: fmt.Sprintf("%.2f", takeProfitPrice),
|
||||
order := map[string]string{
|
||||
"symbol": symbol,
|
||||
"qty": fmt.Sprintf("%.4f", quantity),
|
||||
"side": side,
|
||||
"type": "limit",
|
||||
"time_in_force": "gtc",
|
||||
"limit_price": fmt.Sprintf("%.2f", takeProfitPrice),
|
||||
"client_order_id": fmt.Sprintf("nofxi-tp-%s-%d", symbol, time.Now().UnixNano()),
|
||||
}
|
||||
|
||||
_, err := t.doPost("/v2/orders", order)
|
||||
@@ -430,13 +436,39 @@ func (t *AlpacaTrader) SetTakeProfit(symbol string, positionSide string, quantit
|
||||
}
|
||||
|
||||
// CancelStopLossOrders cancels stop orders for a symbol
|
||||
// CancelStopLossOrders cancels only NOFXi-created stop-loss orders
|
||||
// (identified by "nofxi-sl-" client_order_id prefix).
|
||||
func (t *AlpacaTrader) CancelStopLossOrders(symbol string) error {
|
||||
return t.cancelOrdersByType(symbol, "stop")
|
||||
orders, err := t.getOpenOrdersRaw(symbol)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, o := range orders {
|
||||
if strings.EqualFold(o.Type, "stop") && strings.HasPrefix(o.ClientOrderID, "nofxi-sl-") {
|
||||
if _, err := t.doDelete("/v2/orders/" + o.ID); err != nil {
|
||||
logger.Warnf("[Alpaca] cancel SL order %s: %v", o.ID, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CancelTakeProfitOrders cancels limit orders (used as take-profit) for a symbol
|
||||
// CancelTakeProfitOrders cancels only NOFXi-created take-profit limit orders
|
||||
// for a symbol (identified by "nofxi-tp-" client_order_id prefix).
|
||||
// This avoids accidentally canceling user-placed limit buy/sell orders.
|
||||
func (t *AlpacaTrader) CancelTakeProfitOrders(symbol string) error {
|
||||
return t.cancelOrdersByType(symbol, "limit")
|
||||
orders, err := t.getOpenOrdersRaw(symbol)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, o := range orders {
|
||||
if strings.EqualFold(o.Type, "limit") && strings.HasPrefix(o.ClientOrderID, "nofxi-tp-") {
|
||||
if _, err := t.doDelete("/v2/orders/" + o.ID); err != nil {
|
||||
logger.Warnf("[Alpaca] cancel TP order %s: %v", o.ID, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CancelAllOrders cancels all pending orders for a symbol.
|
||||
@@ -604,6 +636,23 @@ func (t *AlpacaTrader) IsMarketOpen() (bool, string, error) {
|
||||
|
||||
// --- Helper: cancel orders by type ---
|
||||
|
||||
// getOpenOrdersRaw returns raw AlpacaOrder structs (with ClientOrderID) for filtering.
|
||||
func (t *AlpacaTrader) getOpenOrdersRaw(symbol string) ([]AlpacaOrder, error) {
|
||||
path := "/v2/orders?status=open"
|
||||
if symbol != "" {
|
||||
path += "&symbols=" + symbol
|
||||
}
|
||||
data, err := t.doGet(path)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("get open orders: %w", err)
|
||||
}
|
||||
var orders []AlpacaOrder
|
||||
if err := json.Unmarshal(data, &orders); err != nil {
|
||||
return nil, fmt.Errorf("parse orders: %w", err)
|
||||
}
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
func (t *AlpacaTrader) cancelOrdersByType(symbol, orderType string) error {
|
||||
orders, err := t.GetOpenOrders(symbol)
|
||||
if err != nil {
|
||||
|
||||
@@ -116,26 +116,33 @@ func newMockAlpacaServer() *mockAlpacaServer {
|
||||
}
|
||||
json.NewEncoder(w).Encode(result)
|
||||
case "POST":
|
||||
var req AlpacaOrderRequest
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
// Parse as generic map to capture all fields including client_order_id
|
||||
var raw map[string]string
|
||||
if err := json.NewDecoder(r.Body).Decode(&raw); err != nil {
|
||||
http.Error(w, `{"message":"invalid body"}`, 400)
|
||||
return
|
||||
}
|
||||
reqType := raw["type"]
|
||||
reqSide := raw["side"]
|
||||
reqSymbol := raw["symbol"]
|
||||
reqQty := raw["qty"]
|
||||
// Simulate order fill for market orders
|
||||
fillStatus := "accepted"
|
||||
if req.Type == "market" {
|
||||
if reqType == "market" {
|
||||
fillStatus = "filled"
|
||||
// If buy, add position
|
||||
if req.Side == "buy" {
|
||||
m.addPosition(req.Symbol, req.Qty, "150.00")
|
||||
if reqSide == "buy" {
|
||||
m.addPosition(reqSymbol, reqQty, "150.00")
|
||||
}
|
||||
}
|
||||
order := m.createOrder(req.Symbol, req.Side, req.Qty, req.Type, fillStatus)
|
||||
if req.StopPrice != "" {
|
||||
order.StopPrice = req.StopPrice
|
||||
order := m.createOrder(reqSymbol, reqSide, reqQty, reqType, fillStatus)
|
||||
if v := raw["stop_price"]; v != "" {
|
||||
order.StopPrice = v
|
||||
}
|
||||
if req.LimitPrice != "" {
|
||||
order.LimitPrice = req.LimitPrice
|
||||
if v := raw["limit_price"]; v != "" {
|
||||
order.LimitPrice = v
|
||||
}
|
||||
if v := raw["client_order_id"]; v != "" {
|
||||
order.ClientOrderID = v
|
||||
}
|
||||
if fillStatus != "filled" {
|
||||
order.Status = "new" // stop/limit orders stay open
|
||||
|
||||
Reference in New Issue
Block a user