# jinflow **Repository Path**: ecky88/jinflow ## Basic Information - **Project Name**: jinflow - **Description**: jinflow是一个基于无限易客户端下单的系统 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-22 - **Last Updated**: 2026-10-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JinFlow / 钧泽量化 JinFlow 是围绕无限易 / InfiniTrader 的本地量化工作台,当前包含: - 本地 HTTP 网关:封装桥接状态、预埋单模板、撤单、持仓、合约主数据、行情订阅和行情记录接口。 - 前端控制台:白 / 银 / 蓝色调,包含标的管理、监控下单、手动下单、行情记录、数据分析、数据管理入口。 - 桥接层源码和最小运行产物:源码用于重新构建桥接 DLL / 注入器;`infinitrader_bridge/bin/` 中保留一份可直接运行的核心 DLL/EXE,历史测试产物不进入仓库。 - data-sys 子模块:独立的数据管理系统,JinFlow 前端通过“数据管理”菜单跳转使用。 - jinflow-research 子模块:独立的期权历史研究系统,“策略研究”菜单打开其页面,不在交易进程中接收归档或运行 DuckDB。 ## 目录结构 ```text frontend/ JinFlow 前端静态页面 infinitrader_bridge/ C++ 桥接层源码、构建脚本和最小桥接运行产物 templates/sanitized/ 受控净化预埋单模板,不保存真实账号运行态字段 scripts/ data-sys 表结构、迁移和模板净化辅助脚本 examples/ 导入模板示例 data-sys/ 外部数据管理系统子模块 jinflow-research/ 独立策略研究系统子模块 infinitrader_preorder_api.py 本地 HTTP 网关主入口 ``` ## 本地运行 推荐使用一键本地部署脚本: ```powershell scripts\start-jinflow-local-env.bat ``` 本地直跑会同时启动 JinFlow 和 data-sys;data-sys 前端依赖 Node.js/npm,首次运行会在 `data-sys/frontend` 下执行 `npm install`。启动时会同时检查 data-sys 后端和前端,缺哪个启动哪个;data-sys 后端/前端后台窗口会隐藏,日志在 `data-sys/work/logs`。 停止本地服务可使用: ```powershell scripts\stop-jinflow-local-env.bat ``` 首次运行时,如果根目录没有 `.env`,脚本会自动从 `.env.example` 复制一份默认配置。默认配置会连接本机 data-sys: - data-sys 后端 API:`http://127.0.0.1:5955` - data-sys 管理页面:`http://127.0.0.1:6881/tables` - JinFlow 页面 / API:`http://127.0.0.1:18765` 如果是普通 `git clone` 拉下来的仓库,脚本在需要启动 data-sys 但发现子模块未初始化时,会自动执行: ```powershell git submodule update --init --recursive -- data-sys ``` 如需改端口或切换 data-sys 地址,只改根目录 `.env`: ```text JINFLOW_DATA_SYS_API_BASE=http://127.0.0.1:5955 JINFLOW_DATA_SYS_WEB_URL=http://127.0.0.1:6881/tables ``` 策略研究需单独初始化和启动: ```powershell git submodule update --init -- jinflow-research .\jinflow-research\scripts\start-research.ps1 ``` 默认页面为 `http://127.0.0.1:18766/`。JinFlow 使用 `JINFLOW_RESEARCH_WEB_URL` 配置菜单入口,不自动启停研究服务。研究也可单独克隆部署,直接通过 DataSys 的标准归档 API 接收数据;已接收样本可离线分析,不要求 JinFlow 在线。完整职责、启动、数据契约和统计口径见 [独立策略研究说明](docs/option-research.md)。 新环境如果“标的管理”里没有默认 9 个 ETF 期权标的,先确认 data-sys 后端已启动,再运行: ```powershell scripts\seed-option-underlyings.bat ``` 该脚本会通过 data-sys HTTP API 幂等导入 `option_underlyings` 表:已存在的按 `exchange_code + underlying_code` 更新,缺失的补齐;可先加 `--dry-run` 查看计划写入内容,例如 `scripts\seed-option-underlyings.bat --dry-run`。 后端常驻任务默认开启: ```text JINFLOW_AUTO_BRIDGE=true JINFLOW_AUTO_QUOTE_RECORD=true JINFLOW_AUTO_POSITION_MONITOR=true ``` 职责边界:前端只是控制台和状态展示;桥接、行情采样、持仓监控、自动启动、收盘停止和每日 09:00 调度都在 `infinitrader_preorder_api.py` 后端服务里执行。也就是说,后端服务运行后,即使不打开 JinFlow 页面,数据库里处于 `running` 的行情记录组合会自动恢复采样;若总控制栏开启“自动启动”,服务启动后会自动开启三大监控模块。工作日 09:00 会重启当时仍在运行的模块;如果当时没有监控运行且“自动启动”开启,则自动启动三大监控模块。若开启“收盘停止”,交易日 15:00 后会自动停止仍在运行的监控。 信使推送采用后端异步队列:事件产生时先落库并把推送任务放入内存队列,独立的 `jinflow-messenger-push` 后台线程负责逐个渠道发送。监控线程不会等待企业微信等外部通道返回;事件日志里的 `payload_json._messenger_push` 会先记录 `queued=true`,发送完成后由后台线程回填实际结果。 ## 监控下单模块 监控下单目前由三个后端模块配合: - 行情记录:可以选择事件驱动或定时轮询。事件驱动模式下,行情回调进入后端异步路径,浏览器只展示状态,不负责采样。 - 调度监控:轮询账户资金、算法列表、候选队列和行情接近度;默认开启“缓存加速”,由 JinFlow 后台维护账户、实盘算法列表和实盘持仓快照,关闭后恢复为每轮直接读取原接口。实盘模式才会提交/撤换预埋单,模拟模式进入日内模拟算法池并落盘。模拟算法池按真实算法列表建模,一次投递生成一条独立模拟算法单,不承担策略去重;是否重复投递由策略投递模式、调度队列和单活跃规则控制。每日 09:00 监控重启时会清空模拟池和模拟持仓,模拟成交流水与收益明细保留,用于午休维护和盘后运行报告。从模拟模式切换到实盘模式时,后端会先清空当前交易日调度队列;若清空失败,会阻止进入实盘模式,避免模拟脏数据带入实盘。调度监控还负责部分成交异常工单:首次检测到两腿成交数量不一致后先进入延迟确认窗口,默认 10 分钟;到点仍未恢复则判定异常。正常预埋单按逐份补腿理解,理论上最多只差 1 份,例如 0:1、2:3 都暴露 1;若读到差额超过 1 份,则视为非预期快照或非标准状态,进入待人工确认,不自动撤单平仓。 - 持仓监控:轮询持仓,按“今日新增 / 从当前开始 / 全仓扫描”三种基线模式识别策略持仓;手动刷新只读取最新持仓,不重建基线。若需切换基线模式,应先停止持仓监控,修改模式后重新启动。模拟模式下,持仓监控识别到新增策略持仓后会生成反向平仓计划,并把触发价、平仓方向和两腿信息转入模拟算法池继续撮合;平仓成交后按开仓成本计算已实现收益,调度监控会汇总今日模拟总收益。 - 策略监控:启动时先解析当前最近到期月份,按已开启的标的物和合约范围做一次性期权合约行情订阅;运行中轮询行情记录组合,识别买卖线索并投递给调度监控。默认“单活跃”投递模式会综合调度队列、模拟算法池和策略投递意图表判断同一策略组合是否已有活跃投递,避免行情持续命中时重复投递;实盘算法列表会反写投递意图状态,覆盖暂停、撤单、终止、删除、成交和部分成交异常,其中暂停可恢复所以仍占用单活跃,终止/删除会释放。平值K范围采用智能缓冲订阅:策略实际扫描“平值K上下N档”,行情订阅使用“N+2档”,运行中每 10 秒检查一次,只有平值K靠近旧订阅边界 1 档内才补订阅。 策略监控配置已经改为分层扫描域: ```text 近期期权 / 远期期权 └── 标的物(每个标的独立开关) ├── 期限范围:近期期权表示当前最近到期月份,远期期权默认按剩余天数 46–365 天筛选 ├── 合约范围:所有合约 / 平值K / 平值K上下N档(默认 N=1) └── 8 类策略:买入跨式、卖出跨式、买入宽跨、卖出宽跨、牛市认沽、熊市认沽、熊市认购、牛市认购 ``` 标的物开关和 8 类策略开关默认均为关闭,需要明确开启后才参与扫描。N 只决定策略扫描范围;后端实际订阅会自动外扩 2 档做缓冲,避免平值K轻微跳动时频繁退订/订阅。所有策略的比较方向由建仓语义固定,不作为配置项:买入跨式、买入宽跨、牛市认购、熊市认沽固定为“越低越有利”,卖出跨式、卖出宽跨、牛市认沽、熊市认购固定为“越高越有利”。 第一版策略监控仍然以“行情记录里的定制组合”为候选来源:后端先按期限、标的开关、近月/剩余天数和合约范围过滤组合,再运行对应策略规则。后续如果要做全市场扫描,可以在这个分层配置基础上,把候选来源从“已配置行情记录组合”扩展为“合约池自动生成组合”。 ### 实时调参 左侧“实时调参”用于盘中查看策略候选的最新行情,并把参数快速应用到策略监控。目前包含跨式 IV、垂直贷方价差和垂直阈值三个模型: - 跨式 IV:按标的锁定反推 IV、微调并应用;策略监控不再使用统一的理论 IV 快捷值。 - 垂直贷方价差:对比牛市认沽 / 熊市认购的净权利金、到期收益风险、权利金缓冲和安全垫。 - 垂直阈值:同时展示牛市认沽、熊市认沽、熊市认购、牛市认购四类组合;触发方向由策略固定,每行只需设置阈值,应用后幂等写入 data-sys `strategy_threshold_rules` 当天记录,策略监控下一轮扫描直接读取,无需重启。 实时调参可以预览尚未配置当天阈值的垂直组合,但这不会放宽正式策略监控的触发条件;没有匹配到当天规则的组合仍不会触发。完整的数据字段、写入规则、接口和验证要求见 [`README_实时调参.md`](README_实时调参.md)。 手动流程仍然可用: 1. 启动 data-sys 本地服务。 2. 启动无限易并登录。 3. 启动 JinFlow 本地网关。 4. 打开 JinFlow 前端,在左上角桥接状态处确认无限易连接状态。 系统设置页提供“启动进程”配置: - `autoupdate.exe` 路径:保存安装目录下的无限易更新 / 启动入口,后续自动拉起无限易进程时优先使用该路径。 - 登录账号:用于后续自动登录流程,账号可以在页面回显。 - 登录密码:页面不回显,公开接口只返回“是否已配置”。后端落库时优先用 Windows DPAPI 保护;如果当前 Python 运行环境无法调用 DPAPI,则使用本机 `work/secrets/jinflow_secret.key` 加密后保存。`work/` 已被 `.gitignore` 排除,迁移到新机器后需要重新录入密码。为避免页面刷新时把半截密码写入,密码只在按 Enter 或点击“保存登录配置”时保存;如果保存过的密码长度异常过短,自动登录接口会拒绝执行并提示重新保存。 - 自动登录开关:已验证 `autoupdate.exe` 更像更新 / 启动器,字符串与运行日志里没有发现可直接传入账号密码的登录命令行接口;实际登录发生在 `InfiniTrader.exe` 拉起后的登录窗 / `CTraderApiImpl::ReqUserLogin` 链路。自动登录按“启动 autoupdate → 等待 InfiniTrader.exe / 登录窗口 → 注入主桥 → 进程内 DuiLib 控件填充账号密码并激活登录按钮 → 登录成功后桥接”的顺序执行。 - 调试面板开关:默认关闭。关闭时左侧导航隐藏“调试面板”;开启后才显示清空策略数据、模拟算法池、调度队列等调试入口。 点击“桥接”时若没有无限易进程,会先执行已配置或自动发现的 `autoupdate.exe`,再尝试登录与桥接。账号密码缺失或暂时无法解密只影响自动登录,不阻止启动器打开;登录窗口已出现时会立即返回具体原因。通过 start 脚本启动时应使用正常 Windows 用户环境,避免受限调试环境无法访问 DPAPI 或当前用户安装的 `cryptography`,导致已保存密码不可读取。 自动启动 / 登录接口当前采用“桥内 DuiLib 控件登录”。旧的键盘消息 / `SendInput` 路径已禁用,避免密码被误写进账号框或其他控件: - `GET /v1/infinitrader-launcher/probe`:探测当前无限易主进程和登录窗口。平安定制版登录框当前识别为 640×400 的自绘 `CLOGINDLG`,UIA / MSAA 都不暴露子控件。 - `POST /v1/infinitrader-launcher/start`:按系统设置里的 `autoupdate.exe` 路径启动无限易,并等待 `InfiniTrader.exe` 或登录窗口出现。 - `POST /v1/infinitrader-launcher/login`:显式调用时才会读取已保存账号密码。后端会先连接 / 注入 `InfiniTraderBridge`,在无限易进程内执行 `login-window-submit` 命令;桥内通过 `CPaintManagerUI::FindControl(POINT)` 命中账号框、密码框和登录按钮,再对控件对象调用 `CControlUI::SetText` / `CButtonUI::Activate`。当前点位是 `CLOGINDLG` 客户区相对点位,不是屏幕坐标,窗口移动不影响;如果后续版本 UI 布局改变,需要重新校准相对点位。若 DuiLib 控件或桥命令不可用,接口会直接报错,不再退回不可靠的外部键盘输入。 自动登录默认会覆盖账号框,避免历史 UI 输入异常把错误账号残留在登录框;只有显式传入 `fillAccount: false` 才会保留界面已有账号。 桥命令行也可直接探测: ```powershell python .\infinitrader_bridge\infinitrader_bridge_client.py --pid login-window-probe python .\infinitrader_bridge\infinitrader_bridge_client.py --pid login-window-submit --account <账号> --password <密码> --fill-only ``` 桥接版本绑定和兼容性复检: - `GET /v1/bridge/status` / `POST /v1/bridge/connect` 会识别当前无限易版本,并和 `system_configs.infinitrader.bridge_binding` 里记录的绑定版本比对;版本不一致时记录 `bridge.version_mismatch` 异常事件,默认推送。 - `POST /v1/bridge/compatibility-scan` 默认只做复检,不修改绑定版本。扫描内容包括桥接 ping / probe / ABI、登录状态、账户表、持仓表、算法列表、Instrument 合约表、行情表、行情事件队列和净化预埋单模板 `validate`。扫描结果会落到 `system_configs.infinitrader.bridge_binding.config_json.lastCompatibilityScan`。 - `POST /v1/bridge/compatibility-scan` 带 `{"accept": true}` 时,只有扫描结论为 `compatible` 才会把当前无限易版本和当前桥 DLL 指纹接受为新的绑定版本;`needs_login`、`needs_review`、`incompatible` 均不会重新绑定。 - `includeDirectOrderProbe` 默认关闭。开启后只调用 `direct-order-probe`,不调用 `direct-order-submit`,用于额外检查普通单腿委托 ABI;复检事件和配置里只保留摘要,不落账户、持仓、算法明细原始数据。 预埋单模板默认从 `templates/sanitized/*.json` 读取。桥接到已登录无限易后,后端会把当前账号运行态字段补回模板,再生成预览或提交请求;`work/` 下的原始 `.bin` 只作为本机调试/重新生成净化模板的临时材料。 预埋单的组合名称同时也是无限易 native 腿行情路由 key。JinFlow 生成实盘预埋单时使用 `j1`、`j2`、`j3` 这类私有前缀,并按当前无限易 PID 持续自增,避免和手动下单的 `1`、`2`、`3` 数字前缀互相碰撞;详细排障结论见 `README_预埋单接口.md`。 普通直接委托接口目前只做了能力探测和 HTTP 占位:`GET /v1/direct-orders/capabilities` 可查看桥接层是否暴露普通委托能力,`POST /v1/direct-orders/submit` 在未打通时返回 501 且不会产生外部效果。异常工单在普通委托 API 未打通前不会先撤异常算法单,避免撤单后无法同步平掉已成交暴露腿。后续需要继续研究无限易普通委托链路,把直接平仓委托接入该占位接口。 调试抓包、截图、本地 sqlite、日志、Python 缓存和 DLL / EXE 编译产物默认被 `.gitignore` 排除,不随源码仓库同步。 智能分析的事件接收、增量计算、持久化批量写入及诊断指标见 [`README_智能分析采集.md`](README_智能分析采集.md)。事件模式保留相关组合的行情变化,定时模式保留全量等间隔采样;两种模式的样本数量与命中比例不能直接比较。