# BTC/ETH Yield Enhancer

Deribit `BTC_USDC` / `ETH_USDC` 现货 maker 收益增强策略。一个 Web 服务同时管理两个独立策略实例，页面地址不变，通过顶部下拉框切换标的。

## 策略

两个标的共用同一套 BTC 策略参数：

1. 启动时以指数价为锚点；
2. 用 12 根 5 分钟 K 线的 RMS × √24 计算日化 RV；
3. 在 `锚点 × (1 - RV)` 挂 post-only 买单；
4. 在 `锚点 × (1 + RV)` 挂 post-only 卖单；
5. 成交后用成交均价更新锚点，重新计算 RV；
6. 买卖方向独立进行余额和额度保护。

BTC、ETH 各自拥有独立的锚点、挂单、成交记录和状态文件：

```text
runtime/state_btcusdc.json
runtime/state_ethusdc.json
```

运行时状态只保存在本地 `runtime/`，不会提交到 Git，也不创建历史版本。

## 500 U 资金模型

默认按实际 500 U 本金设计：

```dotenv
TOTAL_CAPITAL_USDC=500
BTC_ALLOCATION_USDC=250
ETH_ALLOCATION_USDC=250
TRADE_SIZE_USDC=25
```

策略余额以各自额度为上限。即使 Testnet 水龙头账户里有大量资金，策略也不会把超出额度的资金计入可用本金。

首次初始化时，每个标的最多把一半额度分配给已有现货库存，剩余额度分配给 USDC。如果账户没有 BTC/ETH，策略会从 USDC 买入开始，卖出方向暂时停止。

所有标的额度之和不得超过 `TOTAL_CAPITAL_USDC`。

## 配置

复制配置模板：

```bash
cp .env.example .env
```

主要配置：

```dotenv
DERIBIT_ID=
DERIBIT_SECRET=
DERIBIT_TESTNET=1

ENABLED_SYMBOLS=BTC_USDC,ETH_USDC
DEFAULT_SYMBOL=BTC_USDC

TOTAL_CAPITAL_USDC=500
BTC_ALLOCATION_USDC=250
ETH_ALLOCATION_USDC=250
TRADE_SIZE_USDC=25

STRAT_AUTO_RESUME=0
STRAT_STATE_DIR=runtime
```

`.env` 只保存在本机，并被 `.gitignore` 排除。默认重启后恢复本地状态，但不会自动恢复下单。

## 启动

本地：

```bash
python app.py
```

默认地址：

```text
http://127.0.0.1:5050
```

Docker：

```bash
docker compose up -d --build
docker compose logs -f --tail=200
```

现有 Web URL、容器名和端口保持不变。

## Web/API

页面顶部选择 BTC 或 ETH。启动、停止、参数修改、K 线和连接测试都只作用于当前选择的标的，另一实例不受影响。

常用接口：

| 方法 | 路径 | 说明 |
| --- | --- | --- |
| GET | `/api/symbols` | 标的、额度和运行状态 |
| GET | `/api/status?symbol=BTC_USDC` | 指定标的状态 |
| POST | `/api/init` | 初始化指定标的 |
| POST | `/api/start` | 启动指定标的 |
| POST | `/api/stop` | 停止指定标的 |
| GET/POST | `/api/params?symbol=BTC_USDC` | 参数读取/修改 |
| GET | `/api/kline?symbol=BTC_USDC` | 指定标的 K 线 |
| WS | `/ws` | 两个标的的实时状态推送 |

POST 请求在 JSON 中传递标的：

```json
{"symbol": "ETH_USDC"}
```

## 安全提示

- 先使用 Testnet 验证；
- API Key 只授予 Read/Trade，不授予提现权限；
- 建议使用独立子账户；
- `STRAT_AUTO_RESUME=0` 保持人工启动；
- 不要把无身份验证的交易面板直接暴露到公网。
