#!/usr/bin/env python3 # -*- coding: utf-8 -*- """mootdx 分钟K线历史深度测试 —— 周一开盘后跑(非交易时段通达信全服务器返空) 目的:对比 miniQMT 模拟端 1m/5m/15m 统一只给 ~12 个月(2025-07-16 起), 看通达信公共行情服务器能给多深的分钟历史。 用法: venv311/bin/python scripts/data_platform/test_mootdx_depth.py 结果写 scripts/data_platform/_mootdx_depth_result.txt 并打印。 注意: - 频率值表(mootdx 0.11.7 实测): 0=5m 1=15m 2=30m 3=60m 4=日 8=1分钟 9=日线 - bars 返回【不复权】原始价;offset 硬上限 800,更深历史靠 start 分页 - 非交易时段(收盘后/周末)通达信服务器 quotes+bars 全频率返空,连日线都不给 """ import socket import sys import datetime from mootdx.quotes import Quotes _TDX_SERVERS = [ ('119.97.185.59', 7709), ('124.70.133.119', 7709), ('116.205.183.150', 7709), ('123.60.73.44', 7709), ('116.205.163.254', 7709), ('121.36.225.169', 7709), ('123.60.70.228', 7709), ('124.71.9.153', 7709), ('110.41.147.114', 7709), ('124.71.187.122', 7709), ] def _probe(ip, port, timeout=2.0): try: with socket.create_connection((ip, port), timeout=timeout): return True except Exception: return False def _n(x): """统一求长度, 规避空 DataFrame 的 bool 歧义坑""" if x is None: return 0 try: return len(x) except Exception: return 0 def find_server(symbol='600519'): """遍历服务器, 返回第一个能返回日线 bars 的(交易日内才有)""" for ip, port in _TDX_SERVERS: if not _probe(ip, port): continue try: c = Quotes.factory(market='std', server=(ip, port)) d = c.bars(symbol=symbol, frequency=9, offset=5) if _n(d) > 0: return ip, c except Exception: pass return None, None def test_depth(c, symbol, freq, name, max_pages=200): """start 分页翻到底, 找最早/最新 datetime. 200页: 1m≈20月/5m≈8年/15m≈24年""" start = 0 total = 0 pages = 0 earliest = None latest = None while pages < max_pages: try: df = c.bars(symbol=symbol, frequency=freq, offset=800, start=start) except Exception: break n = _n(df) if n == 0: break total += n try: ft = str(df.iloc[0]['datetime']) lt = str(df.iloc[-1]['datetime']) if earliest is None or ft < earliest: earliest = ft if latest is None or lt > latest: latest = lt except Exception: pass if n < 800: break start += n pages += 1 return name, total, earliest, latest, pages def main(): out = ['mootdx 深度测试 @ %s' % datetime.datetime.now()] ip, c = find_server() if c is None: out.append('!!! 没有服务器返回日线数据 —— 非交易时段(周末/收盘后)通达信全服务器返空') out.append('!!! 请周一 09:30 开盘后重跑此脚本') msg = '\n'.join(out) print(msg) with open('_mootdx_depth_result.txt', 'w') as f: f.write(msg) sys.exit(1) out.append('server: %s' % ip) out.append('') for sym in ['600519']: # 茅台(2001上市, 老股, 测深度上限最佳) out.append('=== %s (茅台) ===' % sym) for fr, nm in [(8, '1分钟'), (0, '5分钟'), (1, '15分钟')]: name, total, earliest, latest, pages = test_depth(c, sym, fr, nm) out.append(' %-6s: %7d 根 | 最早=%s | 最新=%s | 翻%d页' % (name, total, earliest, latest, pages)) out.append('') out.append('对比: miniQMT 模拟端 1m/5m/15m 统一 ~12 个月(2025-07-16 起)') msg = '\n'.join(out) print(msg) with open('_mootdx_depth_result.txt', 'w') as f: f.write(msg) if __name__ == '__main__': main()