轻量级 A 股选股自动化工具,面向资源受限的 Linux NAS(如 i5-2430M、6GB RAM)环境。
- Go 1.21+
- 仅使用标准库;JSON 用 encoding/json 流式解析(json.Decoder),不整 body 读入内存
go mod tidy
go build -o stockMaxWin .
./stockMaxWin安全(开放仓库):config.json 已加入 .gitignore,不会随仓库提交。请勿将含 SMTP 授权码等敏感信息的配置文件提交到公开仓库。若曾误提交过,请执行:git rm --cached config.json 后再次提交。
交叉编译(在 Windows/Mac 上编译出 Linux 可执行文件,供 NAS 使用):
# 方式一:Makefile(需在 Git Bash / WSL / Mac 终端下执行)
make build-linux
# 生成 stockMaxWin-linux-amd64
# 方式二:脚本
chmod +x build-linux.sh && ./build-linux.sh编译已加 -ldflags "-s -w" 以减小体积。Cron 定时任务示例见 cron.example(每周一至周五 14:00 运行)。
飞牛 NAS 部署:在 NAS 上只跑二进制、不装 Go 时,请用 start.sh(仅运行已编译好的 stockMaxWin),并参考 docs/DEPLOY-FEINIU-NAS.md 完成上传、配置与开机自启。
定时执行(常驻、每半小时 9:15~15:00 周一至周五):
# 方式一:start.sh(推荐 NAS)— 默认定时,无需参数
./start.sh
# 方式二:直接跑二进制时需显式开调度,否则只跑一次退出
STOCKMAXWIN_SCHEDULE=1 ./stockMaxWin用 ./start.sh --once 可只跑一次即退出。启动后控制台会打印「下次执行时间:YYYY-MM-DD HH:MM」。
可选:通过环境变量调整并发数(默认 10,防止封 IP/内存溢出):
STOCKMAXWIN_CONCURRENCY=6 ./stockMaxWinstockMaxWin/
├── go.mod
├── go.sum
├── main.go # 入口、选股流程、邮件触发
├── config.json.example # 邮件配置示例(复制为 config.json 并填写)
├── internal/
│ ├── api/
│ │ └── eastmoney.go # 东方财富 API:全市场列表、日 K 线
│ ├── config/
│ │ └── smtp.go # SMTP 配置(环境变量 / config.json)
│ ├── mail/
│ │ └── send.go # 使用 net/smtp 发送 HTML 表格邮件
│ ├── model/
│ │ └── stock.go # Stock / StockBrief / KLine
│ └── worker/
│ └── worker.go # Worker Pool(生产者-消费者)、选股过滤
└── README.md
| 函数 / 行为 | 说明 |
|---|---|
GetAllStocks(ctx) |
通过东方财富公开 API 获取当前所有 A 股列表(仅代码、名称),分页请求 |
GetKLines(code) |
获取指定股票最近 30 个交易日的日 K 线 |
| Worker Pool | 从列表逐只下发任务,限制并发数(默认 10,可配置),每只抓取后立即算 MA20/涨跌幅,仅保留符合条件的 Stock 输出,不一次性加载全部到内存 |
- Stock:Code, Name, Price, MA20, ChangePct(用于选股结果)
- StockBrief:Code, Name(列表/任务,省内存)
- KLine:Date, Open, Close, Volume(日 K 线单条)
- 默认过滤条件:当前价格 > MA20(严格大于 20 日均线)
- 可在
worker.NewPool时传入自定义worker.Filter修改条件
- 使用标准库 net/smtp,无第三方邮件库。
- 选股结束后,若有符合条件的股票且已配置 SMTP,则发送一封 HTML 邮件,正文为表格:代码、名称、现价、MA20。
- 若今日无符合条件的股票,仅记录日志,不发送邮件。
配置方式二选一(环境变量优先于配置文件):
| 环境变量 | 说明 |
|---|---|
SMTP_SERVER |
SMTP 服务器,如 smtp.qq.com |
SMTP_PORT |
端口,465(TLS)或 587(StartTLS) |
SMTP_USER |
登录账号 |
SMTP_PASSWORD / SMTP_AUTH_CODE |
授权码或密码 |
SMTP_FROM |
发件人(不填则用 SMTP_USER) |
SMTP_TO |
收件人,多个用逗号分隔 |
CONFIG_PATH |
配置文件路径,默认 ./config.json |
配置文件示例:复制 config.json.example 为 config.json,按 JSON 填写 smtp_server、smtp_port、smtp_user、smtp_password、smtp_from、smtp_to。
- 优先使用标准库,无第三方依赖;API 响应使用 json.Decoder 从 resp.Body 流式解析以降低内存峰值。
- 并发数通过
worker.Config.Concurrency或环境变量STOCKMAXWIN_CONCURRENCY配置。 - 防 IP 被封:请求间间隔 200ms + 0~150ms 随机抖动(
STOCKMAXWIN_API_DELAY_MS、STOCKMAXWIN_API_JITTER_MS);同时进行中的请求数上限 4(STOCKMAXWIN_API_MAX_CONCURRENT);请求头带 User-Agent / Referer(quote.eastmoney.com) / Accept / Accept-Language;遇 429 时等待 5s 再重试。