Files
coin/README.md
2026-05-10 23:23:38 +08:00

85 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# coin
基于 **Binance 现货 USDT** 的定时轮询量化服务:按配置多标的运行,使用 Postgres 持久化持仓状态,策略在 `internal/logic` 中实现。
## 功能概览
- **入口**`cmd/main/main.go` 加载配置、初始化 DB/Redis、`go logic.Boot()` 启动策略协程,主线程跑 Gin HTTP端口见配置 `Port`)。
- **策略**`logic.runBinanceSpotStrategy``pollInterval`(默认 60s拉账户余额与批量现价`SpotWatchList` 中每个交易对执行决策并写回 `spot_positions`
- **无 WebSocket**:全部为 REST 轮询,实现简单、对网络抖动相对不敏感,但成交与价格存在轮询间隔内的滞后。
## 配置说明
配置文件见 `etc/coin_<env>.yaml`(由 bsm-sdk `conf.New` 按服务名加载),与策略相关的字段包括:
| 字段 | 含义 |
|------|------|
| `BinanceApiKey` / `BinanceApiSecret` | 现货 API需在 Binance 开启**现货交易**权限 |
| `SpotWatchList` | 标的列表;为空则跳过整个现货策略 |
| `SpotWatchList[].Symbol` | 交易对,如 `BTCUSDT` |
| `SpotWatchList[].OrderQtyUsdt` | 每次**开仓**与**加仓**买入的 **USDT 名义**(须 ≥ 10按现价换基础币量并按 LOT_SIZE 向下取整) |
| `Databases` / `Cache` | 由 `impl.NewImpl` 初始化,供迁移与其它模块使用 |
## 策略逻辑(按执行顺序)
对配置中每个 `Symbol`,在单次轮询内大致顺序如下(详见 `spot_binance.go``processOne`)。
### 1. 空仓(持仓市值 &lt; `minHoldUSDT`,默认 10 USDT
- 重置:`DipAddsDone``DipLegLocked`、跟踪止盈状态、`OpenReboundLow` 等。
- **反弹过滤**:用 `OpenReboundLow` 记录阶段低价;价格**持续创新低**时不买;现价相对该低点**反弹 ≥ `buyReboundPct`0.39%** 后才允许首买。
-`OrderQtyUsdt` 与现价换算数量、取整后下**市价买单**`Quantity`),更新加权成本与数量。
### 2. 有仓
- 若本地成本未写过(如手工划转),用当前价初始化 `AvgCostUSDT`
- **分档超跌加仓**(相对**当前加权均价**,每档最多一次,且需反弹与波段锁):
- 第 14 次加仓对应跌幅阈值:**5% / 15% / 30% / 50%**`dipAddDrawdowns`)。
- 现价 ≤ `均价 × (1 当前档跌幅)` 时进入该档观察;同样用 `DipReboundLow` 要求**先反弹 ≥ `buyReboundPct`** 再下单。
- 每次加仓后 `DipLegLocked`,需现价 ≥ `均价 × (1 + dipRecoverPct)`(默认 3%)才解锁,避免同一低位反复买。
- `DipAddsDone == 4` 后不再加仓。
- **跟踪止盈全平**
- 浮盈 ≥ **`profitArmPct`5%** 后进入跟踪,记录阶段最高价;**不在刚达 5% 时直接卖**。
- 现价从跟踪最高价回撤 ≥ **`trailPullbackPct`0.5%** 时,**市价卖出全部可用基础币**(按 LOT 取整,且名义需 ≥ `minSellNotional`)。
### 3. 常量一览(改代码后需重新编译)
| 常量 | 默认值 | 说明 |
|------|--------|------|
| `pollInterval` | 60s | 轮询周期 |
| `minHoldUSDT` | 10 | 低于视为空仓 |
| `buyReboundPct` | 0.39% | 开/加仓前相对阶段低点的最小反弹 |
| `maxDipAdds` | 4 | 最大加仓次数 |
| `dipAddDrawdowns` | 5%,15%,30%,50% | 各次加仓相对均价的跌幅门槛 |
| `dipRecoverPct` | 3% | 加仓后解锁下一档所需相对均价的涨幅 |
| `profitArmPct` | 5% | 开始跟踪高点的浮盈线 |
| `trailPullbackPct` | 0.5% | 从跟踪高点回撤触发全平 |
| `minSellNotional` | 10 USDT | 卖单名义过小则跳过 |
## 数据表 `spot_positions`
由 GORM 迁移(`models.SpotPosition`),按 `BaseAsset` 唯一一行,主要字段包括:均价、数量、加仓次数与锁、`TrailArmed` / `TrailPeakUSDT`、开/加仓反弹低点、`DipReboundLow` 等。策略重启后会从库加载到内存再继续。
## 代码结构(策略相关)
| 文件 | 职责 |
|------|------|
| `spot_binance.go` | 轮询入口、`processOne`、配置解析、反弹判断、分档跌幅表 |
| `spot_binance_open.go` | 首买、分档加仓、市价买统一执行、成交更新成本 |
| `spot_binance_close.go` | 跟踪止盈全平、`spotLotStep``formatQtyToLotStep` |
| `spot_binance_account.go` | 精度、持仓加载/保存、余额解析 |
## 运行
```bash
# 在正确 GOPATH / module 环境下
go build -o coin.exe ./cmd/main
./coin.exe
```
需保证配置中数据库、Binance 密钥与 `SpotWatchList` 正确;**实盘有资金风险**,请在测试网或小资金下验证后再使用。
## 免责声明
本仓库代码仅供学习与研究,不构成投资建议。使用本软件进行交易的一切损失由使用者自行承担。