专注于双币汇率市场、聚合了震荡分析量化、双币网格和可视化看板三大模块:
icu/smartpool/Main.js定时批量拉取币对行情,筛选震荡对并写入最新批次数据。icu/smartpool/grid/按icu/smartpool/grid/data/grid_tasks.json中的配置运行单币或双币网格策略。icu/smartpool/WebServer.js提供http://localhost:3000,用于浏览最新批次和网格执行情况。
各模块通过 icu/smartpool/service/SmartPoolMapper.js 共享 icu/smartpool/data/latest.json,并约定将运行产物输出到
icu/smartpool/data/ 与 icu/smartpool/grid/data/。
# 使用 Node 18+,一次性安装依赖
npm install express piscina lowdb axios node-binance-api
# 运行震荡量化批次
node icu/smartpool/Main.js
# 启动双币网格循环
node icu/smartpool/Grid.js
# 打开看板服务
node icu/smartpool/WebServer.jsnode --watch icu/smartpool/Main.js可用于本地调试(勿提交 watch 脚本)。- Web 端首页
/展示震荡批次摘要,/dashboard聚焦网格任务详情。
Main.js 是系统核心,流程如下:
- 读取
common/Config.js中声明的各个量化周期。 - 通过
service/CzClient.js拉取交易对列表与行情,并把每个 symbol 分派给线程池 (Piscina)。 - 线程池中的
service/worker.js调用service/SmartPoolService.js:该服务维护 K 线缓存、计算震荡指标、给出振幅/得分/价位段,是量化回路的核心。 Main.js将阶段结果依次保存为symbolList、rltArr、centerList、highList、lowList、highLowList、data。- 由
service/SmartPoolMapper.js将批次快照持久化到data/latest.json,供前端和 API 消费。 - 基于上一轮高分交易对缓存调节批次长度,实现高频增量滚动。
当某阶段出现异常或行情为空时,会自动重试并按需调整后续调度间隔。
Grid.js 作为入口调用 grid/GridTaskManage.js:
GridTaskManage.js负责读取任务配置、轮询状态、分发到GridTaskHandler.js,并调度相关k线 socket的订阅/退订。Grid/data/grid_tasks.json列举任务的id、baseAssert、quoteAssert、gridRate、gridValue等参数。GridTaskHandler.js实现每个任务的执行逻辑:触发建仓、根据实时价格决定买卖方向、调用grid/common/CzClient.js下单,并在grid/OrderMapper.js中记录订单。- 任务启动时会订阅实时行情 (
grid/common/BockTickerManage.js),并在需要时放置初始仓位。 - 运行阶段根据买入/卖出触发条件生成委托单,通过
grid/OrderMapper.js将委托与成交记录写入grid/data/orders-<taskId>.json。 - 循环中实时校验参数有效性,异常任务会被标记为
EXPIRED以防止重复下单。
示例任务可参考现有的 grid/data/grid_tasks.json。
WebServer.js 基于 Express 提供两个主要页面:
API 入口:
GET /api/data与/api/data/{stage}:读取data/latest.json中的指定周期快照。GET /api/orders?taskId=<id>:聚合grid/data/orders-*.json内的委托与成交信息。
当批次数据缺失时接口会返回 404,方便运维检测。
- 震荡数据:
data/latest.json由量化批次自动维护。 - 网格配置:
grid/data/grid_tasks.json;运行日志与订单落地在grid/data/。 - 长期日志与通用工具位于
grid/common/,建议以grid/common/logger.js替代散落的console.log。 - Binance API 密钥等敏感信息请使用环境变量(
BINANCE_API_KEY、BINANCE_API_SECRET),勿直接写入仓库。
- 覆盖边界场景(空交易对、无效
gridRate、持久化失败)后再提交代码。 - 单元测试可使用
node:test,命名为<module>.test.js并放在同级目录。 - 仅提交可重放的固定数据,个人运行产生的快照与日志请放在
.gitignore中。
以上流程配合 home/dashboard 页面截图,可帮助快速理解当前 SmartPool 量化栈。

