企业微信

通达信API实时行情接入实战

通达信API的核心能力

通达信提供多种数据接口,包括本地行情文件读取、网络协议直接通信、DLL动态链接库调用。本地文件读取延迟高,适合历史回测。网络协议直接通信延迟低,适合实盘。DLL调用性能最优但开发复杂。量化交易优先选择网络协议,通过Python的pytdx库即可实现。pytdx封装了通达信标准行情协议,支持股票、期货、期权、指数。

环境搭建与服务器连接

安装pytdx:


pip install pytdx

连接通达信行情服务器。服务器列表可从网上获取,选择延迟低的节点。

如何用通达信API获取实时行情数据并用于量化交易


from pytdx.hq import TdxHq_API

api = TdxHq_API()

# 服务器地址和端口,常见如 119.147.212.81:7709

servers = [

    ('119.147.212.81', 7709),

    ('114.80.63.12', 7709),

    ('218.108.98.244', 7709),

]

for ip, port in servers:

    if api.connect(ip, port):

        print(f'已连接 {ip}:{port}')

        break

else:

    raise ConnectionError('所有服务器连接失败')

连接成功后,调用api.get_security_count获取市场股票数量,验证连接有效性。

实时行情数据获取

pytdx提供get_security_quotes方法获取单只或多只股票的实时行情。参数为市场代码和代码列表。市场代码:0为深圳,1为上海。期货市场代码不同,中金所为47,上期所为30,大商所为29,郑商所为28。


# 股票实时行情

stocks = [(0, '000001'), (1, '600000')]

quotes = api.get_security_quotes(stocks)

for q in quotes:

    print(q['code'], q['price'], q['last_close'], q['open'], q['high'], q['low'], q['vol'], q['amount'])

返回字段包括:price当前价,last_close昨收,open今开,high最高,low最低,vol成交量(手),amount成交额(元),bid1~bid5买五档,ask1~ask5卖五档,bid_vol1~bid_vol5买量,ask_vol1~ask_vol5卖量。

期货行情获取类似,市场代码需正确。


# 期货实时行情,以上期所螺纹钢为例

futures = [(30, 'rb2310')]

quotes = api.get_security_quotes(futures)

for q in quotes:

    print(q['code'], q['price'], q['open'], q['high'], q['low'], q['vol'], q['amount'])

注意期货代码格式:品种字母+合约月份,如rb2310。郑商所代码为品种字母+三位数字,如TA310。

行情订阅与轮询机制

通达信API不提供推送订阅,需轮询。轮询频率影响延迟和服务器负载。股票行情每3秒一次,期货行情每0.5秒一次。高频策略需用多线程或异步IO。


import time

from pytdx.hq import TdxHq_API

api = TdxHq_API()

api.connect('119.147.212.81', 7709)

symbols = [(0, '000001'), (1, '600000'), (30, 'rb2310')]

while True:

    try:

        quotes = api.get_security_quotes(symbols)

        for q in quotes:

            # 处理实时数据,写入队列或数据库

            print(f"{q['code']} {q['price']} {q['vol']}")

    except Exception as e:

        print(f'获取失败: {e}')

        # 重连逻辑

        api.disconnect()

        time.sleep(1)

        api.connect('119.147.212.81', 7709)

    time.sleep(0.5)

轮询频率过高可能导致服务器断开。建议单服务器每秒不超过10次请求。多品种时,分批获取,每批不超过50只。

数据存储与清洗

实时行情需持久化。选择时序数据库如InfluxDB,或关系数据库如PostgreSQL。写入前清洗数据:过滤价格为0的无效记录,检查成交量突变,处理涨跌停板。


import pandas as pd

from sqlalchemy import create_engine

engine = create_engine('postgresql://user:pass@localhost:5432/market')

def save_quotes(quotes):

    df = pd.DataFrame(quotes)

    df = df[df['price'] > 0]

    df = df[df['vol'] >= 0]

    df['timestamp'] = pd.Timestamp.now()

    df.to_sql('realtime_quotes', engine, if_exists='append', index=False)

存储字段包括时间戳、代码、市场、最新价、成交量、成交额、五档买卖。注意时区统一为交易所时区。

量化交易策略集成

实时行情驱动策略。常见策略:双均线、布林带、动量。策略接收实时行情,计算信号,发送订单。下单接口可用券商API或CTP。


class DualMovingAverage:

    def __init__(self, short_window=5, long_window=20):

        self.short = short_window

        self.long = long_window

        self.prices = []



    def on_tick(self, price):

        self.prices.append(price)

        if len(self.prices) < self.long:

            return None

        short_ma = sum(self.prices[-self.short:]) / self.short

        long_ma = sum(self.prices[-self.long:]) / self.long

        if short_ma > long_ma and self.prices[-2] <= self.prices[-1]:

            return 'BUY'

        elif short_ma < long_ma and self.prices[-2] >= self.prices[-1]:

            return 'SELL'

        return None

期货策略需考虑保证金和杠杆。股票策略考虑T+1限制。策略回测用历史数据,实盘用实时数据。注意滑点和手续费

性能优化与风险控制

多线程轮询提高吞吐量。每个线程负责一组品种。使用队列传递数据。避免GIL限制,可用多进程。网络延迟优化:选择就近服务器,使用TCP_NODELAY。

风险控制:设置最大持仓,单笔亏损限额,日内回撤限制。行情断线自动重连。数据异常报警。


import threading

import queue

q = queue.Queue()

def poll_worker(symbols):

    api = TdxHq_API()

    api.connect('119.147.212.81', 7709)

    while True:

        quotes = api.get_security_quotes(symbols)

        for quote in quotes:

            q.put(quote)

        time.sleep(0.5)

threads = []

for i in range(4):

    t = threading.Thread(target=poll_worker, args=(symbols[i::4],))

    t.start()

    threads.append(t)

期货夜盘行情需单独处理。股票集合竞价数据特殊。行情数据与交易信号解耦。

常见问题与解决方案

连接失败:更换服务器IP和端口。获取数据为空:检查市场代码和代码格式。返回延迟大:减少单次请求数量,增加轮询线程。数据错乱:检查返回字段索引,不同版本pytdx字段可能不同。期货代码错误:参考交易所合约代码规则。内存泄漏:定期重启进程。

通达信API获取实时行情是量化交易的基础。掌握pytdx连接、行情获取、轮询、存储、策略集成,即可构建稳定实盘系统。股票期货通用,注意市场差异。