第二章:开发环境搭建——Windows/Linux下C++编译环境配置、Python封装层(pyCTP)安装、网络延迟测试工具准备

说实话,很多做量化交易的朋友,一开始都栽在环境搭建上。

我记得有个学员,C++代码写得挺溜,结果在Windows下折腾CTP接口编译,搞了整整三天没跑通。最后发现是字符集没选对——多冤枉啊。

所以这一章,咱们把环境一次性搭好。你跟着我的步骤走,别跳步,半小时内搞定。

2.1 Windows下的C++编译环境配置

做CTP开发,Windows是主流。毕竟交易终端、行情软件大多跑在Windows上。

我个人习惯用Visual Studio 2022。为什么?因为CTP官方给的示例代码就是VS工程,你直接用最省事。

2.1.1 安装Visual Studio 2022

  1. 去官网下载Visual Studio 2022 Community版(免费,个人够用)
  2. 安装时勾选「使用C++的桌面开发」工作负载
  3. 右侧「单个组件」里,确保勾选「Windows 10 SDK」和「C++ MFC for latest v143 build tools」
  4. 安装路径别改,默认C盘就行。我试过改D盘,后面有些库路径会出问题
注意:CTP接口目前只支持x86(32位)编译。VS里一定要把解决方案平台设为x86,别用x64。我曾经帮一个朋友排查问题,他编译了64位的dll,结果CTP交易前置连不上——折腾了两小时才发现。

2.1.2 配置CTP头文件和库路径

下载CTP接口包后,你会看到这样的目录结构:

CTP_API/
├── include/
│   ├── ThostFtdcMdApi.h
│   ├── ThostFtdcTraderApi.h
│   └── ThostFtdcUserApiDataType.h
├── lib/
│   ├── thostmduserapi.lib
│   └── thosttraderapi.lib
└── dll/
    ├── thostmduserapi.dll
    └── thosttraderapi.dll

在VS里这样配:

  1. 项目属性 → C/C++ → 常规 → 附加包含目录:添加include路径
  2. 链接器 → 常规 → 附加库目录:添加lib路径
  3. 链接器 → 输入 → 附加依赖项:写入thostmduserapi.lib;thosttraderapi.lib
  4. 把两个dll文件复制到你的exe输出目录(或者系统PATH里)
小技巧:我习惯在项目属性里把「字符集」设为「使用多字节字符集」。CTP接口内部用的是GBK编码,如果你用Unicode,字符串转换会出各种诡异问题。

2.2 Linux下的C++编译环境配置

Linux环境做CTP开发,通常是为了部署在服务器上。毕竟Linux的稳定性比Windows强不少。

我自己的生产环境就是CentOS 7,跑了两年多没重启过。

2.2.1 安装编译工具链

# CentOS/RHEL
sudo yum install -y gcc gcc-c++ make cmake

# Ubuntu/Debian
sudo apt-get install -y build-essential cmake

注意:CTP接口在Linux下也是32位的。你需要安装32位兼容库:

# CentOS
sudo yum install -y glibc-devel.i686 libstdc++-devel.i686

# Ubuntu
sudo apt-get install -y g++-multilib libc6-dev-i386

2.2.2 编写CMakeLists.txt

我个人喜欢用CMake管理项目,跨平台方便。给你一个我常用的模板:

cmake_minimum_required(VERSION 3.10)
project(CTPDemo)

set(CMAKE_CXX_STANDARD 11)

# 32位编译
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")

# CTP头文件
include_directories(/path/to/CTP_API/include)

# CTP库文件
link_directories(/path/to/CTP_API/lib)

add_executable(ctp_demo main.cpp)

target_link_libraries(ctp_demo
    thostmduserapi
    thosttraderapi
    pthread
    dl
)
踩坑提醒:Linux下CTP的lib文件是.so结尾的。但上交所的CTP版本和郑商所的版本,库文件名可能不一样。我曾经遇到过把上交所的lib链接到郑商所的程序里,编译通过,运行时直接段错误。所以一定要核对版本号。

2.3 Python封装层(pyCTP)安装

说实话,用C++写CTP接口,开发效率确实低。我后来大部分策略都用Python写,C++只做底层封装。

pyCTP是目前用得最多的Python封装库。它把CTP的C++接口用pybind11包装了一层,让你能在Python里直接调用。

2.3.1 安装pyCTP

# 推荐用pip安装
pip install pyctp

# 如果安装失败,试试指定版本
pip install pyctp==6.6.1

安装成功后,验证一下:

import pyctp
print(pyctp.__version__)

# 创建行情API实例
md_api = pyctp.CThostFtdcMdApi()
print("pyCTP安装成功!")

2.3.2 常见安装问题

错误信息 原因 解决方案
ImportError: DLL load failed 缺少VC++运行库 安装Visual C++ Redistributable 2015-2022
找不到指定的模块 CTP的dll文件不在PATH中 把thostmduserapi.dll和thosttraderapi.dll复制到Python目录
OSError: [WinError 193] %1 不是有效的Win32应用程序 Python是64位,但CTP是32位 安装32位版本的Python 3.8或3.9
我的建议:用Python 3.8 32位版本。我试过3.10、3.11,有些pyCTP版本兼容性不好。3.8是最稳的。

2.4 网络延迟测试工具准备

做高频交易,网络延迟是命根子。你想想看,如果比别人慢1毫秒,遇到行情剧烈波动,可能一单就亏几十万。

所以我每次部署新环境,第一件事就是测网络延迟。

2.4.1 使用ping测试基础延迟

# Windows
ping -n 100 你的交易前置IP

# Linux
ping -c 100 你的交易前置IP

看平均延迟和丢包率。如果平均延迟超过5ms,或者有丢包,赶紧找网络管理员。

2.4.2 使用hping3测试TCP延迟

ping用的是ICMP协议,有些网络设备会优先处理ICMP,导致测出来的延迟比实际TCP延迟低。我更喜欢用hping3:

# Linux安装
sudo apt-get install hping3

# 测试TCP SYN延迟
hping3 -S -p 端口号 -c 100 你的交易前置IP

2.4.3 自己写一个延迟测试工具

说实话,ping和hping测的都是网络层延迟。但CTP交易是应用层协议,中间还有序列化、反序列化的开销。

我习惯自己写一个简单的测试工具:

# Python示例:测试CTP登录延迟
import pyctp
import time

class DelayTest:
    def __init__(self):
        self.start_time = 0
        
    def OnFrontConnected(self):
        # 记录连接时间
        self.start_time = time.perf_counter()
        
    def OnRspUserLogin(self, pRspUserLogin, pRspInfo, nRequestID, bIsLast):
        if pRspInfo.ErrorID == 0:
            end_time = time.perf_counter()
            delay = (end_time - self.start_time) * 1000
            print(f"登录延迟: {delay:.2f} ms")

# 运行100次,取平均值
test = DelayTest()
# ... 初始化API并登录 ...
经验之谈:我测过不同期货公司的交易前置延迟。同一家公司的不同机房,延迟能差10倍。所以有条件的话,尽量把服务器托管到交易所机房旁边。我有个朋友把服务器放在上海张江,做螺纹钢高频,延迟稳定在0.3ms以内。

2.5 本章知识体系总览

说了这么多,咱们用一张图把整个环境搭建的脉络理清楚:

开发环境搭建知识体系 Windows C++环境 • Visual Studio 2022安装 • 工作负载:C++桌面开发 • 平台:x86(32位) • 字符集:多字节 • 头文件路径配置 • 库文件路径配置 • DLL部署到输出目录 Linux C++环境 • gcc/g++安装 • cmake安装 • 32位兼容库安装 • CMakeLists.txt编写 • -m32编译标志 • .so库链接 • 版本号核对 Python封装层 • pip install pyctp • Python 3.8 32位推荐 • VC++运行库安装 • DLL路径配置 • 导入验证测试 • 常见错误排查

这张图把咱们这章的内容串起来了。左边是Windows环境,中间是Linux环境,右边是Python封装层。三者最终都要服务于同一个目标:让CTP接口在你的机器上跑起来。

核心要点:环境搭建没有捷径。每一步都做扎实了,后面写代码才能顺风顺水。我见过太多人,环境没搭好就急着写策略,结果出了问题不知道是代码的锅还是环境的锅,排查起来痛苦得要命。

好了,环境搭好了,工具也准备好了。下一章咱们就开始真正写代码,从CTP初始化到登录认证,一步步来。


公众号:蓝海资料掘金营,微信deep3321