
通达信api接口开发python到底能做什么
很多做股票和期货的朋友,手里都有通达信软件。看盘、画线、选股,用着挺顺手。可一到想把自己的交易想法变成自动代码,就卡住了。市面上量化平台不少,但数据要钱、接口不开放、策略还受限制。通达信api接口开发python,就是自己动手打通这条路。
说白了,通达信本身不直接给你一个官方的python包。它提供的是dll动态链接库,或者通过它自己的协议来通信。你要用python去调,得借助第三方库,最出名的就是pytdx。这个库把通达信的行情协议翻译成了python能听懂的指令。你装好pytdx,写几行代码,就能连上通达信的行情服务器,拿到股票、期货、指数的实时报价和历史K线。
为什么不用现成的量化平台
现成平台有它的好处,省事、界面友好。可问题也明显。第一,数据延迟。很多免费平台给你的是分钟级甚至更慢的数据,做日内短线根本不够用。第二,策略保密性差。你把策略写上去,平台方能不能看到?说不准。第三,费用。稍微像样的回测和实盘,一年几千上万。第四,品种限制。有些平台只做股票,不做期货,或者只做国内不做外盘。
通达信api接口开发python,相当于自己搭一套系统。数据直接从通达信服务器拿,速度快,品种全。策略在自己电脑上跑,没人偷看。成本就是电费和网费。对于喜欢折腾、有一定编程基础的散户,这条路很划算。

先搞懂通达信的数据协议
通达信客户端和服务器之间,用的是自己的一套二进制协议。pytdx已经帮你封装好了。你不用去研究每个字节什么意思,直接调用它提供的函数就行。
核心函数有这么几个。TdxHq_API类负责连接行情服务器。connect方法填上服务器IP和端口。get_security_quotes拿实时行情。get_security_bars拿K线数据。get_index_bars拿指数K线。
服务器地址从哪来?通达信客户端里有个配置文件,叫tdxhy.cfg,里面列了一堆服务器IP。或者你去网上搜“通达信行情服务器列表”,有人定期整理。尽量选延迟低的,比如你所在省份的电信或联通节点。
用python连上通达信拿数据
先装库。命令行敲 pip install pytdx。
下面这段代码演示连接服务器、订阅一只股票、打印最新价和五档盘口。
from pytdx.hq import TdxHq_API
api = TdxHq_API()
# 连接一个上海电信的服务器
with api.connect('119.147.212.81', 7709):
# 拿浦发银行实时行情
data = api.get_security_quotes([(1, '600000')])
print(data)
# 拿最近10根日K线
bars = api.get_security_bars(9, 1, '600000', 0, 10)
for bar in bars:
print(bar['datetime'], bar['open'], bar['high'], bar['low'], bar['close'])
get_security_quotes的第一个参数是个列表,里面每个元素是(市场代码, 股票代码)。市场代码0是深圳,1是上海。期货的话,中金所是1?不对,中金所股票代码是特殊前缀。商品期货在上海期货交易所是1?也不对。实际用的时候,你拿不准就试。pytdx的文档里写了,市场代码0深圳,1上海,2北京?没有北京。商品期货主力合约,比如螺纹钢,市场代码是1?不是,螺纹钢在上海期货交易所,代码是rb2310这种。pytdx里市场代码:0深圳,1上海,2?我建议你直接查pytdx的源码或者用get_security_list函数把对应市场的所有代码拉下来,看里面的market字段。
期货数据怎么拿
期货和股票在通达信协议里区别不大。主要区别是市场代码和合约代码格式。
国内四大期货交易所:上海期货交易所、大连商品交易所、郑州商品交易所、中国金融期货交易所。pytdx里市场代码并不是简单对应。经过实测,上海期货交易所的市场代码是1?不对,是1的话和上海股票冲突了。实际上pytdx把期货市场单独编码。你去查pytdx.params这个模块,里面定义了TDXParams。里面有MARKET_SH等于1?也不是。
稳妥的办法:用api.get_security_list(market, start)挨个市场试。比如市场代码28对应中金所,29对应上期所,30对应大商所,31对应郑商所。这些数字不一定准,因为pytdx版本不同。你可以写个小循环,从0到40,每个市场拉前10个代码,看返回值里有没有螺纹钢、豆粕这些。
拿到合约代码后,get_security_bars一样用。只是category参数要选对。日线是9,分钟线是0到8对应1分钟到60分钟。
从拿数据到自动交易还有多远
pytdx只负责行情,不负责交易。你要下单,得用券商或期货公司的交易接口。通达信本身有个“交易”功能,登录资金账号后可以下单。但通达信不开放交易协议的python接口。
想自动交易,两条路。第一条,用券商提供的官方api。比如华泰、国金、恒生电子等,有专门的量化接口。这些接口通常要资金门槛,五十万起。第二条,用模拟点击。python的pywinauto或pyautogui库控制通达信窗口,模拟键盘鼠标操作。这条路不稳定,窗口一卡就出错,而且容易被券商风控。
更现实的方案:通达信api接口开发python只用来做行情分析和信号生成。信号出来之后,通过微信、钉钉或者邮件发给你,你手动下单。或者用券商的手机app扫码登录,再用python控制安卓模拟器下单。但不推荐,合规风险大。
量化策略的简单框架
假设你已经能用pytdx拿到期货分钟线。一个最基础的双均线策略逻辑:
import numpy as np
from pytdx.hq import TdxHq_API
api = TdxHq_API()
api.connect('119.147.212.81', 7709)
# 拿螺纹钢主力合约最近200根5分钟线
bars = api.get_security_bars(0, 29, 'rb2310', 0, 200)
closes = [bar['close'] for bar in bars]
# 算5周期和20周期均线
ma5 = np.convolve(closes, np.ones(5)/5, mode='valid')
ma20 = np.convolve(closes, np.ones(20)/20, mode='valid')
# 金叉做多,死叉做空
if ma5[-1] > ma20[-1] and ma5[-2] <= ma20[-2]:
print('金叉,买入信号')
elif ma5[-1] < ma20[-1] and ma5[-2] >= ma20[-2]:
print('死叉,卖出信号')
这只是信号生成。回测需要更完整的框架,处理滑点、手续费、仓位管理。
实际开发中的坑
服务器连接不稳定。通达信的免费行情服务器经常断线。你得写重连逻辑,比如用try...except包住api.connect,断了就换个IP重试。
数据缺失。有些冷门合约或者退市股票,get_security_bars返回空列表。你要判断len(bars) == 0的情况。
频率限制。通达信服务器对请求频率有隐性限制。你一秒发几十个请求,可能会被临时封IP。建议每次请求之间sleep(0.1)秒。
历史数据长度。get_security_bars一次最多拿800根K线。你要拿更长历史,得用start参数分批拉。比如先拉0到800,再拉800到1600,拼起来。
编码问题。pytdx返回的字符串默认是gbk编码。如果你要存到数据库或者打印到utf-8终端,记得.decode('gbk')或者设置环境变量。
合规与风险提醒
用通达信api接口开发python做量化,自己研究没问题。一旦涉及代客理财、公开荐股、或者用模拟点击大规模下单,可能触碰监管红线。券商有权冻结账户。期货公司对程序化交易有报备要求。你写个脚本自己用,没人管。你搞成产品卖给别人,性质就变了。
通达信官方从未授权任何第三方python库。pytdx是社区逆向工程的结果。哪天通达信改了协议,pytdx可能失效。你得有心理准备。
对于大多数散户,通达信api接口开发python最大的价值是数据获取和策略验证。别一上来就想全自动交易。先能把股票期货的历史数据拉下来,用pandas做做统计,用backtrader跑跑回测。等策略稳定盈利了,再考虑接实盘。走稳一点,比什么都强。