{"repo":"handsomejustin/easy_tdx","free":true,"listed":false,"github":"https://github.com/handsomejustin/easy_tdx","clone":"git clone https://github.com/handsomejustin/easy_tdx.git","description":"免费Python量化SDK:通达信协议直连 A股/港股/美股数据,内置技术指标、缠论分析、回测引擎与 Web 可视化,JSON 输出适配 AI Agent","language":"Python","stars":749,"topics":["a-share-tdx","chinese-stock-market","financial-data","mootdx","pytdx","stock-analysis","stock-data","stock-trading","tdx","technical-analysis"],"license":null,"category":"dev_tool","readme_excerpt":"# easy-tdx\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![PyPI](https://img.shields.io/pypi/v/easy-tdx.svg)](https://pypi.org/project/easy-tdx/)\n[![GitHub Repo stars](https://img.shields.io/github/stars/handsomejustin/easy-tdx?style=social)](https://github.com/handsomejustin/easy-tdx)\n[![GitHub last commit](https://img.shields.io/github/last-commit/handsomejustin/easy-tdx)](https://github.com/handsomejustin/easy-tdx)\n[![Checked with mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://www.mypy-lang.org/)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/handsomejustin/easy_tdx)\n\n<img src=\"./docs/top_img.png\" alt=\"头部宣传图\" />\n量化基金花百万买的毫秒级行情通道，散户连一根日线都要手动截图——这不是技术差距，这是数据霸凌。\n\neasy-tdx 要做的事很简单：**把机构的数据锁砸开，扔到每个普通人桌面。**\n\n它是一个完全免费、无需注册、无需 API Key、纯开源的行**情核武器**。  \n一行命令，A股、港股、美股、期货——K线、报价、资金流向、板块轮动、分时明细、逐笔成交，**毫秒级拉满**。\n\n**34个技术指标**（MACD、KDJ、RSI、BOLL……连”捉妖大师”和”30日乖离率信号”都给你算好）开箱即用。\n**缠论分析**（笔、中枢、买卖点、背驰）一键出结果——你不再需要手画分型、猜线段。\n**内置回测引擎**——写个策略文件，一行命令跑回测，18 个经典策略自带，多因子组合、策略选股扫描，批量对比哪个最赚钱一目了然。\n\n**回测可视化 Web UI**（v1.17 新增）——Vue3 + ECharts 单页应用，浏览器里选标的、挑策略、调参数，K 线买卖点、净值回撤、19 项绩效指标一目了然。支持组合回测、参数网格寻优、多策略结果对比，**还能把好策略存进策略库（SQLite 持久化），勾选多个策略做资金分仓组合回测看综合表现**，全程零代码。\n\n**数据评级系统**（v1.17.14 新增）——回测结果顶部直接显示 **S/A/B/C/D 五档评级徽章**，1 秒判断「这个品种适不适合经常参与」。评级**不看收益率**（避免被近期大涨误导），只看风险调整后的持有体验：卡玛比率、最大回撤、胜率、利润因子、夏普、波动率六维加权 + 一票否决（系统亏损/深回撤/低胜率直接低评）。京东方那种「收益 126% 但胜率 35%、回撤 41%」的案例会评 **D 档**——明确告诉普通人「别碰，套牢后回本极难」。三个入口（单标的/组合/寻优）都有评级，长线低频策略不会被冤枉（交易少时只降权胜率维度，不否决整个评级）。\n\n装上就能跑。**Python API + CLI + Web API 三通道**，输出 JSON 天然喂给 AI Agent：Claude Code、OpenClaw、Hermes 直接吃。`easy-tdx serve` 一键起 REST 服务，浏览器打开就是交互式 API 文档。\n\n**你不懂 TCP 协议？不用。**\n**你不会写量化框架？不用。**\n**你想回测验证策略？自带引擎，不用。**\n**你不想给任何平台付一分钱？完全不用。**\n\n`pip install easy-tdx`，30秒后——你屏幕上的数据，和机构看到的**是同一份**。\n\n---\n\n**为什么做这个？**\n\n金融数据的获取门槛，从来不该是散户亏钱的理由。  \n当量化基金用程序化交易像割草一样收割市场时，普通人至少应该**有权利拿一样的武器**。\n\n这不是一个帮你“赚钱”的工具。  \n这是让你**不再裸奔**的工具。\n\n**MIT 协议，代码全开源。**  \n随便用，随便改，随便分发。  \n**数据面前，人人平等。**\n\n📖 **详细用法请查看 [GitHub Wiki](https://github.com/handsomejustin/easy_tdx/wiki)**\n\n## 安装\n\n```bash\npip install easy-tdx\n```\n\n安装后自动注册 `easy-tdx` CLI 命令：\n\n```bash\neasy-tdx --help\n```\n\n开发模式：\n\n```bash\npip install -e \".[dev]\"\n\n# 开发 Web API 模式（含 FastAPI + Uvicorn）\npip install -e \".[web]\"\n```\n\n## CLI 参考\n\n`easy-tdx` 默认输出 JSON（一行一条记录），`--table` 切换表格，`--output csv` 输出 CSV。\n\n### 基础\n\n```bash\neasy-tdx ping                    # 服务器测速\neasy-tdx version                 # 版本号\n```\n\n### 行情\n\n```bash\n# K 线\neasy-tdx kline SZ 000001 --count 30 --table\neasy-tdx kline SH 600519 --period 5MIN --adjust QFQ\n\n# 实时报价\neasy-tdx quote \"SZ 000001,SH 600519\" --table\n\n# 市场分类报价（按涨幅排序）\neasy-tdx quote-list A --count 20 --table\neasy-tdx quote-list KCB --sort TOTAL_AMOUNT --order ASC\neasy-tdx quote-list CYB --count 50\n```\n\n### 分时 / 成交\n\n```bash\neasy-tdx tick SZ 000001 --table\neasy-tdx tick SH 600519 --days 5\neasy-tdx tick SZ 000001 --date 20250115\n\neasy-tdx transaction SZ 000001 --count 100 --table\neasy-tdx transaction SH 600519 --date 20250115\n```\n\n### 板块\n\n```bash\neasy-tdx board-list --type GN --table\neasy-tdx board-list --type HY --count 200\neasy-tdx board-members 881001 --table\neasy-tdx belong-board SZ 000001 --table\neasy-tdx board-summary 881001 --table          # 板块汇总（成交额/主力净流入/涨跌家数）\neasy-tdx board-summary 881001 --members --table # 含成分股明细\neasy-tdx board-ranking --type HY --top 10 --table   # 行业板块排行\neasy-tdx board-ranking --type GN --sort-by amount    # 概念板块按成交额排行\n\n# 板块 N 日涨跌幅排行（默认全部，支持指定日期）\neasy-tdx board-change-ranking --table                      # 行业 20 日涨跌幅排行\neasy-tdx board-change-ranking --type GN --days 10 --table  # 概念 10 日涨跌幅排行\neasy-tdx board-change-ranking --type HY --date 20250530 --days 20 --table\neasy-tdx board-change-ranking --type HY --top 10 --asc     # 行业跌幅前10\n```\n\n### 资金 / 监控\n\n```bash\neasy-tdx capital-flow SH 600519 --table\neasy-tdx auction SZ 000001 --table\neasy-tdx unusual SH --count 100 --table\neasy-tdx market-stat --table\neasy-tdx server-info --table\neasy-tdx symbol-info SZ 000001 --table\n```\n\n### 公告检索（巨潮资讯网）\n\n```bash\neasy-tdx announcement 688017                          # 默认 30 条，JSON 输出\neasy-tdx announcement 601088 --count 10 --page 2      # 翻页\neasy-tdx announcement 000001 --table                  # 表格输出（不截断 url）\n\n# 下载最新 5 条公告的 PDF 到 ./pdfs 目录\neasy-tdx announcement 601088 --count 5 --download 5 --download-dir ./pdfs\n```\n\n> 独立数据源（巨潮资讯网），无需连接 TDX 行情服务器即可使用。\n> 返回的 ``url`` 含 4 参数可直接打开，``pdf_url`` 为 PDF 直链。\n\n### 技术指标\n\n```bash\neasy-tdx indicator-list --table                       # 列出所有可用指标\neasy-tdx indicator MACD -m SH -c 600519 --table       # MACD\neasy-tdx indicator KDJ -m SZ -c 000001 --table        # KDJ\neasy-tdx indicator RSI -m SH -c 600519 --table        # RSI\neasy-tdx indicator BOLL -m SH -c 600519 --table       # BOLL 布林带\neasy-tdx indicator DMI -m SH -c 600519 --table        # DMI 动向指标\neasy-tdx indicator ATR -m SH -c 600519 --table        # ATR 真实波幅\neasy-tdx indicator WR -m SH -c 600519 --table         # WR 威廉指标\neasy-tdx indicator CCI -m SH -c 600519 --table        # CCI 顺势指标\neasy-tdx indicator BIAS -m SZ -c 000001 --table       # BIAS 乖离率\neasy-tdx indicator BIAS_SIGNAL -m SH -c 600519 --table # 30日乖离率信号\neasy-tdx indicator OBV -m SZ -c 000001 --table        # OBV 能量潮\n\n# 多指标同时计算\neasy-tdx indicator MACD,KDJ,RSI,BOLL -m SH -c 600519 --count 10 --table\n\n# 自定义参数\neasy-tdx indicator MACD -m SH -c 600519 --params SHORT=10,LONG=22\n\n# 分钟线指标\neasy-tdx indicator MACD -m SH -c 600519 --period 5MIN --count 50\n\n# 仅输出指标值（不含 OHLCV）\neasy-tdx indicator RSI -m SZ -c 000001 --no-ohlcv\n```\n\n### 缠论分析\n\n基于缠论理论的技术分析，计算管道：`K 线合并 → 分型识别 → 笔 → 中枢 → 线段 → 买卖点 → 背驰`。默认输出 JSON，加 `--table` 输出可读表格。\n\n```bash\neasy-tdx chanlun SZ 000001 --table\neasy-tdx chanlun SH 600519 --adjust QFQ --table\neasy-tdx chanlun SZ 000001 --period 30MIN\n\n# 多级别联立：分析日线最后一笔在 30 分钟级别中的走势结构\neasy-tdx chanlun SZ 000001 --multi-level 30MIN --table\neasy-tdx chanlun SH 600519 --multi-level 5MIN\n```\n\n#### 输出示例\n\n以 `easy-tdx chanlun SH 601088 --table` 为例，输出分五个部分：\n\n**概要统计**\n\n```\n标的: 601088  周期: DAILY\n原始K线: 800  缠论K线: 589\n分型: 275  笔: 131  中枢: 21  线段: 40\n买卖点: 125  背驰: 73\n```\n\n| 字段 | 含义 |\n|------|------|\n| 原始 K 线 | 从服务端获取的原始 K 线条数 |\n| 缠论 K 线 | 经过包含处理（合并）后的 K 线条数，数量一定 ≤ 原始 K 线 |\n| 分型 | 识别出的顶分型 + 底分型总数 |\n| 笔 | 相邻两个异向分型之间的连线（涨跌方向交替） |\n| 中枢 | 至少 3 笔重叠区域形成的密集成交区间 |\n| 线段 | 由笔构成的更大级别走势单位 |\n| 买卖点 | 一二三类买卖点信号总数 |\n| 背驰 | 力度衰减信号总数（笔背驰 / 盘整背驰 / 趋势背驰） |\n\n**笔**\n\n```\n[0] ↑ 2023-02-17 → 2023-02-23 h=28.46 l=26.76 ✓\n[1] ↓ 2023-02-23 → 2023-02-28 h=28.46 l=27.8 ✓\n[2] ↑ 2023-02-28 → 2023-03-09 h=29.77 l=27.8 ✓\n```\n\n笔是缠论的基本走势单位。每条笔连接一个顶分型和一个底分型，方向严格交替（↑↓↑↓…）。`✓` 表示已确认（后续出现了反向笔），`…` 表示仍在进行中。\n\n- `↑`：向上笔，起点是底分型（低点），终点是顶分型（高点）\n- `↓`：向下笔，起点是顶分型（高点），终点是底分型（低点）\n- `h`/`l`：该笔范围内的最高价 / 最低价\n\n**中枢**\n\n```\n[0] zg=28.46 zd=28.11 gg=32.56 dd=26.76 lines=11 ✓\n[1] zg=31.2  zd=30.45 gg=32.56 dd=27.9  lines=3  ✓\n```\n\n中枢是至少 3 笔重叠形成的密集成交区间，代表多空博弈的平衡区域。`✓` 表示已脱离，`…` 表示价格仍在中枢区间内震荡。\n\n| 字段 | 含义 |\n|------|------|\n| `zg` | 中枢上沿（区间内最高的低点）— 支撑/压力的关键分界 |\n| `zd` | 中枢下沿（区间内最低的高点） |\n| `gg` | 中枢区间内的最高价 |\n| `dd` | 中枢区间内的最低价 |\n| `lines` | 构成该中枢的笔数，笔数越多代表震荡越充分 |\n\n中枢的意义：价格在中枢内震荡 → 突破中枢上沿看涨，跌破下沿看跌。`zg`/`zd` 是实战中最常用的参考价位。\n\n**线段**\n\n```\n[0] ↑ 2023-02-17 → 2023-03-09 h=29.77 l=26.76\n[1] ↓ 2023-02-28 → 2023-03-29 h=29.77 l=27.18\n```\n\n线段是比笔更大的走势单位，由多笔重叠组合而成。线段的方向不严格交替，可能出现连续同向（如连续多段向上），代表更高一级的趋势方向。实战中通常在线段级别判断大方向，在笔级别找买卖点。\n\n**买卖点**\n\n```\n1buy:  中枢下方力度衰减，一类买点 (l=27.30 < zd=46.72)\n2buy:  回调不创新低，二类买点 (l=27.33)\n3buy:  回调不破中枢上沿，三类买点 (l=27.80 > zg=27.58)\n1sell: 中枢上方力度衰减，一类卖点 (h=50.38 > zg=46.97)\n2sell: 反弹不创新高，二类卖点 (h=29.32)\n3sell: 反弹不破中枢下沿，三类卖点 (h=28.46 < zd=46.72)\n```\n\n缠论定义三类买点和三类卖点：\n\n| 类型 | 买点含义 | 卖点含义 |\n|------|----------|----------|\n| 一类 | 下跌趋势末端，力度衰减后的第一个低点（抄底） | 上涨趋势末端，力度衰减后的第一个高点（逃顶） |\n| 二类 | 一类买点后的回调不创新低（确认反转） | 一类卖点后的反弹不创新高（确认反转） |\n| 三类 | 回调不进入中枢上沿（趋势确认，中枢上方买） | 反弹不进入中枢下沿（趋势确认，中枢下方卖） |\n\n括号内的条件是该信号的触发依据，如 `l=27.80 > zg=27.58` 表示回调低点 27.80 高于中枢上沿 27.58，所以是三类买点。\n\n**背驰**\n\n```\n[✓] bi: 笔背驰: 笔[4] 力度=1.32 < 笔[2] 力度=1.97\n[✓] pz: 盘整背驰: 中枢[11] 内末笔力度=2.49 < 首笔力度=6.64\n[✓] qs: 趋势背驰(上): 中枢[1] 离开力度=3.32 < 中枢[0] 离开力度=4.45\n```\n\n背驰是力度衰减信号，表明当前走势动力正在减弱，可能即将反转。力度通过 MACD 面积计算，数值越小力度越弱。\n\n| 类型 | 含义 |\n|------|------|\n| `bi`（笔背驰） | 同向相邻两笔比较，后一笔力度 < 前一笔 → 该方向动力减弱 |\n| `pz`（盘整背驰） | 同一中枢内，末笔力度 < 首笔 → 中枢内动力衰减，即将突破 |\n| `qs`（趋势背驰） | 两个同向中枢之间比较，后一中枢离开力度 < 前一中枢 → 趋势可能终结 |\n\n`[✓]` 表示确认背驰。趋势背驰(上)代表上涨趋势可能结束，趋势背驰(下)代表下跌趋势可能结束。\n\n### 回测引擎\n\n> 📖 **完整使用手册**：[docs/backtest_usage.md](docs/backtest_usage.md) ——\n> 涵盖策略编写（`init()`/`next()`）、行情数据访问、指标注册、订单模拟、\n> 绩效指标、组合回测、调仓引擎与完整示例。回测相关用法以该手册为准。\n\n内置向量回测引擎，加载 Python 策略文件即可跑回测。策略继承 `Strategy` 基类，在 `init()` 注册指标，在 `next()` 逐 bar 生成买卖信号，引擎完成订单模拟、持仓跟踪和绩效分析。\n\n**单策略回测：**\n\n```bash\neasy-tdx backtest SZ 300308 --strategy-file strategies/expma_cross.py --count 2000 --cash 1000000 --adjust QFQ --table\n# 推荐加上 --slippage 0.01 模拟真实滑点（元/股），使回测更贴近实盘\n\n# 缠论自动桥接：引擎自动计算缠论分析并注入策略 self.chanlun\neasy-tdx backtest SZ 000001 --strategy-file strategies/chanlun_strategy.py --chanlun-level DAILY --table\n```\n\n输出示例：\n\n```\n=== 回测绩效概要 ===\n总收益率: 1413.51%\n年化收益: 40.85%\n最大回撤: 76.75%\n夏普比率: 0.88\n胜率: 20.8%\n交易次数: 24\n```\n\n> ⚠️ **回测 ≠ 实盘**。以上收益率为历史数据回测结果，包含幸存者偏差和过拟合风险，\n> 不构成投资建议。实际交易需考虑滑点、流动性、涨跌停无法成交等因素。\n> 请在充分理解策略逻辑后谨慎使用。\n\n**全策略批量对比（CLI）：**\n\n`easy-tdx run-all` 一行命令跑完 `strategies/` 下所有策略并排名：\n\n```bash\neasy-tdx run-all SZ 300308 --count 2000 --cash 1000000 --adjust QFQ\n\n# 多因子组合回测\neasy-tdx run-all SZ 300308 --combo 2 --combo-mode MAJORITY\n\n# 加 --show 自动弹出最佳策略的资金曲线 vs 股价对比图\neasy-tdx run-all SZ 300308 --count 2000 --cash 1000000 --adjust QFQ --show\n\n# 自定义策略目录\neasy-tdx run-all SZ 300308 --strategies-dir my_strategies/\n```\n\n也可使用项目自带的 `run_all_strategies.py` 脚本（功能相同）：\n\n```bash\npython -X utf8 run_all_strategies.py SZ 300308 --count 2000 --cash 1000000 --adjust QFQ\n\n# 加 --show 自动弹出最佳策略的资金曲线 vs 股价对比图\npython -X utf8 run_all_strategies.py SZ 300308 --count 2000 --cash 1000000 --adjust QFQ --show\n```\n\n**多因子组合回测：**\n\n自动遍历所有 2 因子 / 3 因子组合，找到最优搭配：\n\n```bash\n# 自动寻找最佳 2 因子和 3 因子组合（MAJORITY 模式）\npython -X utf8 run_all_strategies.py SZ 300308 --combo 2 --combo 3 --combo-mode majority\n\n# CLI 方式\neasy-tdx run-all SZ 300308 --combo 2 --combo 3 --combo-mode majority\n```\n\nCLI 指定策略文件组合：\n\n```bash\neasy-tdx ba","default_branch":"main","files":508,"tree":[".claude/settings.local.json",".github/workflows/ci.yml",".github/workflows/publish.yml",".github/workflows/release.yml",".gitignore",".readthedocs.yaml","CHANGELOG.md","LICENSE","NOTICE","README.md","docs/api_reference.md","docs/backtest_usage.md","docs/conf.py","docs/field_mapping.md","docs/index.md","docs/indicator-bias-signal.md","docs/indicator-zhuoyao.md","docs/packaging.md","docs/protocol-reverse-engineering.md","docs/protocol-unknown-fields.md","docs/quantitative-guide.md","docs/readme.md","docs/requirements.txt","docs/superpowers/plans/2026-06-09-backtest-engine.md","docs/superpowers/plans/2026-06-12-v1.11.0-factor-engine.md","docs/superpowers/plans/2026-06-12-v1.12.0-factor-analysis.md","docs/superpowers/plans/2026-06-12-v1.13.0-portfolio.md","docs/superpowers/plans/2026-06-12-v1.14.0-slippage-execution.md","docs/superpowers/plans/2026-06-12-v1.15.0-attribution.md","docs/superpowers/specs/2026-06-09-backtest-engine-design.md","docs/superpowers/specs/2026-06-12-advanced-backtest-design.md","docs/superpowers/specs/2026-06-12-quantitative-factor-engine-design.md","docs/top_img.png","docs/web-ui-page-1.png","docs/web-ui-page-2.png","docs/web-ui-page-3.png","docs/回测系统完全上手手册.html","easy_tdx.spec","examples/01_connection/async_connect.py","examples/01_connection/connect_best_host.py","examples/01_connection/ping_servers.py","examples/02_market_info/market_stat.py","examples/02_market_info/security_count.py","examples/02_market_info/security_list.py","examples/02_market_info/security_list_all.py","examples/02_market_info/security_quotes.py","examples/03_kline/index_bars.py","examples/03_kline/security_bars.py","examples/04_minute/history_minute_data.py","examples/04_minute/minute_time_data.py","examples/05_transaction/history_transaction.py","examples/05_transaction/transaction_data.py","examples/06_finance/README.md","examples/06_finance/company_cli.sh","examples/06_finance/company_info.py","examples/06_finance/company_web_api.py","examples/06_finance/finance_info.py","examples/06_finance/price_limits.py","examples/06_finance/xdxr_info.py","examples/07_block/block_info.py","examples/08_fund_flow/fund_flow.py","examples/08_fund_flow/history_fund_flow.py","examples/09_file_download/downloads/block_fg.dat","examples/09_file_download/downloads/block_gn.dat","examples/09_file_download/downloads/block_zs.dat","examples/09_file_download/downloads/gpcw20260331.zip","examples/09_file_download/downloads/gpcw20260331/gpcw20260331.dat","examples/09_file_download/downloads/tdxhy.cfg","examples/09_file_download/report_file.py","examples/10_offline/block_data.py","examples/10_offline/daily_bars.py","examples/10_offline/detect_home.py","examples/10_offline/ex_daily_bars.py","examples/10_offline/gbbq.py","examples/10_offline/history_financial.py","examples/10_offline/min_bars.py","examples/11_mac_quotes/quotes_list.py","examples/11_mac_quotes/stock_quotes.py","examples/11_realtime/realtime_feed_async.py","examples/12_mac_kline/kline_offset.py","examples/12_mac_kline/stock_kline.py","examples/13_mac_tick/chart_sampling.py","examples/13_mac_tick/multi_day_tick.py","examples/13_mac_tick/tick_chart.py","examples/14_mac_transaction/transaction.py","examples/15_mac_board/belong_board.py","examples/15_mac_board/board_list.py","examples/15_mac_board/board_members.py","examples/15_mac_board/board_ranking.py","examples/15_mac_board/board_summary.py","examples/16_mac_capital/capital_flow.py","examples/17_mac_monitor/auction.py","examples/17_mac_monitor/server_info.py","examples/17_mac_monitor/symbol_info.py","examples/17_mac_monitor/unusual.py","examples/18_mac_ex/ex_goods_list.py","examples/18_mac_ex/ex_kline.py","examples/18_mac_ex/ex_quotes.py","examples/18_mac_ex/ex_tick_chart.py","examples/19_unified/unified_client.py","examples/20_cli/cli_examples.sh","examples/21_indicator/basic_indicators.py","examples/21_indicator/list_indicators.py","examples/22_backtest_advanced/backtest_601088_advanced.py","examples/23_screen_strength/README.md","examples/23_screen_strength/strength_api.py","examples/23_screen_strength/strength_cli.sh","examples/23_screen_strength/strength_web_api.py","pyproject.toml","requirements-dev.txt","run_all_strategies.py","scripts/__init__.py","scripts/probe_unknowns.py","scripts/ruff_hook.py","scripts/verify_fixes_20260415.py","src/easy_tdx/MyTT.py","src/easy_tdx/MyTT.pyi","src/easy_tdx/__init__.py","src/easy_tdx/__main__.py","src/easy_tdx/_binary.py","src/easy_tdx/_df.py","src/easy_tdx/_health.py","src/easy_tdx/_reconnect.py","src/easy_tdx/backtest/__init__.py","src/easy_tdx/backtest/attribution.py","src/easy_tdx/backtest/cli.py","src/easy_tdx/backtest/combo.py","src/easy_tdx/backtest/dsl.py","src/easy_tdx/backtest/engine.py","src/easy_tdx/backtest/execution.py","src/easy_tdx/backtest/multi_strategy_engine.py","src/easy_tdx/backtest/optimizer.py","src/easy_tdx/backtest/orders.py","src/easy_tdx/backtest/performance.py","src/easy_tdx/backtest/portfolio.py","src/easy_tdx/backtest/portfolio_engine.py","src/easy_tdx/backtest/slippage.py","src/easy_tdx/backtest/strategies/__init__.py","src/easy_tdx/backtest/strategies/builtin.py","src/easy_tdx/backtest/strategies/presets.py","src/easy_tdx/backtest/strategies/registry.py","src/easy_tdx/backtest/strategy.py","src/easy_tdx/backtest/types.py","src/easy_tdx/chanlun/__init__.py","src/easy_tdx/chanlun/analyser.py","src/easy_tdx/chanlun/beichi.py","src/easy_tdx/chanlun/bi.py","src/easy_tdx/chanlun/config.py","src/easy_tdx/chanlun/fractal.py","src/easy_tdx/chanlun/kline_merge.py","src/easy_tdx/chanlun/macd.py","src/easy_tdx/chanlun/mmd.py","src/easy_tdx/chanlun/multi_level.py","src/easy_tdx/chanlun/types.py","src/easy_tdx/chanlun/xd.py","src/easy_tdx/chanlun/zs.py","src/easy_tdx/chanlun/zsd.py","src/easy_tdx/cli/__init__.py","src/easy_tdx/cli/cmd_admin.py","src/easy_tdx/cli/cmd_announcement.py","src/easy_tdx/cli/cmd_auction.py","src/easy_tdx/cli/cmd_board.py","src/easy_tdx/cli/cmd_capital.py","src/easy_tdx/cli/cmd_chanlun.py","src/easy_tdx/cli/cmd_company.py","src/easy_tdx/cli/cmd_ex.py","src/easy_tdx/cli/cmd_factor.py","src/easy_tdx/cli/cmd_finance.py","src/easy_tdx/cli/cmd_indicator.py","src/easy_tdx/cli/cmd_info.py","src/easy_tdx/cli/cmd_kline.py","src/easy_tdx/cli/cmd_monitor.py","src/easy_tdx/cli/cmd_offline.py","src/easy_tdx/cli/cmd_pfactor.py","src/easy_tdx/cli/cmd_quote.py","src/easy_tdx/cli/cmd_run_all.py","src/easy_tdx/cli/cmd_tick.py","src/easy_tdx/cli/cmd_transaction.py","src/easy_tdx/cli/cmd_web.py","src/easy_tdx/cli/conn.py","src/easy_tdx/cli/output.py","src/easy_tdx/cli/parsers.py","src/easy_tdx/client.py","src/easy_tdx/cninfo/__init__.py","src/easy_tdx/cninfo/client.py","src/easy_tdx/cninfo/models.py","src/easy_tdx/codec/__init__.py","src/easy_tdx/codec/bitmap.py","src/easy_tdx/codec/block.py","src/easy_tdx/codec/datetime_.py","src/easy_tdx/codec/financial.py","src/easy_tdx/codec/frame.py","src/easy_tdx/codec/industry.py","src/easy_tdx/codec/mac_frame.py","src/easy_tdx/codec/price.py","src/easy_tdx/codec/price_rules.py","src/easy_tdx/codec/volume.py","src/easy_tdx/commands/__init__.py","src/easy_tdx/commands/base.py","src/easy_tdx/commands/block_info.py","src/easy_tdx/commands/company_info.py","src/easy_tdx/commands/finance_info.py","src/easy_tdx/commands/fund_flow.py","src/easy_tdx/commands/minute_time.py","src/easy_tdx/commands/report_file.py","src/easy_tdx/commands/security_bars.py","src/easy_tdx/commands/security_count.py","src/easy_tdx/commands/security_list.py","src/easy_tdx/commands/security_quotes.py","src/easy_tdx/commands/setup.py","src/easy_tdx/commands/transaction.py","src/easy_tdx/commands/xdxr_info.py","src/easy_tdx/config.py","src/easy_tdx/ex/__init__.py","src/easy_tdx/ex/_hk_transaction.py","src/easy_tdx/ex/client.py","src/easy_tdx/ex/commands/__init__.py","src/easy_tdx/ex/commands/get_history_bars_range.py","src/easy_tdx/ex/commands/get_instrument_bars.py","src/easy_tdx/ex/commands/get_instrument_count.py","src/easy_tdx/ex/commands/get_instrument_info.py","src/easy_tdx/ex/commands/get_instrument_quote.py","src/easy_tdx/ex/commands/get_instrument_quote_list.py","src/easy_tdx/ex/commands/get_markets.py","src/easy_tdx/ex/commands/get_minute_time.py","src/easy_tdx/ex/commands/get_transaction.py","src/easy_tdx/ex/commands/login.py","src/easy_tdx/ex/commands/setup.py","src/easy_tdx/ex/mac_client.py","src/easy_tdx/ex/models.py","src/easy_tdx/ex/transport/__init__.py","src/easy_tdx/ex/transport/async_.py","src/easy_tdx/ex/transport/sync.py","src/easy_tdx/exceptions.py","src/easy_tdx/factor/__init__.py","src/easy_tdx/factor/analysis.py","src/easy_tdx/factor/base.py","src/easy_tdx/factor/builtin/__init__.py","src/easy_tdx/factor/builtin/chanlun.py","src/easy_tdx/factor/builtin/momentum.py","src/easy_tdx/factor/builtin/quality.py","src/easy_tdx/factor/builtin/technical.py","src/easy_tdx/factor/builtin/value.py","src/easy_tdx/factor/builtin/volatility.py","src/easy_tdx/factor/builtin/volume.py","src/easy_tdx/factor/engine.py","src/easy_tdx/factor/transform.py","src/easy_tdx/indicator.py","src/easy_tdx/mac/__init__.py","src/easy_tdx/mac/adjust.py","src/easy_tdx/mac/client.py","src/easy_tdx/mac/commands/__init__.py","src/easy_tdx/mac/commands/board_list.py","src/easy_tdx/mac/commands/board_members_quotes.py","src/easy_tdx/mac/commands/chart_sampling.py","src/easy_tdx/mac/commands/file_query.py","src/easy_tdx/mac/commands/goods_list.py","src/easy_tdx/mac/commands/kline_offset.py","src/easy_tdx/mac/commands/server_info.py","src/easy_tdx/mac/commands/symbol_auction.py","src/easy_tdx/mac/commands/symbol_bar.py","src/easy_tdx/mac/commands/symbol_belong_board.py","src/easy_tdx/mac/commands/symbol_capital_flow.py","src/easy_tdx/mac/commands/symbol_info.py","src/easy_tdx/mac/commands/symbol_quotes.py","src/easy_tdx/mac/commands/symbol_tick_chart.py","src/easy_tdx/mac/commands/symbol_transaction.py","src/easy_tdx/mac/commands/tick_charts.py","src/easy_tdx/mac/commands/unusual.py","src/easy_tdx/mac/enums.py","src/easy_tdx/mac/models.py","src/easy_tdx/models/__init__.py","src/easy_tdx/models/bar.py","src/easy_tdx/models/enums.py","src/easy_tdx/models/finance.py","src/easy_tdx/models/quote.py","src/easy_tdx/models/security.py","src/easy_tdx/models/stats.py","src/easy_tdx/models/timeseries.py","src/easy_tdx/offline/__init__.py","src/easy_tdx/offline/block.py","src/easy_tdx/offline/daily_bar.py","src/easy_tdx/offline/ex_daily_bar.py","src/easy_tdx/offline/finders.py","src/easy_tdx/offline/gbbq.py","src/easy_tdx/offline/history_financial.py","src/easy_tdx/offline/min_bar.py","src/easy_tdx/offline/paths.py","src/easy_tdx/offline/write_daily.py","src/easy_tdx/offline/write_ex_daily.py","src/easy_tdx/offline/write_min_bar.py","src/easy_tdx/portfolio/__init__.py","src/easy_tdx/portfolio/optimizer.py","src/easy_tdx/portfolio/rebalance.py","src/easy_tdx/portfolio/risk.py","src/easy_tdx/portfolio/types.py","src/easy_tdx/py.typed","src/easy_tdx/realtime/__init__.py","src/easy_tdx/realtime/engine.py","src/easy_tdx/realtime/feed.py","src/easy_tdx/screen/__init__.py","src/easy_tdx/screen/cli.py","src/easy_tdx/screen/ranker.py","src/easy_tdx/screen/scanner.py","src/easy_tdx/screen/strength.py","src/easy_tdx/sina/__init__.py","src/easy_tdx/sina/client.py","src/easy_tdx/sina/models.py","src/easy_tdx/transport/__init__.py","src/easy_tdx/transport/async_.py","src/easy_tdx/transport/sync.py","src/easy_tdx/tray.py","src/easy_tdx/unified.py","src/easy_tdx/web/__init__.py","src/easy_tdx/web/app.py","src/easy_tdx/web/backtest_schemas.py","src/easy_tdx/web/convert.py","src/easy_tdx/web/deps.py","src/easy_tdx/web/errors.py","src/easy_tdx/web/routers/__init__.py","src/easy_tdx/web/routers/announcement.py","src/easy_tdx/web/routers/backtest.py","src/easy_tdx/web/routers/bars.py","src/easy_tdx/web/routers/block.py","src/easy_tdx/web/routers/board_mac.py","src/easy_tdx/web/routers/chanlun.py","src/easy_tdx/web/routers/ex_market.py","src/easy_tdx/web/routers/finance.py","src/easy_tdx/web/routers/indicator.py","src/easy_tdx/web/routers/mac_data.py","src/easy_tdx/web/routers/mac_quotes.py","src/easy_tdx/web/routers/market.py","src/easy_tdx/web/routers/realtime.py","src/easy_tdx/web/routers/server.py","src/easy_tdx/web/routers/sina.py","src/easy_tdx/web/routers/strategies.py","src/easy_tdx/web/schemas.py","src/easy_tdx/web/strategy_store.py","src/easy_tdx/web/task_runner.py","strategies/README.md","strategies/bias_reversal.py","strategies/bollinger_breakout.py","strategies/cci_breakout.py","strategies/demo/1.png","strategies/demo/2.png","strategies/demo/3.png","strategies/demo/4.png","strategies/dmi_trend.py","strategies/expma_cross.py","strategies/kdj_golden.py","strategies/ma_cross.py","strategies/macd_cross.py","strategies/mfi_volume.py","strategies/mtm_momentum.py","strategies/obv_trend.py","strategies/rsi_reversal.py","strategies/trix_cross.py","strategies/turtle_breakout.py","strategies/volume_price.py","strategies/zhuoyao_momentum.py","tests/__init__.py","tests/fixtures/company_info_category.hex","tests/fixtures/company_info_category.json","tests/fixtures/company_info_content.hex","tests/fixtures/company_info_content.json","tests/fixtures/ex_history_transaction.hex","tests/fixtures/ex_history_transaction.json","tests/fixtures/finance_info.hex","tests/fixtures/finance_info.json","tests/fixtures/history_minute_time.hex","tests/fixtures/history_minute_time.json","tests/fixtures/history_transaction.hex","tests/fixtures/history_transaction.json","tests/fixtures/minute_time.hex","tests/fixtures/minute_time.json","tests/fixtures/security_bars.hex","tests/fixtures/security_bars.json","tests/fixtures/security_count.hex","tests/fixtures/security_count.json","tests/fixtures/security_list.hex","tests/fixtures/security_list.json","tests/fixtures/security_quotes.hex","tests/fixtures/security_quotes.json","tests/fixtures/transaction.hex","tests/fixtures/transaction.json","tests/fixtures/xdxr_info.hex","tests/fixtures/xdxr_info.json","tests/integration/__init__.py","tests/integration/test_live_client.py","tests/unit/__init__.py","tests/unit/test_a_share_extensions.py","tests/unit/test_async_transport.py","tests/unit/test_backtest_attribution.py","tests/unit/test_backtest_cli.py","tests/unit/test_backtest_combo.py","tests/unit/test_backtest_engine.py","tests/unit/test_backtest_execution.py","tests/unit/test_backtest_orders.py","tests/unit/test_backtest_performance.py","tests/unit/test_backtest_portfolio.py"],"storefront":"/r/handsomejustin","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/handsomejustin/easy_tdx/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}