企业微信

通达信API的三种调用路径

通达信股票软件未提供官方公开的REST API,但通过其动态链接库、公式系统与数据文件接口,量化交易者可以获取行情数据并执行交易指令。期货量化同样能借助这些机制接入通达信平台。

动态链接库DLL调用

通达信安装目录下存在TC.dllTrade.dll等动态链接库文件。这些DLL封装了行情获取、委托下单、账户查询等函数。C++或Python通过ctypes库加载DLL,按导出函数签名传参即可调用。

通达信股票软件API怎么调用

Python调用示例:


import ctypes

# 加载通达信交易DLL

tdx = ctypes.WinDLL(r'C:\new_tdx\Trade.dll')

# 定义函数参数类型

tdx.OpenConnect.argtypes = [ctypes.c_char_p, ctypes.c_int]

tdx.OpenConnect.restype = ctypes.c_bool

# 连接交易服务器

result = tdx.OpenConnect(b'127.0.0.1', 7708)

print('连接状态:', result)

# 获取账户资金

tdx.QueryAccount.argtypes = [ctypes.c_char_p]

tdx.QueryAccount.restype = ctypes.c_char_p

account_info = tdx.QueryAccount(b'123456')

print(account_info.decode('gbk'))

DLL调用需要匹配通达信版本与位数,32位Python配32位DLL,64位Python配64位DLL。期货交易需使用通达信期货版对应的TdxFutures.dll

公式系统与扩展数据

通达信公式系统支持DLL插件扩展。编写自定义DLL导出GetData函数,公式中通过"DLLNAME"(参数)调用。此方式适合计算自定义指标并输出到行情界面。

公式示例:


{自定义指标}

MYIND: "MyDLL.dll"(CLOSE, VOL);

DLL中实现GetData函数,接收价格与成交量数组,返回计算后的指标值。期货品种的连续合约需处理换月跳空,DLL内可做前复权处理。

数据文件与内存映射

通达信将日线、分钟线数据存放在vipdoc目录下,格式为二进制.day文件。每个交易日一条记录,结构体包含日期、开盘、最高、最低、收盘、成交额、成交量。Python读取示例:


import struct

import os

def read_day_file(filepath):

    records = []

    with open(filepath, 'rb') as f:

        while True:

            data = f.read(32)

            if not data:

                break

            date, open_p, high, low, close, amount, vol, _ = struct.unpack('<IIIIIfII', data)

            records.append({

                'date': date,

                'open': open_p / 100.0,

                'high': high / 100.0,

                'low': low / 100.0,

                'close': close / 100.0,

                'volume': vol

            })

    return records

# 读取期货主力合约日线

futures_data = read_day_file(r'C:\new_tdx\vipdoc\ds\lday\IF2406.day')

print(futures_data[-5:])

内存映射方式适合高频读取,通过mmap模块将.day文件映射到内存,避免频繁IO。期货分钟线存放在minline目录,格式与日线不同,需按1分钟、5分钟分别解析。

期货API的差异处理

通达信期货API与股票API在交易指令上有明显区别。股票只能做多,期货支持双向开仓与平仓。DLL函数中OrderAction参数区分买入开仓、卖出开仓、买入平仓、卖出平仓。期货保证金计算需调用QueryMargin函数,依据合约乘数与保证金率动态变化。

期货行情推送频率高于股票,DLL回调函数需处理高频数据。建议使用环形缓冲区存储Tick数据,避免内存溢出。夜盘交易时段,通达信服务器地址与日盘不同,需在OpenConnect中切换IP与端口。

Python量化框架集成

将通达信API接入Backtrader或vn.py框架。编写自定义DataFeed类读取.day文件,重写_load方法。交易接口实现send_order方法,内部调用通达信DLL的OrderInsert函数。


class TdxDataFeed(bt.feeds.GenericCSVData):

    params = (

        ('datetime', 0),

        ('open', 1),

        ('high', 2),

        ('low', 3),

        ('close', 4),

        ('volume', 5),

    )

def tdx_send_order(symbol, price, volume, direction):

    # direction: 0买入开仓 1卖出开仓 2买入平仓 3卖出平仓

    tdx.OrderInsert(symbol.encode('gbk'), price, volume, direction)

集成时注意DLL线程安全问题,通达信DLL非线程安全,需加锁串行调用。回测阶段直接读取历史.day文件,实盘阶段切换至DLL行情推送。

常见错误与调试

OpenConnect返回False时检查通达信客户端是否登录。QueryAccount乱码需设置encoding='gbk'。DLL调用崩溃常因参数类型错误,ctypesc_char_p对应Python bytes,c_int对应int。期货合约代码格式为市场代码+合约代码,上期所SHFE.rb2410,中金所CFFEX.IF2406

通达信API无官方文档,函数签名通过dumpbin /exports查看DLL导出表。调试时使用OutputDebugString输出日志,配合DebugView工具捕获。