# Forex Market Analysis

> 外汇货币对与美元指数八维分析。利率路径与美元方向定大局，1-7维先形成主判断，第8维用CZSC缠论确认/冲突/不足，结构锚定止盈止损。

- **Type:** Skill
- **Install:** `agentstack add skill-lzh-xbccz-hermes-finance-forex-market-analysis`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [Lzh-xbccz](https://agentstack.voostack.com/s/lzh-xbccz)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [Lzh-xbccz](https://github.com/Lzh-xbccz)
- **Source:** https://github.com/Lzh-xbccz/hermes-finance/tree/main/skills/forex-market-analysis

## Install

```sh
agentstack add skill-lzh-xbccz-hermes-finance-forex-market-analysis
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# 外汇货币对日内交易全流程

> ⛔ 铁律：你不是在写行情播报，你是在做证据审计。每个方向判断必须回答"为什么"，并先做反向审计。允许使用"证据不足"、"方向未确认"、"观望"；禁止在证据冲突时硬给做多/做空。

> **核心理念：利率路径与美元方向定大局，结构位定执行。**
> 外汇的核心在利率预期、央行政策路径、美元强弱和风险偏好，不在链上或资金费率。

---

> **⛔ 禁止调用 mcp_yfinance 系列工具**：Yahoo Finance 频繁 429。所有数据通过 `scripts/` 目录下的 fetch 脚本获取（内置延迟+重试）。模型不要额外调 `mcp_yfinance_get_historical_stock_prices` 等 MCP 工具。

## 一、铁律（不可违反）

### 1. 先判断是否有方向优势
- 输出只能是 🟢 做多 / 🔴 做空 / ⚪ 观望，但默认不是强行二选一。
- 方向由你基于各维度证据的逻辑强度和可靠性综合判断得出，不要用投票计数或权重打分决定方向。
- 判断不出方向、数据窗口临近、美元与对手货币驱动冲突时，必须输出 ⚪ 观望。
- 方向针对用户给的交易对本身，不是对某个货币的主观看法。

### 2. 止盈止损必须锚定客观技术结构
- ✅ 允许参考的结构：前高/前低（独立摆点）、形态颈线、趋势线交点、斐波那契回撤位、密集成交区上沿/下沿、EMA21/EMA55
- ❌ **禁止**使用：24h 最高/最低点、今日开盘价、「跌 2% 就走」等固定百分比、任何以时间为边界而非结构为边界的价位
- 每一个 SL/TP 价位必须在报告中标注「结构依据」——具体说明这是哪个结构、什么时候形成的

### 3. 止损幅度由结构决定
- 做多止损：放在最近关键结构低点下方 0.2%-0.3%
- 做空止损：放在最近关键结构高点上方 0.2%-0.3%
- 止损幅度不由百分比决定（但如果结构决定的幅度超过账户风控上限，需特别标注风险，建议减小仓位而非放宽止损）
- 外汇波动较加密小，SL 缓冲可适当收窄至 0.15%-0.25%，但必须以结构位为准

### 4. 必须带失效条件
- 至少 2 个明确的「不等止损、立即手动平仓」的条件
- 失效条件必须是客观可观察的（4H K 线收盘、DXY 突破关键位、央行/宏观消息驱动转向等）

### 5. 数据缺口必须降级处理
- 报告开头必须标注**分析时间（UTC）**
- 技术结构、主导力量（央行/利率）、交叉验证三项里只要缺 1 项，默认降级为 ⚪ 观望
- 新闻、情绪等非关键块缺失时，可继续分析，但必须明确写出「数据缺口」
- 若 Yahoo Finance / Google News 返回 429、4xx、空数据，先减少请求并复用已拉取数据；仍失败则停止补抓，**绝不编造**
- 若处于周末或美国节假日，美股/DXY 现货数据默认视为上一交易日参考，不得当作实时盘中联动
- 重大数据公布前 30 分钟，自动降级为观望

### 6. 先复盘轨迹，再谈方向
- 每做一个货币对，必须先看它最近 `30D 4H` 是怎么走出来的，再看当前截面
- 必须回答：这个货币对最近更像 `趋势推进 / 箱体洗盘 / 冲高派发 / 跌破回收 / 阴跌磨人` 里的哪一种
- 如果你连最近主导手法都说不清，就不能把当前波动解读为高置信度机会

### 7. 分清货币对分子分母
- 始终明确货币对的 numerator / denominator 方向
- 做多 EURUSD = 看涨欧元、看跌美元；做空 USDJPY = 看跌美元、看涨日元
- 不要把「美元走强」的宏观判断直接等同于「做多 USDXXX」

### 8. 央行与宏观事件优先
- 外汇的核心驱动是利率路径和央行政策
- 若当前处在央行决议窗口（前 48h 内或后 24h 内），宏观权重大于技术面
- 若结构与利率/美元方向冲突，优先服从利率/美元方向

### 9. 禁止用固定止损距离
- 外汇波动率因货币对而异：GBPUSD 日均波动远大于 EURUSD，USDCNH 有管理波动
- 止损必须以各货币对自身结构位为准，不可统一套用「30 pips」「50 pips」

### 10. 仓位公式固定
- 仓位 = risk_amount / |entry - SL|
- 不可用其他公式代替
- 需要换算合约单位时在报告中注明

---

## 二、八维分析框架

| # | 维度 | 核心关注 | 外汇对应项 |
|---|------|---------|-----------|
| 1 | 📈 技术结构 | K线趋势、支撑阻力、形态识别 | 多周期结构、波段节奏 |
| 2 | ⛓️ 利差与美元结构 | 利差预期、DXY关系、避险/风险偏好结构 | 替代链上数据 |
| 3 | 🏦 主导力量 | 央行路径、收益率差、政策预期 | 替代 OI/资金费率 |
| 4 | 😱 情绪面 | VIX、避险流、risk-on/risk-off | 替代恐惧贪婪指数 |
| 5 | 🌍 宏观基本面 | CPI、NFP、GDP、PMI、央行会议、地缘 | 权重高于技术面 |
| 6 | 🔍 交叉验证 | DXY、美债收益率、相关交叉盘、黄金/原油 | 替代多交易所验证 |
| 7 | 📊 仓位/CFTC | 杠杆基金、资产管理、美元指数持仓 | 外汇市场专属增强 |
| 8 | 🧭 缠论结构 | CZSC 中枢、笔、背驰、买卖点候补 | 只做确认/冲突/不足 |

**强制输出规则**：
1. 先给 `各维度证据`，只基于第 1-7 维逐项列出每个维度的偏多/偏空/中性/缺失状态及理由。不要用投票计数或权重打分决定方向。
2. 必须做 `反向审计`：若美元、利差、央行路径或风险情绪与技术方向冲突，最终方向降级为观望。
3. 再给 `缠论确认`，说明 CZSC 是确认、冲突还是不足。
4. 最终方向由你基于各维度证据的逻辑强度综合判断后决定，不能由缠论单独决定；与利率/央行路径冲突时必须降级。
5. 使用 `python3 -m hermes_finance analyze forex ` 或 MCP `analyze_forex`，默认会尽量用采集器 K 线跑 CZSC。

### 维度详解

#### 📈 技术面
- **趋势定义**：higher highs + higher lows = 上升趋势（至少 2 组）；lower highs + lower lows = 下降趋势
- **均线系统**：EMA21/EMA55 多空排列，4H 与 1H 共振时信号最强
- **关键形态**：双顶/双底、头肩顶/底、上升/下降三角形、旗形/三角旗、W 底 / M 顶
- **量价关系**：外汇无集中交易所成交量，Yahoo Finance 成交量仅作弱代理，不单独作为执行依据

#### ⛓️ 市场结构（外汇版）
- **利差预期**：通过 `^TNX`（10Y）/ `^FVX`（5Y）利差变化判断美元吸引力
- **美元指数**：DXY 直接影响所有 USD 对手货币对方向
- **避险结构**：VIX > 30 → 日元/瑞郎走强；VIX  30 = 恐慌（利好避险货币）
- **避险流**：股市大跌 → JPY/CHF 走强，AUD/NZD 走弱
- **Fear & Greed**（Alternative.me，仅作弱参考）

#### 🌍 宏观基本面
- **核心数据**：NFP、CPI、GDP、PMI、零售销售、央行利率决议
- **事件驱动**：FOMC 会议纪要、央行行长讲话、地缘事件
- **权重规则**：央行决议窗口期宏观权重 > 60%；日常 > 30%

#### 🔍 交叉验证
- **DXY**：所有 USD 对手盘的背景板
- **美债收益率**：`^TNX`（10Y）和 `^FVX`（5Y）
- **相关交叉盘**：做 EURUSD 时看 GBPUSD、USDCHF
- **关联资产**：黄金（XAUUSD，避险）、原油（通胀预期）
- **利差对标**：2Y 和 10Y 美债利差作为衰退/加息预期代理

---

## 三、决策流程（从数据到方向）

### 第零步：复盘这个货币对最近的走势（决定值不值得做）

**三层复盘窗口：**
```text
90D 日线轮廓 → 看大环境（央行路径变化痕迹）
30D 4H 轨迹 → 看主导手法（这个货币对平时怎么走）
24H 1H 节奏 → 看今天是在延续、回踩还是诱多/诱空
```

**常见走势手法分类：**
- `趋势推进`：higher highs + higher lows，回调浅，沿均线运行
- `箱体洗盘`：长时间区间震荡，上下插针多，真假突破反复出现
- `冲高派发`：急拉后高位横盘，长上影增多，然后回落
- `跌破回收`：先破关键位触发止损，再快速收回区间内部
- `阴跌磨人`：lower highs 持续，反弹弱，量能难以跟上

**执行规则：**
- 今天的判断必须和最近 `30D 4H` 主导手法对照，说明当前是**延续**还是**反着来**
- 若今天的短线信号和最近主导手法明显冲突，优先怀疑是假突破/假跌破
- 若 DXY 与货币对方向背离，优先服从 DXY 方向（美元是最大单一驱动）

### 第一步：判断趋势结构（决定能不能做）

**多周期确认（自上而下）：**
```
日线趋势 → 4H 结构 → 1H 入场点
```

**趋势定义（最客观的标准）：**
- 上升趋势 = higher highs + higher lows（至少 2 组）
- 下降趋势 = lower highs + lower lows（至少 2 组）
- 震荡 = 无明显高/低点序列，价格在区间内

**关键问题**：最近一个结构摆点是 higher low 还是 lower high？
- 如果最近是 higher low → 上升结构未破坏 → 只考虑做多
- 如果最近是 lower high → 下降结构未破坏 → 只考虑做空
- 如果结构模糊 → 观望

### 第二步：判断主导力量（央行/利率/美元方向）

这是外汇八维中第 3 维最重要的维度。按货币对优先级不同：

| 货币对 | 第一驱动 | 第二驱动 | 第三驱动 |
|--------|---------|---------|---------|
| EURUSD | Fed vs ECB 路径差 | DXY | 美德利差 |
| USDJPY | 美债收益率 | BOJ 政策 / 干预风险 | 风险偏好 |
| GBPUSD | 英国通胀 / BOE 路径 | 美元方向 | 脱欧/政治风险 |
| AUDUSD | 中国 + 全球风险偏好 | 大宗商品 | 美元 / RBA |
| USDCNH | 中美利差 | PBOC 管理 | 风险事件 |
| DXY | Fed 路径 | 全球风险偏好 | 对手货币（EUR为主） |

**主导力量判断矩阵：**

| 条件 | 信号 | 操作 |
|------|------|------|
| DXY ↗ + 10Y ↗ + Fed 鹰派 | 🟢 美元走强 | USDXXX 做多 / XXXUSD 做空 |
| DXY ↘ + 10Y ↘ + Fed 鸽派 | 🔴 美元走弱 | USDXXX 做空 / XXXUSD 做多 |
| DXY ↗ + VIX ↗ | 🟡 避险 + 美元强 | USDJPY 承压（日元更强），AUDUSD 承压 |
| DXY ↘ + VIX ↘ | 🟢 risk-on | AUDUSD/GBPUSD 走强 |
| 央行路径分歧大 | 🟡 | 按利差方向 + 结构确认 |

### 第三步：量价验证（决定时机对不对）

- 外汇无集中成交量，Yahoo Finance 成交量仅作弱参考
- 主要看价格行为：突破是否坚决、回踩是否缩量（参考 tick volume 或跳动量）
- 关键 K 线形态：长上影/下影、吞没、pin bar、inside bar
- 若在关键央行事件前后，量价验证权重降低，宏观因子权重提高

### 第四步：精算止盈止损位

**做多场景：**
```
SL  = 最近结构低点 × (1 - 0.25%)   ← 必须是独立的4H/1H摆低点
TP1 = 最近的结构阻力              ← 前高、趋势线上轨、形态颈线
TP2 = 下一级结构阻力              ← 更远的独立结构峰
TP3 = 形态理论目标                ← 旗杆高度投影、斐波那契延伸
```

**做空场景：**
```
SL  = 最近结构高点 × (1 + 0.25%)
TP1 = 最近的结构支撑
TP2 = 下一级结构支撑
TP3 = 形态理论目标
```

**移动止损：**
- 到 TP1 → 移损至开仓价
- 到 TP2 → 移损至 TP1
- 创新高/低 → 跟踪最近 2 根 4H K 线的结构摆点

**仓位计算：**
```
仓位 = risk_amount / |entry - SL|
以 $10,000 账户 2% 风险为例：$200 / |entry - SL| = 可开仓位
```

---

## 四、数据采集（按顺序执行以下数据块）

### ⚠️ 强制规则：一键脚本采集（禁止手动 curl Yahoo）

```bash
# 一键采集（内置429重试+并行）
python3 /root/.hermes/skills/research/forex-market-analysis/scripts/forex_fetch.py EURUSD --compact
# 替换为: EURUSD / USDJPY / GBPUSD / AUDUSD / USDCHF / USDCNH / DXY
```

**宏观数据（TNX/DXY/VIX）通过 fetch 脚本获取，禁止调 mcp_yfinance。**

```

**❌ 绝对禁止直接 curl Yahoo Finance API。下面的代码块仅作参考文档，不要复制执行。**

### 块 0：执行前检查 ⚠️ 必做

> 先确认分析时间和货币对。标的都没对齐，后面的数据越多越危险。

```bash
# 记录分析时间（报告中必须回填）
date -u '+分析时间(UTC): %Y-%m-%d %H:%M'

# 解析并确认货币对
echo "确认货币对: 用户输入 → 标准化为 [EURUSD / USDJPY / GBPUSD / AUDUSD / USDCHF / USDCNH / DXY]"
```

**执行规则：**
- 如果货币对不在支持列表中，停止分析并要求确认
- 日内结构优先使用 Yahoo Finance 1H 真实 OHLC；聚合采样价格只可用于宏观轮廓，不可直接拿来卡精确止损
- 一次分析尽量复用同一批响应，避免 Yahoo Finance 频率限制
- 如果当前价格已经贴近最近主阻力/主支撑，导致首个止盈空间过小、盈亏比低于 1.5，则不追价，等待回踩/反抽或直接观望
- 重大宏观数据公布前 30 分钟内，自动降级为观望

---

### 块 1：实时报价 + 30日历史（Yahoo Finance）

> 外汇对使用 Yahoo Finance 的 FX 代码。注意：EURUSD → `EURUSD=X`，USDJPY → `JPY=X`，GBPUSD → `GBPUSD=X`，AUDUSD → `AUDUSD=X`，USDCNH → `CNH=X`，DXY → `DX-Y.NYB`。

```bash
# === 实时报价（最新价格 + 变动）===
# 替换 PAIR=X 为实际货币对代码
curl -s -H "User-Agent: Mozilla/5.0" "https://query1.finance.yahoo.com/v8/finance/chart/PAIR=X?interval=1d&range=5d" | python3 -c "
import json, sys
from datetime import datetime, timezone
d = json.load(sys.stdin)['chart']['result'][0]
meta = d['meta']
quotes = d['indicators']['quote'][0]
idx = d['timestamp']
print('=== 实时报价 ===')
prev = meta.get('chartPreviousClose', 0)
cur = meta.get('regularMarketPrice', 0)
chg = (cur - prev) / prev * 100 if prev else 0
print(f'当前价: {cur:.5f}')
print(f'前收盘: {prev:.5f}')
print(f'变动: {chg:+.3f}%')
print(f'交易所: {meta.get(\"exchangeName\", \"?\")}')
print(f'货币: {meta.get(\"currency\", \"?\")}')
print()
print('=== 近5日收盘 ===')
for i in range(len(idx)):
    dt = datetime.fromtimestamp(idx[i], tz=timezone.utc).strftime('%m-%d')
    o = quotes['open'][i]
    c = quotes['close'][i]
    h = quotes['high'][i]
    l = quotes['low'][i]
    chg_d = (c - o) / o * 100 if o else 0
    emoji = '🟢' if chg_d >= 0 else '🔴'
    print(f'{dt} {emoji} O:{o:.5f} H:{h:.5f} L:{l:.5f} C:{c:.5f} 涨跌:{chg_d:+.3f}%')
"

# === 30日历史（日线，用于轮廓判断）===
curl -s -H "User-Agent: Mozilla/5.0" "https://query1.finance.yahoo.com/v8/finance/chart/PAIR=X?interval=1d&range=1mo" | python3 -c "
import json, sys
from datetime import datetime, timezone
d = json.load(sys.stdin)['chart']['result'][0]
quotes = d['indicators']['quote'][0]
idx = d['timestamp']
print('=== 30日价格走势 ===')
closes = []
for i in range(len(idx)):
    dt = datetime.fromtimestamp(idx[i], tz=timezone.utc).strftime('%m-%d')
    o = quotes['open'][i]
    h = quotes['high'][i]
    l = quotes['low'][i]
    c = quotes['close'][i]
    closes.append(c)
    v = quotes['volume'][i] if quotes.get('volume') and i = 0 else '🔴'
    print(f'{dt} {emoji} O:{o:.5f} H:{h:.5f} L:{l:.5f} C:{c:.5f} vol:{v:,.0f}')
if len(closes) >= 2:
    chg_30 = (closes[-1] / closes[0] - 1) * 100 if closes[0] else 0
    hi_30 = max(closes)
    lo_30 = min(closes)
    print(f'30日涨跌: {chg_30:+.3f}% | 区间高: {hi_30:.5f} | 区间低: {lo_30:.5f}')
"
```

---

### 块 1.2：30日 4H 轨迹复盘 ⚠️ 必做

> 不要只看当前一屏数据。先复盘这个货币对近 `30D 4H` 的主轨迹，再决定今天看到的是延续、洗盘还是陷阱。
> Yahoo Finance 没有原生 4H，需要用 1H 数据聚合。

```bash
# === 30日 4H 轨迹复盘（从 1H 聚合） ===
curl -s -H "User-Agent: Mozilla/5.0" "https://query1.finance.yahoo.com/v8/finance/chart/PAIR=X?interval=1h&range=1mo" | python3 -c "
import json, sys
from datetime import datetime, timezone
d = json.load(sys.stdin)['chart']['result'][0]
quotes = d['indicators']['quote'][0]
idx = d['timestamp']

# 聚合 1H 到 4H
rows = []
for i in range(len(idx)):
    o = quotes['open'][i]
    h = quotes['high'][i]
    l = quotes['low'][i]
    c = quotes['close'][i]
    v = quotes['volume'][i] if quotes.get('volume') and i  agg[i-1]['h'] and agg[i]['h'] > agg[i-2]['h'] and agg[i]['h'] > agg[i+1]['h'] and agg[i]['h'] > agg[i+2]['h']:
        ph.append(agg[i])
    if agg[i]['l'] = 0.5 or rng >= 0.8:
        events.append((abs(body), body, rng, r))

print('大波动K线（帮助识别急拉/急砸/洗盘）:')
for _, body, rng, r in sorted(events, reverse=True)[:6]:
    dt = datetime.fromtimestamp(r['t'], tz=timezone.utc).strftime('%m-%d %H:%M')
    print(f'  {dt} body:{body:+.3f}% range:{rng:.3f}% O:{r[\"o\"]:.5f} C:{r[\"c\"]:.5f}')
"

# === 90日 日线轮廓（大环境）===
curl -s -H "User-Agent: Mozilla/5.0" "https://query1.finance.yahoo.com/v8/finance/chart/PAIR=X?interval=1d&range=3mo" | python3 -c "
import json, sys
d = json.load(sys.stdin)['chart']['result'][0]
quotes = d['indicators']['quote'][0]
idx = d['timestamp']
closes = [quotes['close'][i] for i in range(len(idx)) if quotes['close'][i] is not None]
if len(closes) = 20 else 0
    chg_7 = (closes[-1] / closes[-7] - 1) * 100 if len(closes) >= 7 else 0
    print('=== 🗺️ 90日 日线轮廓 ===')
    print(f'90日涨跌: {chg_90:+.3f}%')
    print(f'20日涨跌: {chg_20:+.3f}%')
    print(f'7日涨跌: {chg_7:+.3f}%')
    print(f'90日高: {max(closes):.5f} | 90日低: {min(closes):.5f}')
"
```

**复盘后必须输出：**
- 最近 `30D 4H` 主导手法是什么
- 最近 `2-3` 次关键动作是什么（急拉、急跌、假突破、回收、派发）
- 今天看到的信号属于 `延续 / 回踩 / 诱多 / 诱空 / 纯噪音`

---

### 块 1.5：4H/1H 真实蜡烛 ⚠️ 日内交易者必看

> 日内交易要看**真实 OHLC**。Yahoo Finance 1H 数据直接提供 OHLC，不需聚合即可用于 1H 结构判断。4H 从 1H 聚合。

```bash
# === 1H K线（精确日内级别，Yahoo Finance） ===
curl -s -H "User-Agent: Mozilla/5.0" "https://query1.finance.yahoo.com/v8/finance/chart/PAIR=X?interval=1h&range=5d" | python3 -c "
import json, sys
from datetime import datetime, timezone
d = json.load(sys.stdin)['chart']['result'][0]
quotes = d['indicators']['quote'][0]
idx = d['timestamp']
print('=== 📊 1H K线（近5日，最近24根）===')
count = 0
for i in range(len(idx)):
    o = quotes['open'][i]
    h = quotes['high'][i]
    l = quotes['low'][i]
    c = quotes['close'][i]
    if o is None or h is None or l is None or c is None:
        continue
    count += 1
rows_total = count
shown = 0
for i in range(max(0, len(idx) - 24), len(idx)):
    o = quotes['open'][i]
    h = quotes['high'][i]
    l = quotes['low'][i]
    c = quotes['close'][i]
    if o is None or h is None or l is None or c is None:
        continue
    dt = datetime.fromtimestamp(idx[i], tz=timezone.utc).strftime('%m-%d %H:%M')
    color = '🟢' if c >= o else '🔴'
    body_pct = abs(c - o) / o * 100 if o else 0
    wick_up = (h - max(o, c)) / o * 100 if o else 0
    wick_down = (min(o, c) - l) / o * 100 if o else 0
    print(f'{dt} {color} O:{o:.5f} H:{h:.5f} L:{l:.5f} C:{c:.5f} | 实体:{body_pct:.3f}% 上影:{wick_up:.3f}% 下影:{wick_down:.3f}%')
    shown += 1
print(f'显示 {shown}/{rows_total} 根K线')
"

# === 4H K线（从1H聚合，用于趋势+形态识别） ===
curl -s -H "User-Agent: Mozilla/5.0" "https://query1.finance.yahoo.com/v8/finance/chart/PAIR=X?interval=1h&range=10d" | python3 -c "
import json, sys
from datetime import datetime, timezone
d = json.load(sys.stdin)['chart']['result'][0]
quotes = d['indicators']['quote'][0]
idx = d['timestamp']

rows = []
for i in range(len(idx)):
    o = quotes['open'][i]
    h = quotes['high'][i]
    l = quotes['low'][i]
    c = quotes['close'][i]
    if o is not None and h is not None and l is not None and c is not None:
        rows.append({'t': idx[i], 'o': o, 'h': h, 'l': l, 'c': c})

agg = []
for i in range(0, len(rows) - 3, 4):
    chunk = rows[i:i+4]
    agg.append({
        't': chunk[0]['t'],
        'o': chunk[0]['o'],
        'h': max(x['h'] for x in chunk),
        'l': min(x['l'] for x in chunk),
        'c': chunk[-1]['c'],
    })

print('=== 📊 4H K线（从1H聚合，近10日，最近20根）===')
for r in agg[-20:]:
    dt = datetime.fromtimestamp(r['t'], tz=timezone.utc).strftime('%m-%d %H:%M')
    color = '🟢' if r['c'] >= r['o'] else '🔴'
    body_pct = abs(r['c'] - r['o']) / r['o'] * 100 if r['o'] else 0
    wick_up = (r['h'] - max(r['o'], r['c'])) / r['o'] * 100 if r['o'] else 0
    wick_down = (min(r['o'], r['c']) - r['l']) / r['o'] * 100 if r['o'] else 0
    print(f'{dt} {color} O:{r[\"o\"]:.5f} H:{r[\"h\"]:.5f} L:{r[\"l\"]:.5f} C:{r[\"c\"]:.5f} | 实体:{body_pct:.3f}% 上影:{wick_up:.3f}% 下影:{wick_down:.3f}%')
"
```

---

### 块 2：市场结构（DXY、收益率、利差）⚠️ 必查

> DXY 是美元对一篮子货币的加权指数，是所有 USD 货币对的背景板。`^TNX`（10Y）和 `^FVX`（5Y）反映美债收益率。

```bash
# === DXY 美元指数（近5日 + 实时） ===
curl -s -H "User-Agent: Mozilla/5.0" "https://query1.finance.yahoo.com/v8/finance/chart/DX-Y.NYB?interval=1d&range=5d" | python3 -c "
import json, sys
from datetime import datetime, timezone
d = json.load(sys.stdin)['chart']['result'][0]
meta = d['meta']
quotes = d['indicators']['quote'][0]
idx = d['timestamp']
prev = meta.get('chartPreviousClose', 0)
cur = meta.get('regularMarketPrice', 0)
print('=== 💵 DXY 美元指数 ===')
print(f'当前: {cur:.3f} | 前收: {prev:.3f} | 变动: {(cur-prev)/prev*100:+.3f}%' if prev else f'当前: {cur:.3f}')
if cur > 105:
    print('状态: 🟢 美元强势 (>105)')
elif cur > 100:
    print('状态: 🟡 美元中性 (100-105)')
else:
    print('状态: 🔴 美元弱势 (=0 else '🔴'
    print(f'{dt} {emoji} O:{o:.3f} C:{c:.3f} {chg:+.3f}%')
"

# === 10Y 美债收益率 (^TNX) ===
curl -s -H "User-Agent: Mozilla/5.0" "https://query1.finance.yahoo.com/v8/finance/chart/%5ETNX?interval=1d&range=5d" | python3 -c "
import json, sys
from datetime import datetime, timezone
d = json.load(sys.stdin)['chart']['result'][0]
meta = d['meta']
quotes = d['indicators']['quote'][0]
idx = d['timestamp']
prev = meta.get('chartPreviousClose', 0)
cur = meta.get('regularMarketPrice', 0)
print('=== 📈 10Y 美债收益率 (^TNX) ===')
print(f'当前: {cur:.3f}% | 前收: {prev:.3f}% | 变动: {cur-prev:+.3f} bp' if prev else f'当前: {cur:.3f}%')
if cur > 4.5:
    print('状态: 🟢 高收益率 → 美元吸引力强')
elif cur > 3.5:
    print('状态: 🟡 中等收益率')
else:
    print('状态: 🔴 低收益率 → 美元吸引力弱')
print()
print('近5日:')
for i in range(len(idx)):
    dt = datetime.fromtimestamp(idx[i], tz=timezone.utc).strftime('%m-%d')
    o = quotes['open'][i]
    c = quotes['close'][i]
    chg = c - o if o else 0
    emoji = '🟢' if chg>=0 else '🔴'
    print(f'{dt} {emoji} O:{o:.3f}% C:{c:.3f}% {chg:+.3f}bp')
"

# === 5Y 美债收益率 (^FVX) ===
curl -s -H "User-Agent: Mozilla/5.0" "https://query1.finance.yahoo.com/v8/finance/chart/%5EFVX?interval=1d&range=5d" | python3 -c "
import json, sys
d = json.load(sys.stdin)['chart']['result'][0]
meta = d['meta']
prev = meta.get('chartPreviousClose', 0)
cur = meta.get('regularMarketPrice', 0)
print('=== 📈 5Y 美债收益率 (^FVX) ===')
print(f'当前: {cur:.3f}% | 前收: {prev:.3f}% | 变动: {cur-prev:+.3f} bp' if prev else f'当前: {cur:.3f}%')
# 2s10s 利差判断（简化：10Y - 5Y 近似）
spread = cur - prev if prev else 0
if cur  4.5:
    print('状态: 利率预期偏鹰')
"

# === 利差概览（10Y - 2Y 代理 = ^TNX - ^FVX 作为弱近似） ===
curl -s

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [Lzh-xbccz](https://github.com/Lzh-xbccz)
- **Source:** [Lzh-xbccz/hermes-finance](https://github.com/Lzh-xbccz/hermes-finance)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** yes
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-lzh-xbccz-hermes-finance-forex-market-analysis
- Seller: https://agentstack.voostack.com/s/lzh-xbccz
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
