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.mzph.cn/news/747485.shtml

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

相关文章

2023年全球软件质量效能大会(QECon上海站):智慧碰撞,质量与效能的新篇章(附大会核心PPT资料下载)

在数字化浪潮席卷全球的今天&#xff0c;软件行业正以前所未有的速度发展。作为推动这一进程的重要力量&#xff0c;软件质量与效能的提升显得尤为关键。2023年全球软件质量&效能大会&#xff08;QECon上海站&#xff09;的盛大召开&#xff0c;无疑为业界提供了一次难得的…

【b站咸虾米】2 Vue基础(上) 2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例

课程地址&#xff1a;【2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例】 https://www.bilibili.com/video/BV1pz4y1S7bC/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2 Vue基础 上 2.0 补充知识 2.0.1 Vue实例的作用范围 2.0.2 t…

50、东北大学、阿尔伯塔大学:Hi-GCN从2个层次角度进行图学习,用来诊断脑部疾病[你这和MVS-GCN套娃呢?]

本文由东北大学医学图像智能计算教育部重点实验室&#xff0c;加拿大阿尔伯塔大学于2020年10.24日发表于<Computers in Biology and Medicine> JCR\IF: Q1\7.7 Abstract&#xff1a; 目的:近年来&#xff0c;脑连接网络已被用于神经系统疾病的分类&#xff0c;如自闭症…

【论文翻译】UP-DETR—Unsupervised Pre-training for Detection Transformers

0.论文摘要 摘要——通过Transformer model编码器——解码器架构&#xff0c;用于目标检测的检测Transformer model&#xff08;DETR&#xff09;达到了与Faster R-CNN相比具有竞争力的性能。然而&#xff0c;使用scratch transformers训练&#xff0c;DETR需要大规模的训练数…

【docker】docker的常用命令

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;中间件 ⛺️稳中求进&#xff0c;晒太阳 常规命令 docker version #查看docker 版本信息docker info #显示docker 的系统信息&#xff0c;包括镜像和容器数量docker --help #查看所有的命…

如何发布新闻稿?如何让媒体记者报道自己的企业?

目前&#xff0c;很多企业和个人创业者都知道用新闻稿或软文来做宣传&#xff0c;但是一般只可以发布到自己的微信公众号、百家号等自媒体平台&#xff0c;往往收效甚微。有企业找到小马识途营销顾问咨询原因&#xff0c;小马识途营销顾问分析自媒体上发软文效果不明显的原因主…

【超图】SuperMap如何使知识图谱与BIM数据的绑定

作者&#xff1a;taco 近两年知识图谱的概念突然大火了起来&#xff0c;随之而来的就是用户的各种需求&#xff0c;你们的知识图谱能干什么呢&#xff1f;知识图谱有哪些应用呢&#xff1f;在结合客户的一些需求&#xff0c;以及自身的一些想法&#xff0c;写下这篇文章。 一、…

MySQL的insert-on-duplicate语句详解

一、insert-on-duplicate语句语法 注意&#xff1a;ON DUPLICATE KEY UPDATE只是 MySQL的特有语法&#xff0c;并不是SQL标准语法&#xff01; INSERT INTO … ON DUPLICATE KEY UPDATE 是 MySQL 中一种用于插入数据并处理重复键冲突的语法。 这个语法适用于在 insert的时候…

抖音直播招聘的主要优势有哪些?

触达广泛受众抖音拥有海量活跃用户,通过直播可以瞬间吸引大量观众关注。相比传统招聘渠道,抖音直播能够触达到更广泛、更多样化的人才群体。 提升品牌形象在直播中,企业可以展现自身独特的企业文化和价值观,增强与观众的互动交流,有助于提升品牌形象和美誉度。 精准招聘定位企业…

Java项目:53 springboot校园管理系统的设计与实现014

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 1、关于校园管理系统的基本要求&#xff1a; &#xff08;1&#xff09;功能要求&#xff1a;可以管理首页、个人中心、院校管理、用户管理、单位类别…

Spirngboot中文乱码解决方案

在使用springboot的时候,如果我们直接在控制器里面返回中文, 则默认可能会是乱码,因为默认的编码是ISO8859-1, 要解决这个问题, 就需要我们通过重写springboot里面的configureMessageConverters方法来将默认的编码设置为utf-8即可解决, 当然你的类文件编码也必须要是utf-8的, …

leetcode-打家劫舍专题系列(动态规划)

198.打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…

724.寻找数组的中心下标

题目&#xff1a;给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不…

SpringBoot(容器功能)

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

Regex正则表达式 --java学习笔记

正则表达式 由一些特定字符组成&#xff0c;代表的是一个规则作用一&#xff1a;校验数据格式是否合法作用二&#xff1a;在一段文本中查找满足要求的内容 String提供了一个匹配正则表达式的方法 public boolean matches&#xff08;String regex&#xff08;正则表达式&…

Delft3D建模、水动力模拟方法及在地表水环境影响评价中的技术应用

​任博士&#xff0c;长期从事地表水数值模拟研究与实践工作&#xff0c;具有资深的技术底蕴和专业背景。 1、掌握Delft3D的建模流程&#xff0c;包括基础数据的准备、计算网格的制作、模型的调试与率定、计算结果的处理等&#xff0c;熟悉软件的基本操作。 2、熟悉Delft3D网…

18个惊艳的可视化大屏(第24辑):通讯行业的应用

实时监控&#xff1a; 可视化大屏可以实时监控通讯网络的运行状态和性能指标。通过可视化展示网络的拓扑结构、设备状态、带宽利用率、延迟等数据&#xff0c;运维人员可以及时发现和解决网络故障&#xff0c;保障通讯网络的稳定性和可靠性。 故障诊断与分析&#xff1a; 可视…

YOLOv8 | 有效涨点,添加GAM注意力机制,使用Wise-IoU有效提升目标检测效果(附报错解决技巧,全网独家)

目录 摘要 基本原理 通道注意力机制 空间注意力机制 GAM代码实现 Wise-IoU WIoU代码实现 yaml文件编写 完整代码分享&#xff08;含多种注意力机制&#xff09; 摘要 人们已经研究了各种注意力机制来提高各种计算机视觉任务的性能。然而&#xff0c;现有方法忽视了…

C语言例3-20:使用逻辑运算符的例子

代码如下&#xff1a; #include<stdio.h> int main(void) {int x3, y100;float f11.0f, f22.1f;char cd; //d(100)printf("!x 的值为&#xff1a; %d\n",!x); //0printf("x||y 的值为&#xff1a; %d\n",x||y); //1print…

ai怎么制作ppt?保姆级的ai一键生成ppt教程来了!

面对市面上多如牛毛的 ai 生成 ppt 软件&#xff0c;哪一款更适合日常使用呢&#xff1f;与此同时&#xff0c;在选定一款 ai 软件后&#xff0c;如何用 ai 制作 ppt&#xff0c;也是很多人第一次使用 pptai 工具会面临的具体问题。 就着这些问题&#xff0c;在接下来的文章中…