
为什么程序化交易需要Python和通达信
很多股民和期货玩家都想过用程序自动下单,不用整天盯盘。Python是目前最流行的编程语言,通达信则是国内装机量最大的行情软件。把两者连起来,就能让电脑帮你盯盘、算信号、发委托。
但这件事有个门槛:通达信官方没有开放标准API给普通用户。市面上能用的方法,都是通过第三方库或者破解通讯协议实现的。今天不讲虚的,直接说清楚怎么用Python调通达信做程序化交易。
准备工作:装什么、用什么
你需要三样东西
通达信金融终端(标准版就行,不要用券商定制版,通讯协议可能不同)
Python 3.7以上(建议用Anaconda,省得配环境)
一个能登录的股票或期货账户(程序化交易最终要下单,没账户只能看行情)
核心Python库
pip install pytdx
pytdx是开源的通达信协议解析库,能直接读取通达信的行情服务器数据。它不依赖通达信客户端运行,而是模拟客户端向服务器发请求。
注意:pytdx只能读行情和部分财务数据,不能直接下单。下单需要券商提供专门的交易接口,或者用通达信客户端的“预警委托”功能做半自动交易。

第一步:用pytdx获取行情数据
连接行情服务器
from pytdx.hq import TdxHq_API
api = TdxHq_API()
with api.connect('119.147.212.81', 7709):
data = api.get_security_bars(9, 0, '000001', 0, 10)
print(data)
这段代码的意思是:连上通达信的免费行情服务器(IP和端口是公开的),取平安银行最近10根日K线。参数9代表日线,0代表深圳市场,000001是股票代码。
批量取多只股票
stocks = ['000001', '600000', '000858']
for code in stocks:
bars = api.get_security_bars(9, 0 if code.startswith('0') else 1, code, 0, 5)
print(code, bars[-1]['close'])
这里有个坑:上海市场和深圳市场的代码要分开判断,0是深圳,1是上海。
第二步:把行情接到你的策略里
拿到数据只是原料,你得有买卖规则。最基础的均线策略:
def ma_strategy(closes, short=5, long=20):
if len(closes) < long:
return 'wait'
ma_short = sum(closes[-short:]) / short
ma_long = sum(closes[-long:]) / long
if ma_short > ma_long:
return 'buy'
elif ma_short < ma_long:
return 'sell'
return 'hold'
把pytdx取到的收盘价序列传进去,就能得到信号。
第三步:下单——最麻烦的部分
直接调通达信下单基本不可能
通达信客户端没有公开的Python下单接口。网上流传的“破解通讯协议”方法,需要逆向工程,而且每次通达信更新都可能失效。对普通散户,这条路性价比极低。
可行的替代方案
方案A:用券商官方API
很多券商给量化客户提供专用接口,比如华泰的MATIC、国泰君安的量化交易平台。这些接口支持Python,但需要开通权限,通常有资金门槛(50万以上)。
方案B:通达信预警+模拟点击
在通达信里设好条件预警,触发后弹窗。用Python的pyautogui库模拟鼠标点击“买入”按钮。这种方法不稳定,只适合小资金玩玩。
import pyautogui
# 假设预警弹窗在屏幕固定位置
pyautogui.click(500, 300) # 点“确定”
pyautogui.click(600, 400) # 点“买入”
方案C:用CTP接口做期货
如果你做期货,直接用上期技术的CTP接口。Python有vnpy这样的开源框架,对接期货公司柜台,能实现全自动交易。股票没有统一的CTP,所以股票程序化交易更麻烦。
第四步:回测和风控不能省
程序化交易最大的陷阱是“信号看着好,实盘亏成狗”。用历史数据跑一遍:
# 简单回测框架
capital = 100000
position = 0
for i in range(20, len(closes)):
signal = ma_strategy(closes[:i])
if signal == 'buy' and position == 0:
position = capital / closes[i]
capital = 0
elif signal == 'sell' and position > 0:
capital = position * closes[i]
position = 0
回测要算手续费和滑点。股票买卖一次至少千分之一,期货按手数收。不加这些,回测收益虚高。
实际能跑通的完整流程
用
pytdx连行情服务器,每分钟取一次最新价把价格喂给策略函数,得到买卖信号
信号触发后,如果是股票,用券商API下单;如果是期货,用CTP接口
下单后记录持仓,更新止损止盈线
每天收盘后跑一次回测,检查策略是否失效
几个必须知道的坑
行情延迟:免费行情服务器有15秒左右延迟,做日内高频根本不够用。
账户安全:不要把账户密码写在代码里,用环境变量或者加密配置文件。
监管风险:程序化交易报备制度越来越严,频繁撤单可能被交易所盯上。
通达信版本:不同版本的通讯协议不同,pytdx只兼容标准版。
给新手的建议
先别想着全自动。从半自动开始:Python算信号,弹窗提醒,手动点确认。跑三个月稳定了,再考虑接券商API。期货程序化比股票容易,因为CTP接口是标准化的。股票程序化交易在国内散户层面,依然是个灰色地带,量力而行。