CTP-API开发系列之十:v6.7.0-Python版封装(Windows/Linux)(附源码)

CTP-API开发系列之十:v6.7.0-Python版封装(Windows/Linux)(附源码)

  • CTP-API开发系列之十:v6.7.0-Python版封装(Windows/Linux)(附源码)
    • 资源获取
    • 准备工作
    • Windows 系统下封装
    • Linux 系统下封装
    • td_md_quant_demo.py

CTP-API开发系列之十:v6.7.0-Python版封装(Windows/Linux)(附源码)

在最开始的文章中,我们对v6.7.0版本进行了抓包分析,该版本及之后的版本使用了Lz4压缩算法,查询流量压缩效果显著,网络传输流量大大降低,所以推荐使用v6.7.0及之后的版本。

本次分享将采用Swig工具(Swig是一种软件开发工具,可将用 C 和 C++ 编写的程序与各种高级编程语言连接起来),将C++语言版本的 CTP-API 封装成 Python版本,Windows/Linux系统下分别进行封装。

最后附整个封装过程的工程项目文件,后续官网发布新版本可以自行进行封装,提供给不同需求的朋友使用。

资源获取

期货CTP-API-v6.7.0-Python版封装(Windows/Linux)(交易+行情)

准备工作

1.下载CTP-API v6.7.0版本文件

地址:http://www.sfit.com.cn/DocumentDown/api_3/5_2_2/v6.7.0_traderapi_20230209.zip

2.安装 Swig 工具

地址:https://www.swig.org/download.html

3.安装 Python 或者 Anaconda

Windows 系统下封装

1.解压 v6.7.0_traderapi_20230209.zip 文件(我这里是使用的x64版本)

cd v6.7.2_traderapi_20230913\v6.7.2_20230913_winApi\traderapi\20230913_traderapi64_se_windows

在这里插入图片描述
2.新建 thosttraderapi.i 文件,内容如下:

%module(directors="1") thosttraderapi                                                                                                                                                                                                              
%{ 
#include "ThostFtdcTraderApi.h"
#include <codecvt>
#include <locale>
#include <vector>
#include <string>
using namespace std;
#ifdef _MSC_VER
const static locale g_loc("zh-CN");
#else    
const static locale g_loc("zh_CN.GB18030");
#endif
%}%typemap(out) char[ANY], char[] {const std::string &gb2312($1);std::vector<wchar_t> wstr(gb2312.size());wchar_t* wstrEnd = nullptr;const char* gbEnd = nullptr;mbstate_t state = {}; int res = use_facet<codecvt<wchar_t, char, mbstate_t> >(g_loc).in(state,gb2312.data(), gb2312.data() + gb2312.size(), gbEnd,wstr.data(), wstr.data() + wstr.size(), wstrEnd);if (codecvt_base::ok == res){wstring_convert<codecvt_utf8<wchar_t>> cutf8;std::string result = cutf8.to_bytes(wstring(wstr.data(), wstrEnd));       resultobj = SWIG_FromCharPtrAndSize(result.c_str(), result.size()); }else{std::string result;resultobj = SWIG_FromCharPtrAndSize(result.c_str(), result.size()); }
}
%feature("director") CThostFtdcTraderSpi; 
%ignore THOST_FTDC_VTC_BankBankToFuture;
%ignore THOST_FTDC_VTC_BankFutureToBank;
%ignore THOST_FTDC_VTC_FutureBankToFuture;
%ignore THOST_FTDC_VTC_FutureFutureToBank;
%ignore THOST_FTDC_FTC_BankLaunchBankToBroker;
%ignore THOST_FTDC_FTC_BrokerLaunchBankToBroker;
%ignore THOST_FTDC_FTC_BankLaunchBrokerToBank;
%ignore THOST_FTDC_FTC_BrokerLaunchBrokerToBank;  
%feature("director") CThostFtdcTraderSpi; 
%include "ThostFtdcUserApiDataType.h"
%include "ThostFtdcUserApiStruct.h" 
%include "ThostFtdcTraderApi.h

3.新建 thostmduserapi.i 文件,内容如下:

%module(directors="1") thostmduserapi
%{ 
#include "ThostFtdcMdApi.h"
#include <codecvt>
#include <locale>
#include <vector>
#include <string>
using namespace std;
#ifdef _MSC_VER
const static locale g_loc("zh-CN");
#else    
const static locale g_loc("zh_CN.GB18030");
#endif
%}%typemap(out) char[ANY], char[] {const std::string &gb2312($1);std::vector<wchar_t> wstr(gb2312.size());wchar_t* wstrEnd = nullptr;const char* gbEnd = nullptr;mbstate_t state = {};int res = use_facet<codecvt<wchar_t, char, mbstate_t> >(g_loc).in(state,gb2312.data(), gb2312.data() + gb2312.size(), gbEnd,wstr.data(), wstr.data() + wstr.size(), wstrEnd);if (codecvt_base::ok == res){wstring_convert<codecvt_utf8<wchar_t>> cutf8;std::string result = cutf8.to_bytes(wstring(wstr.data(), wstrEnd));       resultobj = SWIG_FromCharPtrAndSize(result.c_str(), result.size()); }else{std::string result;resultobj = SWIG_FromCharPtrAndSize(result.c_str(), result.size()); }
}%typemap(in) char *[] {/* Check if is a list */if (PyList_Check($input)) {int size = PyList_Size($input);int i = 0;$1 = (char **) malloc((size+1)*sizeof(char *));for (i = 0; i < size; i++) {PyObject *o = PyList_GetItem($input, i);if (PyString_Check(o)) {$1[i] = PyString_AsString(PyList_GetItem($input, i));} else {free($1);PyErr_SetString(PyExc_TypeError, "list must contain strings");SWIG_fail;}}$1[i] = 0;} else {PyErr_SetString(PyExc_TypeError, "not a list");SWIG_fail;}
}// This cleans up the char ** array we malloc'd before the function call
%typemap(freearg) char ** {free((char *) $1);
}
%feature("director") CThostFtdcMdSpi;
%ignore THOST_FTDC_VTC_BankBankToFuture;
%ignore THOST_FTDC_VTC_BankFutureToBank;
%ignore THOST_FTDC_VTC_FutureBankToFuture;
%ignore THOST_FTDC_VTC_FutureFutureToBank;
%ignore THOST_FTDC_FTC_BankLaunchBankToBroker;
%ignore THOST_FTDC_FTC_BrokerLaunchBankToBroker;
%ignore THOST_FTDC_FTC_BankLaunchBrokerToBank;
%ignore THOST_FTDC_FTC_BrokerLaunchBrokerToBank;%include "ThostFtdcUserApiDataType.h"
%include "ThostFtdcUserApiStruct.h"
%include "ThostFtdcMdApi.h"

4.cmd 进入该路径,分别运行以下命令:

swig -threads -py3 -c++ -python thosttraderapi.i
swig -threads -py3 -c++ -python thostmduserapi.i

5.此时会新增以下文件:
在这里插入图片描述
6.新建两个vs动态库项目 _thosttraderapi 和 _thostmduserapi(项目最后会打包提供),每个项目添加如下文件,我本地安装的是Visual Studio 2022:
在这里插入图片描述
7.两个项目都需要将python安装路径的头文件和lib库文件路径添加上,我本地安装的是Anaconda3:

附加包含目录:D:\software\Anaconda3\include;
附加库目录:D:\software\Anaconda3\libs;
附加项(_thostmduserapi项目):python37.lib;thostmduserapi_se.lib;
附加项(_thosttraderapi项目):python37.lib;thosttraderapi_se.lib;

8.编译两个项目,会生成 _thosttraderapi.dll 和 _thostmduserapi.dll 两个动态库,分别复制一份,将.dll改成.pyd

9.以下6个文件,就是我们最终封装好的Python版CTP-API(最后会打包提供)
在这里插入图片描述

Linux 系统下封装

1.解压 v6.7.0_traderapi_20230209.zip 文件,进入 v6.7.0_20230209_api_traderapi_se_linux64 目录
在这里插入图片描述

2.新建 thosttraderapi.i 文件 和 thostmduserapi.i 文件(内容同Windows)
3.安装swig,并执行以下命令:

yum install swig
swig -threads -py3 -c++ -python thosttraderapi.i
swig -threads -py3 -c++ -python thostmduserapi.i

4.新建 make_traderapi 文件,内容如下(需要指定自己的python路径,我的是/usr/include/python3.6m):

OBJS=thosttraderapi_wrap.o
INCLUDE=-I./ -I/usr/include/python3.6mTARGET=_thosttraderapi.so
CPPFLAG=-shared -fPIC
CC=g++
LDLIB=-L. -lthosttraderapi_se
$(TARGET) : $(OBJS)$(CC) $(CPPFLAG) $(INCLUDE) -o $(TARGET) $(OBJS) $(LDLIB)
$(OBJS) : %.o : %.cxx$(CC) -c -fPIC $(INCLUDE) $< -o $@
clean:-rm -f $(OBJS)-rm -f $(TARGET)

5.新建 make_mduserapi 文件,内容如下(需要指定自己的python路径,我的是/usr/include/python3.6m):

OBJS=thostmduserapi_wrap.o
INCLUDE=-I./ -I/usr/include/python3.6mTARGET=_thostmduserapi.so
CPPFLAG=-shared -fPIC
CC=g++
LDLIB=-L. -lthostmduserapi_se
$(TARGET) : $(OBJS)$(CC) $(CPPFLAG) $(INCLUDE) -o $(TARGET) $(OBJS) $(LDLIB)
$(OBJS) : %.o : %.cxx$(CC) -c -fPIC $(INCLUDE) $< -o $@
clean:-rm -f $(OBJS)-rm -f $(TARGET)

6.执行两个make文件:

mv thosttraderapi_se.so libthosttraderapi_se.so
mv thostmduserapi_se.so libthostmduserapi_se.so
make -f make_traderapi 
make -f make_mduserapi 

7.以下6个文件(4个.so文件和两个.py文件),就是我们最终封装好的Python版CTP-API(最后会打包提供)
在这里插入图片描述

td_md_quant_demo.py

这是一个测试demo,代码在前面的章节已经分享过,这里就不粘贴了。
资源获取:期货CTP-API-v6.7.0-Python版封装(Windows/Linux)(交易+行情)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/541632.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型应用开发-虚拟人对话网页-AI脾气这么大?

简介 本案例通过python编程调用智谱的大模型接口,以及很简单的prompt设计,实现了用大语言模型模拟一个人物来和我们对话,前端HTML代码是用大语言模型生成的(原因:我根本不会写前端啊~~),本教程适合所有对大模型应用开发感兴趣的初学者,这是个非常有趣的案例。 读完本…

MongoDB性能最佳实践:硬件和操作系统配置

欢迎阅读有关MongoDB性能最佳实践的系列博文。在往期文章中&#xff0c;我们已经讨论过查询模式和性能分析、事务和读/写关注等实现大规模性能的关键考虑因素。在本篇文章中&#xff0c;我们将讨论硬件和操作系统配置。 如果您在阿里云上部署MongoDB&#xff0c;那么阿里云会为…

SpringBoot(容器功能)

文章目录 1.Configuration 添加/注入bean1.注入bean1.编写一个JavaBean&#xff0c;Monster.java2.创建一个config文件夹&#xff08;名字任意&#xff09;&#xff0c;用于存放配置Bean的类&#xff08;相当于配置文件&#xff09;3.BeanConfig.java4.测试使用 MainApp.java2.…

PTA题解 --- N个数求和(C语言)

今天是PTA题库解法讲解的第二天&#xff0c;今天我们要讲解N个数求和&#xff0c;题目如下&#xff1a; 要解决这个问题&#xff0c;我们可以用C语言编写一个程序来处理和简化分数。程序的基本思路如下&#xff1a; 1. 定义一个函数来计算两个数的最大公约数&#xff08;GCD&a…

图论:DFS与BFS

目录 1.DFS&#xff08;图论&#xff09; 1.1.DFS过程 1.2.应用 2.BFS&#xff08;图论&#xff09; 2.1.BFS过程 2.2.应用 2.3.双端队列BFS 实现 2.4.优先队列BFS&#xff08;堆优化 Dijkstra算法&#xff09; 1.DFS&#xff08;图论&#xff09; DFS全称是&#xff…

0基础安装Burpsuit专业版

首先先安装java环境,安装jdk 11的版本 文件中2023版的可以直接点开使用不需要复杂的操作的步骤 资源获取链接&#xff1a; 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;k2qq 其中&#xff1a;1号文件是bp的英文版激活包&#xff0c;-2号是中文版汉化版的激活包…

鸿蒙开发实战:【音频组件】

简介 音频组件用于实现音频相关的功能&#xff0c;包括音频播放&#xff0c;录制&#xff0c;音量管理和设备管理。 图 1 音频组件架构图 基本概念 采样 采样是指将连续时域上的模拟信号按照一定的时间间隔采样&#xff0c;获取到离散时域上离散信号的过程。 采样率 采样…

FreeRTOS学习第10篇--队列使用示例

FreeRTOS学习第10篇–队列使用示例 本文目标&#xff1a;FreeRTOS学习第10篇–队列使用示例 按照本文的描述&#xff0c;可以进行简单的使用队列。 本文实验条件&#xff1a;拥有C语言基础&#xff0c;装有编译和集成的开发环境&#xff0c;比如&#xff1a;Keil uVision5 …

KKView远程控制: todesk内网穿透

Todesk内网穿透&#xff1a;实现远程访问的新途径 在数字化时代&#xff0c;远程访问已成为许多企业和个人的基本需求。Todesk作为一款远程桌面控制软件&#xff0c;其内网穿透功能为用户提供了便捷、安全的远程访问体验。本文将介绍Todesk内网穿透的原理、应用场景及其优势&a…

【机器学习】走进监督学习:构建智能预测模型的第一步

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

2024年【天津市安全员C证】考试内容及天津市安全员C证考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证考试内容是安全生产模拟考试一点通生成的&#xff0c;天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2024年【天津市安全员C证】考试内容及天津市…

开发反应式API

开发反应式API 开发反应式API1 使用SpringWebFlux1.1 Spring WebFlux 简介1.2 编写反应式控制器 2 定义函数式请求处理器3 测试反应式控制器3.1 测试 GET 请求3.2 测试 POST 请求3.3 使用实时服务器进行测试 4 反应式消费RESTAPI4.1 获取资源4.2 发送资源4.3 删除资源4.4 处理错…