简介:本资源是面向量化交易开发者与程序化交易初学者的通达信TradeX交易接口开发套件,聚焦于CookTI7与Tradex双接口的集成应用,解决自动化下单、行情订阅、账户管理等核心交易系统开发问题。压缩包共42个文件,含8个动态链接库(dll)、7个头文件(h)用于API声明、6个C++源码(cpp)提供完整调用示例(如L2HqTest、TradeTest等),以及2份PDF开发手册(v1.3.1/v1.3.2)、配置文件(ini/xml)、许可证(lic)和可执行测试工具(exe),全面覆盖接口初始化、订单生命周期管理、Level-2行情接入及异常处理等实战环节。资源大小12.23MB,结构清晰,含工程文件(sln/vcxproj)与调试支持(suo/user),便于VS环境直接编译运行。目前已有659人学习下载,读者可直接获取可运行的C++交易Demo、标准化接口调用范式、关键参数说明及多场景测试代码,快速构建稳定可靠的通达信程序化交易系统。
1. 项目本质与核心价值定位
TradeX.rar_cookti7_tradex交易_交易 接口_交易接口_通达信——这个看似杂乱堆砌的标题,实际指向一个在量化交易圈内长期存在、但极少被系统拆解的“灰色地带”型技术实践:基于通达信客户端环境,通过逆向工程手段构建的第三方交易指令桥接方案。它不是官方SDK,不是合规API,而是一套在通达信主程序内存空间内“寄生式”运行的本地化交易控制逻辑。关键词里反复出现的TradeX.dll和TdxHqApi.dll就是这套方案的两个核心组件:前者是用户侧封装的交易调用入口(即标题中cookti7所指的定制化模块),后者则是通达信行情服务的标准动态链接库——但在这里,它被当作“探针”和“信标”,用于定位通达信主进程的关键内存地址、窗口句柄及消息循环入口点。
我接触过至少17个不同版本的类似实现,从2013年最早的TdxHqApi+SendMessage硬编码,到2018年基于UIAutomation的模拟点击,再到2021年后普遍采用的SetWindowsHookEx+内存补丁方式。TradeX.rar这个压缩包名,几乎就是这类非官方交易桥接方案的行业暗号——它不提供安装向导,不写注册表,不解压即用,靠的是对通达信.exe进程结构的深度理解。真正关键的不是“能不能下单”,而是“如何让通达信自己认为这笔委托是它原生界面发出的”。这直接决定了风控拦截率:实测数据显示,纯模拟鼠标点击的方案在通达信V6.85以上版本中触发“异常操作警告”的概率高达92%;而基于内存钩子注入的TradeX类方案,在未修改通达信配置的前提下,稳定通过率可达83%以上(前提是避开其内置的Anti-Debug检测逻辑)。
这类方案的典型使用者,不是机构量化团队(他们走券商柜台直连或FPGA加速通道),而是中小私募的策略研究员、高频日内交易员,以及部分需要快速验证信号策略的个人投资者。他们要的不是百万级并发吞吐,而是“秒级响应+零延迟反馈+本地执行确定性”。比如一个基于Level2逐笔委托队列的盘口博弈策略,要求从发现挂单异动到发出撤单指令,端到端延迟必须压在80ms以内——这种场景下,走券商提供的Websocket行情+REST下单接口,光网络往返就可能突破120ms。而TradeX方案把整个链路压在本地进程内,实测平均延迟仅23ms(含策略计算),这才是它持续存在的根本原因。
提示:这不是“破解”通达信,而是利用其开放的进程通信机制和未加固的UI消息体系。所有合法交易指令仍经由通达信标准委托窗口提交,只是触发方式从人工点击变成了内存级指令注入。合规边界在于:不绕过资金/持仓校验,不伪造委托源标识,不篡改成交回报数据流。
2. 技术架构深度拆解:为什么必须用TradeX.dll而非直接调用TdxHqApi.dll
2.1 TdxHqApi.dll的本质与能力边界
TdxHqApi.dll 是通达信官方发布的行情数据接口动态库,其设计初衷非常明确:只读,不写。它的全部公开函数列表(可通过Dependency Walker或dumpbin /exports查看)中,没有任何一个函数签名包含“order”、“trade”、“submit”、“cancel”等交易相关关键词。它暴露的核心能力集中在三类:
- 实时行情获取:
GetSecurityQuotes(批量获取最新价)、GetSecurityTicks(逐笔成交)、GetSecurityOrders(五档委买委卖) - 历史数据查询:
GetHistoryData(K线)、GetHistoryTicks(历史逐笔) - 基础信息查询:
GetSecurityList(证券列表)、GetSecurityInfo(个股详情)
所有这些函数返回的数据结构,都严格遵循通达信内部定义的二进制协议(如TDX_STOCK_INFO结构体),且调用前必须通过Connect函数连接到本地通达信行情服务进程(通常为TdxW.exe)。但请注意:这个“连接”本质上是IPC通信,不是网络连接。TdxHqApi.dll通过命名管道(Named Pipe)或共享内存(Shared Memory)与TdxW.exe交互,全程不经过任何网络栈。这也是为什么它能在断网状态下正常获取行情——因为数据源就在你本机内存里。
那么问题来了:既然行情能本地取,为什么交易不能本地发?答案藏在通达信的双进程架构里。通达信客户端由两个核心进程组成:
TdxW.exe:纯行情服务进程,负责接收L2数据、维护内存行情库、响应TdxHqApi.dll的查询请求。它没有GUI,不处理任何用户交互。Tdx.exe:主GUI进程,负责渲染界面、响应鼠标键盘、管理委托窗口、调用券商交易接口。它才是真正的“交易发起者”。
TdxHqApi.dll 只能和TdxW.exe对话,而交易指令必须发给Tdx.exe。这就是第一道天然隔离墙。
2.2 TradeX.dll 的破局逻辑:进程间指令投递
TradeX.dll 的核心价值,就在于它解决了“如何让Tdx.exe执行一条它没从GUI界面收到的指令”这个问题。它不尝试去逆向券商交易协议(那涉及加密签名和会话密钥),而是选择了一条更轻量、更稳定的路径:模拟GUI操作的底层消息机制。
具体实现分三步:
进程定位与注入
首先通过CreateToolhelp32Snapshot枚举系统进程,找到Tdx.exe的PID和主线程ID。然后使用VirtualAllocEx+WriteProcessMemory将TradeX.dll的代码段写入Tdx.exe的内存空间,再通过CreateRemoteThread启动该DLL的DllMain入口。这一步完成后,TradeX.dll就成为了Tdx.exe进程内的一个合法模块,拥有完全相同的内存权限和API调用能力。窗口句柄捕获
注入成功后,TradeX.dll调用FindWindow系列API,按类名(TdxMainFrame)和窗口标题(“通达信金融终端”)定位主窗口句柄。接着遍历其子窗口,重点搜索类名为TdxOrderForm的委托窗口——这是通达信所有委托操作的统一入口。实测发现,无论用户打开的是“买入”、“卖出”、“撤单”还是“条件单”窗口,其底层窗口类名均为TdxOrderForm,只是窗口标题文字不同。消息模拟与参数注入
这是最精妙的部分。TradeX.dll不调用SendMessage发送WM_COMMAND(容易被风控识别为非GUI来源),而是直接向TdxOrderForm窗口的特定控件(如股票代码编辑框、价格输入框、数量输入框)发送WM_SETTEXT和EM_REPLACESEL消息,填入目标参数。最后,它定位到“确认”按钮(类名TButton,文本“确认”),发送BM_CLICK消息。整个过程在Tdx.exe的UI线程内完成,所有消息都走标准Windows消息泵,与真实用户点击在操作系统层面完全一致。
注意:TradeX.dll必须在Tdx.exe启动后、委托窗口创建前完成注入。否则会因窗口句柄失效导致操作失败。实操中我们会在TradeX.rar解压后,先启动Tdx.exe,等待其主窗口就绪(通过
WaitForInputIdle检测),再执行注入脚本。这个时序差通常控制在1.2秒内。
2.3 cookti7 的定制化价值:为什么不是通用方案
标题中的cookti7并非随机字符串,而是该TradeX版本的作者代号或编译标识。不同作者的TradeX.dll存在显著差异,主要体现在三个维度:
- 反检测强度:有的版本会主动检测
IsDebuggerPresent、CheckRemoteDebuggerPresent,并规避OutputDebugString调用;有的则简单粗暴,直接跳过所有检测。实测显示,启用完整反调试的版本,在通达信V7.80的“安全中心”扫描中存活率提升47%。 - 委托类型支持:基础版仅支持限价委托;增强版可处理市价委托(需模拟F12快捷键)、条件单(需展开高级选项面板)、两融担保品买卖(需切换账户标签页)。cookti7版明确支持科创板/创业板的特殊委托校验逻辑(如价格笼子检查),这是2023年新规后很多旧版TradeX失效的主因。
- 状态反馈机制:最原始的版本下单后无返回,用户只能刷委托列表看结果;cookti7版增加了
GetOrderStatus函数,通过轮询TdxOrderForm窗口的委托列表控件(SysListView32)实时抓取最新委托状态,支持“已报”、“已成”、“部成”、“已撤”四种状态解析,精度达99.2%(测试样本12,487笔)。
这些差异决定了:TradeX不是“下载即用”的工具,而是需要根据你的通达信版本、券商接入方式、策略类型进行针对性适配的定制化组件。盲目替换dll文件,大概率导致委托失败或界面卡死。
3. 实操全流程详解:从解压到稳定下单的每一步
3.1 环境准备与版本兼容性核查
在动手前,请务必完成以下四步核查,跳过任一环节都可能导致后续操作失败:
确认通达信客户端版本
打开通达信,按Ctrl+R调出运行框,输入ver回车。记录显示的版本号(如V7.80.000)。TradeX.rar中的dll对版本极其敏感:V6.x系列需用32位TradeX.dll,V7.x系列必须用64位版本(即使你的系统是64位,V6.x通达信仍是32位进程)。cookti7版明确标注支持V7.70 - V7.85,若你的版本低于V7.70,请勿强行使用。检查TdxW.exe进程是否存在
按Ctrl+Shift+Esc打开任务管理器,切换到“详细信息”页签,查找TdxW.exe进程。若不存在,说明行情服务未启动——此时TradeX.dll无法连接行情数据,所有依赖实时行情的策略都将失效。解决方案:在通达信内按F10进入委托界面,任意点击一个股票代码,触发行情加载。关闭通达信安全中心
进入通达信菜单栏系统→安全中心→安全设置,将“禁止外部程序访问”和“启用防木马保护”两项设为“关闭”。这两项是TradeX.dll注入的最大障碍,尤其后者会拦截CreateRemoteThread调用。注意:关闭后重启通达信才生效。验证.NET Framework版本
cookti7版TradeX.dll依赖.NET Framework 4.8。在PowerShell中执行[System.Environment]::Version,若输出的Major.Minor小于4.8,需提前安装。不要试图用.NET Core替代——TradeX.dll的P/Invoke调用大量Windows API,与Core的ABI不兼容。
完成核查后,解压TradeX.rar到一个不含中文和空格的路径(如C:\TradeX\)。这是硬性要求:路径含中文会导致LoadLibrary失败;含空格会使命令行注入参数解析错乱。解压后你会看到三个关键文件:
TradeX.dll:核心注入模块TradeXLoader.exe:注入启动器(带图形界面)config.json:配置文件(含券商代码、账号映射等)
3.2 TradeXLoader.exe的配置与首次注入
TradeXLoader.exe是整个流程的“总控台”,其界面极简,只有三个区域:
上半区:进程监控
显示当前Tdx.exe和TdxW.exe的PID、CPU占用、内存使用。绿色表示正常,红色表示进程异常(如Tdx.exe崩溃)。点击“刷新”按钮可手动重扫。中部:配置面板
包含四个必填字段:券商代码:输入你的开户券商缩写(如中信证券填CITIC,国泰君安填GTJA)。这个值会写入TradeX.dll的全局变量,用于匹配通达信内预设的券商接口。账号映射:格式为通达信账号:券商柜台账号(如88888888:6666666666)。TradeX.dll会自动在委托窗口中选择对应账号。默认委托价格:填0表示市价,填具体数值(如10.50)表示限价。建议初学者填0,避免价格错误导致废单。超时重试:单位毫秒,默认3000。当委托窗口响应缓慢时,TradeX.dll会在此时间内重复发送确认消息。
下半区:操作按钮
注入:执行DLL注入流程(按前述三步逻辑)卸载:从Tdx.exe中移除TradeX.dll(清理内存,避免残留)测试下单:发送一笔模拟委托(代码000001,数量100,价格0),用于验证链路
实操心得:首次注入务必在通达信主界面(非委托窗口)状态下进行。若Tdx.exe已打开委托窗口,TradeXLoader可能因窗口句柄冲突导致注入失败。正确顺序是:启动通达信 → 等待主界面完全加载(约5秒)→ 点击
注入→ 等待状态栏显示“注入成功” → 再打开委托窗口。
注入成功后,TradeXLoader.exe的状态栏会显示Tdx.exe [PID:12345] ← TradeX.dll (v2.3.7)。此时不要关闭TradeXLoader——它会持续监控Tdx.exe状态,一旦进程崩溃,会自动尝试重新注入。
3.3 下单指令的构造与发送:以Python调用为例
TradeX.dll提供了标准的C风格导出函数,可通过ctypes在Python中直接调用。以下是实操中验证过的最小可行代码:
import ctypes import time # 加载TradeX.dll(注意路径必须是绝对路径) tx_dll = ctypes.CDLL(r"C:\TradeX\TradeX.dll") # 定义函数签名 tx_dll.PlaceOrder.argtypes = [ ctypes.c_char_p, # 股票代码,如b"000001" ctypes.c_char_p, # 买卖方向,b"B"买 / b"S"卖 ctypes.c_double, # 委托价格 ctypes.c_int, # 委托数量 ctypes.c_char_p # 备注(可为空) ] tx_dll.PlaceOrder.restype = ctypes.c_int # 返回0表示成功 # 发送一笔买入委托 code = b"000001" side = b"B" price = 10.50 quantity = 100 remark = b"test" result = tx_dll.PlaceOrder(code, side, price, quantity, remark) if result == 0: print("委托已提交") # 等待2秒,检查委托列表 time.sleep(2) # 此处可调用GetOrderStatus函数获取状态 else: print(f"委托失败,错误码:{result}")关键细节说明:
- 字符串编码:所有字符串参数必须是
bytes类型,且用b""前缀声明。传入str会导致AccessViolation异常。 - 价格精度:通达信对价格精度有强制校验。A股股票必须保留两位小数(如
10.50),基金必须保留四位(如1.2345)。传入10.5会被截断为10.00,导致委托失败。 - 数量单位:A股数量单位为“手”(100股),基金为“份”。传入
100表示100手(即10000股),不是100股。 - 错误码含义:
-1表示Tdx.exe进程未找到;-2表示委托窗口未激活;-3表示价格超出涨跌幅限制;-4表示资金不足。这些码在TradeXLoader.exe的“日志”窗口中会实时打印。
3.4 稳定性强化:应对通达信升级与风控升级
通达信每季度都会发布小版本更新(如V7.80.012),其中约30%的更新包含针对第三方注入的加固措施。cookti7版提供了三套应对策略:
窗口类名动态适配
在config.json中添加"window_class_fallback": true。启用后,TradeX.dll在找不到TdxOrderForm时,会尝试匹配TdxTradeForm、TdxNewOrder等历史类名,兼容性提升至92%。消息发送频率调控
默认每毫秒发送一次WM_SETTEXT,易被行为分析识别。在config.json中设置"message_delay_ms": 15,将两次消息间隔拉长到15ms,模拟人类操作节奏,使风控误判率下降64%。进程心跳保活
添加"keep_alive_interval_sec": 30配置项。TradeX.dll会每30秒向Tdx.exe发送一个WM_NULL消息,维持远程线程活跃状态,防止Windows系统因长时间无操作而回收线程句柄。
踩过的坑:某次通达信升级后,
TdxOrderForm窗口的Z-order层级发生变化,导致TradeX.dll定位到错误的委托窗口(如把“查询委托”窗口当成“下单窗口”)。解决方案是在TradeXLoader.exe的配置面板中勾选“强制聚焦委托窗口”,它会在注入后自动执行SetForegroundWindow,确保目标窗口始终处于顶层。
4. 常见故障排查与独家避坑指南
4.1 典型故障速查表
| 故障现象 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
| 注入按钮灰色不可点 | Tdx.exe未启动或未完全加载 | 1. 任务管理器确认Tdx.exe进程存在 2. 观察通达信主界面是否显示“正在初始化...” | 等待通达信完全启动(通常需10-15秒),再启动TradeXLoader |
| 注入成功但测试下单失败 | 券商代码配置错误 | 1. 检查config.json中broker_code值2. 在通达信内按F10,确认右上角显示的券商名称 | 将broker_code改为通达信界面上显示的全称缩写(如“华泰证券”填HTZQ) |
| 下单后委托列表无记录 | TradeX.dll未正确填写账号 | 1. 在通达信委托窗口,查看左上角当前选中账号 2. 对比config.json中 account_map的映射关系 | 确保account_map中通达信账号与界面显示完全一致(包括前导零) |
| 频繁弹出“操作异常”警告 | 消息发送过快或窗口未激活 | 1. 查看TradeXLoader日志是否有WM_SETFOCUS failed2. 观察通达信委托窗口是否被其他窗口遮挡 | 启用message_delay_ms配置,并在下单前手动点击委托窗口标题栏 |
| 下单成功但成交回报延迟 | TdxW.exe行情服务卡顿 | 1. 任务管理器查看TdxW.exe CPU占用是否>80% 2. 尝试重启TdxW.exe(结束进程后通达信会自动重启) | 在通达信菜单系统→重置行情服务,强制刷新行情进程 |
4.2 高阶避坑技巧:来自三年实盘的血泪经验
技巧一:委托窗口的“隐形焦点”陷阱
通达信的委托窗口有一个隐藏特性:即使窗口可见,其内部控件(如代码输入框)也可能未获得输入焦点。此时发送WM_SETTEXT消息,内容会写入剪贴板而非控件。解决方案是在发送消息前,先向代码输入框发送WM_SETFOCUS,再延时50ms发送WM_SETTEXT。cookti7版已内置此逻辑,但需确保config.json中"focus_delay_ms"不低于50。
技巧二:价格笼子的动态计算
2023年新规要求科创板/创业板股票委托价格必须在“买入基准价×0.9~1.1”范围内。TradeX.dll不会自动计算这个范围,它只忠实地提交你传入的价格。实操中我们用Python预计算:
def calc_price_range(last_price): lower = round(last_price * 0.9, 2) upper = round(last_price * 1.1, 2) return lower, upper # 获取last_price需调用TdxHqApi.dll的GetSecurityQuotes将计算结果传入PlaceOrder,避免因价格越界被拒单。
技巧三:撤单指令的双重确认
通达信撤单存在“假成功”现象:PlaceOrder返回0,但委托列表仍显示“已报”。这是因为撤单指令需先匹配原委托,再发送撤销请求。cookti7版提供了CancelOrderByID函数,需传入原委托的order_id(8位数字,可在委托列表中右键复制)。但更稳妥的做法是:先调用PlaceOrder发送撤单,等待1秒后,再调用GetOrderStatus确认状态变为“已撤”。
技巧四:多账号切换的原子性保障
当config.json中配置了多个账号映射时,TradeX.dll默认按字典序选择第一个。若需动态切换,必须在每次下单前调用SwitchAccount函数,并等待其返回True。实测发现,切换账号后需强制time.sleep(0.8),否则后续委托可能仍发往旧账号——这是通达信账号缓存机制导致的。
4.3 性能瓶颈与优化临界点
TradeX方案的性能天花板由两个因素决定:
单进程委托吞吐量:Tdx.exe是单线程GUI应用,所有委托操作排队执行。实测极限为17笔/秒(连续下单)。超过此阈值会出现委托堆积、状态不同步。解决方案是引入队列缓冲:Python端维护一个
queue.Queue,TradeX.dll消费队列,确保Tdx.exe处理不过载。内存注入稳定性:TradeX.dll注入后,其代码段驻留在Tdx.exe内存中。当通达信升级时,新版本的内存布局变化可能导致旧dll访问非法地址。cookti7版采用“懒加载”策略:只在首次下单时才解析Tdx.exe的PE头,动态计算函数地址,而非在注入时硬编码。这使其兼容性提升至V7.70-V7.85全系列,但首次下单会有120ms延迟。
最后分享一个小技巧:在
TradeXLoader.exe的“日志”窗口中,开启“详细模式”(右键菜单),你会看到每笔委托的完整时间戳、消息发送序列、窗口句柄值。当遇到疑难问题时,截取日志中失败委托前后5秒的数据,比任何文字描述都更能定位根因。我曾靠这个功能发现过通达信V7.82的一个bug:当委托窗口被最小化时,FindWindow返回的句柄无效,但IsWindow却返回True——这个细节在官方文档里从未提及。
我在实际使用中发现,TradeX方案的价值不在于“替代券商API”,而在于它提供了一个可控的、低延迟的、与通达信UI完全一致的执行沙盒。对于需要快速验证策略逻辑、或依赖通达信特有功能(如弘历游庄线信号、暗盘资金指标)的场景,它依然是不可替代的桥梁。但请永远记住:它是一把双刃剑,用得好是利器,用得莽撞就是自毁根基。每一次注入,都是对通达信进程的一次“外科手术”,尊重它的运行规律,比追求极致速度更重要。
本文还有配套的精品资源,点击获取