# deltarms **Repository Path**: ccbtr/deltarms ## Basic Information - **Project Name**: deltarms - **Description**: No description available - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-12 - **Last Updated**: 2026-09-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 三角洲军火商 · deltarms 《三角洲行动》局内交易行(子弹/弹药)**行情分析 → 信号决策 → 客户端自动化执行**的一体化工具。 本仓库是完整实现:数据采集、策略与风控、Windows 桌面控制台(tkinter,可打包成双击即用的 exe), 以及一套可复现的「屏幕 OCR + 系统级鼠标事件」客户端自动化执行层。 > ⚠️ **先读这一节** > > 1. **不能规避封号风险。** 执行层通过模拟鼠标操作游戏客户端,这违反绝大多数游戏的用户协议; > 《三角洲行动》的 ACE 是**内核级**反作弊,随机化点击间隔/轨迹只能影响行为特征层面的启发式判定, > **对驱动级扫描、模块检测、注入检测无效**。想用的话,请只在**可全损的账号**上测试。 > 2. **数据源是只读的。** 本项目使用的第三方行情 API(`https://orzice.com/workApi`)**全部是 GET 接口, > 没有任何下单/委托接口**。所以「执行」这一层只能是客户端自动化,不存在"用 API 下单"的合法路径。 > 3. **默认安全。** 仓库里的 `config.yaml` 默认 `trader.enabled: false`(拒绝一切真实成交)、 > `nav_only: true`(只走导航点击、跳过成交点击)、`notify.enabled: false`。 > 必须在控制台里显式打开「允许真实成交」,程序才会真的下单。 > 4. 本项目与游戏发行商、数据源提供方均无关联,仅供学习与研究。 --- ## 它做什么 | 层 | 内容 | |---|---| | 数据层 | 第三方行情 API(只读 GET)→ SQLite 落盘:实时价、1/7/30 日日线、军需处兑换清单 | | 决策层 | 产出 4 类机会信号:`dip` 超跌回归、`window` 低价窗口、`pack` 自选包、`exchange` 军需处兑换 | | 执行层 | 只靠屏幕像素 + 系统级鼠标事件完成:**买入 → 上架卖出 → 撤单 → 收取哈弗币 → 军需处兑换** | | 控制台 | tkinter GUI:KPI、机会列表、成交记录、运行日志、余额/资源用量、急停 | **收益口径统一按「扣 13% 手续费后的净利」**:卖价必须高于买价,且净利 ≥ 阈值(默认 5%,可改)。 净利 ≥5% ⇒ 卖价 ≥ 成本 × 1.219(手续费按 13% 单边、四处独立实测一致)。 ## 目录结构 ``` app/ 控制台(GUI)+ 引擎编排(每轮:收取 → 买入 → 上架,含全部风控闸门) gui.py tkinter 界面:机会/成交记录/日志/设置,手动买入·上架·兑换按钮 engine.py 引擎:资金闸门、数据新鲜度、自动上架、撤单、兑换清单与执行 cfg.py config.yaml 的读写(支持嵌套 section 行编辑) src/ 数据层与决策层 api.py 行情 API 客户端(只读 GET) collect.py 采集与落盘(含「便宜跌幅榜快扫」省额度策略) signals.py 信号(dip / window / pack / exchange)+ 手续费与净利口径 history.py 日线缓存(1/7/30 日低点与高点,用于 D 规则与历史高位边界) db.py SQLite:价格快照、日线缓存、交易记录、额度日志 notify.py QQ 群机器人推送(OneBot v11 / 官方 / webhook) trader/ 执行层(屏幕自动化) capture.py 抓帧(mss,客户区坐标换算) vision.py 离线 OCR + 帧级缓存(文字锚点,不用图片模板) ui.py 界面状态机(按可见文字判定当前页面/弹窗,防误点) executor.py 买入链 / 上架链 / 撤单链 / 兑换链 / 加价控件自校准 / 面板网格定位 humanize.py 拟人化:随机间隔、轨迹、抖动 console.py 打包入口(PyInstaller) tools/ 诊断与运维脚本(网格标定、状态探针、提权派发、各项离线测试) ``` ## 快速开始(数据层,普通权限即可) ```bash # 1) 环境 python -m venv .venv .venv\Scripts\pip install -r requirements.txt # 2) 密钥与配置 copy .env.example .env # 填 DF_TOKEN copy config.example.yaml config.yaml # 3) 建库 + 自检 .venv\Scripts\python -m src.cli init .venv\Scripts\python -m trader.test_offline # 离线回归(不需要游戏) # 4) 跑一次行情 + 机会 .venv\Scripts\python -m src.cli collect .venv\Scripts\python -m src.cli scan ``` ## 控制台(GUI) ```bash .venv\Scripts\python console.py # 直接跑 # 或以管理员身份(游戏提权运行时,普通权限的鼠标事件会被丢弃) run_admin.bat ``` 界面底部有两个关键开关:**「允许真实成交」**(写 `trader.enabled` 与 `nav_only`)和**「开始/停止」**。 实盘档位之外还有 `data/STOP` 急停文件:只要它存在,引擎在每一步动作前都会中断。 打包成双击即用的 exe 见 **[Deploy.md](Deploy.md)**。 ## 风控闸门(全部默认开启) | 闸门 | 作用 | |---|---| | 资金闸门 | 下单前读余额;单笔 ≤ 余额的 10%;单标的金额上限;单日 24h 笔数上限;读不到余额本轮不买 | | 价格闸门 | 卖价必须 > 买价;**扣费后净利 ≥ 阈值**(默认 5%);绝不挂到低于成本 | | 历史高位边界 | 目标价 > 近 30 日最高 × 0.98 → 不买也不挂(挂了也永远不会成交的死单),已存在的自动撤单 | | D 规则 | 买入收紧到 1/7/30 日低点附近,且期望高点必须覆盖目标价 —— 不压货,尽量当天出 | | 数据新鲜度 | 快照超过 `data_max_age_min`(默认 10 分钟)先刷新再决策,避免拿旧价做决定 | | 兑换三层闸门 | ① 必须在 API 兑换清单内 ② API 净利 ≥ 阈值 ③ 弹窗实际成本 ≤ API 成本 ×1.05;读不到成本就放弃 | | 识别容错 | 自动上架定位不到物品 → 最多试 2 次 → 放弃该持仓并在界面「需人工处理」里留记录 | | 状态机保护 | 每次点击前先判定当前界面(可见文字),状态不符即中止;点击后回读校验(价格/数量/文字) | ## 已知限制 - **键盘注入无效**:游戏走 raw input,合成按键(pydirectinput / keybd_event / SendInput / WM_CHAR 全试过)一律被忽略, 所以执行层是**纯鼠标**方案;带输入框的搜索功能无法自动化。 - **分辨率绑定**:坐标按 **1920×1080 窗口化**标定;其它分辨率/全屏需重新标定(`tools/calibrate_panel.py` 可辅助)。 - **OCR 定位的固有噪声**:出售页面板的物品名会被游戏截断(`8.5毫米鹿弹` → `8.5毫米`),相邻格子偶尔被 OCR 串成一行; 已用「口径行 + 型号行同格」+ 前缀匹配 + 弹窗物品名二次核对来兜底,核对不过一律放弃。 - **需要提权**:游戏与 ACE 以高完整性运行,非提权进程的点击会被静默丢弃;本项目用计划任务 + 派发脚本建立静默提权通道(见 Deploy.md)。 - 行情 API 的额度是按调用计费的(部分接口 0 费用、部分 1 点/次、全市场快照 20 点/次), 引擎默认策略约 900 点/天,并有每日熔断上限。 ## 免责声明 本项目仅用于学习与研究:**反作弊对抗、账号安全、经济系统影响等风险由使用者自行承担**。 作者不对封号、财产损失或任何其它后果负责。请勿用于商业牟利或破坏游戏经济。 ## 开源许可 沿用本仓库自带的 **Mulan PSL v2**(木兰宽松许可证,第 2 版)。 ## 鸣谢 - 行情数据:三角洲数据帝 / 小涛查 开放平台(`https://orzice.com/workApi`) - OCR:RapidOCR(onnxruntime)