##1. 引言##

目前项目使用了开源的vnpy框架来做量化交易(python版), 但是公司采购的wind历史数据TDBAPI没有python版(只有C++版,JAVA版,C#版,matlab版)。有两种想法:1) 把C++版的封装成python版; 2)把JAVA版封装成WEB API版。 基于项目进度和对技术的熟悉程度,目前采用第二种,即把wind原生的TDBAPI(JAVA版)封装成WEB API,无需考虑客户端的语言问题(当然在该项目中是用python调用)

##2. 开发环境## JDK: jdk-8u131-windows-x64; java version "1.8.0_131", 64bit IDE: IntelliJ idea 2017.1.3
Spring Boot

##3. 开发过程##

###3.1 创建项目###

在IntelliJ idea中创建初始项目,具体过程参照Gaussic的博客,其中由于本项目不需要数据库,因此只选择了Web,没有选择JPA和H2。另外需要新建lib文件夹,原因看下文。项目结构如下所示:

###3.2 导入jar包和dll文件###

下图是Wind api 提供的jar包,64bit 的dll文件夹(服务器64bit,也可以按需选32bit 的):

封装成web api 需要内容: tdbapi.jar, x64文件夹里面的2个dll,lib文件(dll是必须的,lib不太清楚)

下面就是如何在spring boot 里面导入本地的tadbapi.jar和需要再运行时获取的dll文件。在开发环境IntelliJ里面导入是很简单的。 1) 导入jar包: ctrl + alt + shift + s 打开 “project structure” 在 “Modules” 直接点 “+” 导入jar包。(可参照http://jingyan.baidu.com/article/fec7a1e5f79e2b1191b4e74f.html)

2) 运行时调用dll: 这就更简单了,直接在项目根目录里面添加就可以了。

以上做法在IntelliJ里面可以正常使用,但是用maven将spring boot 项目打包成jar就有问题了。一是本地jar包找不到,二是dll也找不到,三是打成jar包Test失败。具体如下:

1)maven 导入本地jar包

直接网上找了一个:http://blog.csdn.net/mayp1/article/details/53996402 新建了一个lib文件夹,把需要的jar包导入。 主要注意的是按照博客修改后的pom.xml里面写自己应用的入口。

2)运行时调用dll

在java.library.path里面能够找到dll就可以正常运行,以下是2种解决思路: a. 在程序中导入dll: System.load, System.loadLibrary b. 将dll放在java.library.path中的路径下。 花了大把时间尝试方法a,但是可能因为同阶段有其他bug的影响,快到deadline了还是没有成功。所以直接采用方法b。直接把dll和lib文件放在了jdk的bin文件夹下(不推荐)

3)打成jar包Test问题

可能是Spring boot 的test模块无法找到dll文件,在用maven打jar包的时候一直卡在Test。所以直接把Test模块给剔除了。。。(不推荐)

##3.3 功能开发##

开发环境(在IntelliJ 里) 目前需要实现的功能(目前实现Wind TDBAPI里面的部分功能)

###3.3.1 登录模块###

Wind登录模块写在Controller的构造函数里面,避免每次请求数据重新登录

###3.3.2 获取K线数据### 前三点介绍wind api中的数据结构,与其在web api中的对应。(a. Wind 中的数据结构; b. web api中的数据结构)

1) 请求K线数据结构

a. Wind 请求K线数据结构

b. Web api 请求K线数据结构

注意不需要构造函数,Controller里面会自动匹配。

2) 枚举类型

a. Wind 枚举类型

b. Web Api 枚举类型转换

为了方便客户端(时间参数: 传 0,1,2 不如传 'second', 'minute' 直观),进行下面的自动转换(switch case 很low就是了,还好类型少。。。。)

3) 返回数据类型

a. Wind 原生返回数据类型

b. web api 返回数据类

4) 请求K线数据

 //获取K线数据@RequestMapping(value = "/getKLine",  method = RequestMethod.POST)public List<TdbKLine> getKLine(@RequestBody KLineParam kLineParam) {int m_nMaxOutputCount = 1000;if(kLineParam.getKey() != "xxxxxxx") return null;ReqKLine req = new ReqKLine();req.setCode(kLineParam.getCode());       //Requiredreq.setMarketKey(kLineParam.getMarketKey());//Requiredreq.setCQFlag(kLineParam.getCqFlag());    //默认为0req.setCQDate(kLineParam.getCqDate());   //默认为0req.setQJFlag(kLineParam.getQjFlag());   //默认为0req.setCycType(kLineParam.getCycType()); //Requiredreq.setCycDef(kLineParam.getCycDef());   //Optional,default 1req.setAutoComplete(kLineParam.getAutoComplete()); //自动补齐(0:不补齐,1:补齐)req.setBeginDate(kLineParam.getBeginDate());         //Optional,default todayreq.setEndDate(kLineParam.getEndDate());             //Optional,default todayreq.setBeginTime(kLineParam.getBeginTime());   //开始时间req.setEndTime(kLineParam.getEndTime());       //结束时间KLine[] kline = client.getKLine(req);if (kline==null) {System.out.println("NetWork Error,getKline failed!");//网络断开,可根据此消息,调用Client.close()后重连}List<TdbKLine> tdbKLines = new ArrayList<>();int nIndex = 0;for(KLine k : kline) {if (nIndex++ > m_nMaxOutputCount) break;TdbKLine tdbKLine = new TdbKLine(k.getWindCode(), k.getCode(), k.getDate(), k.getTime(),k.getOpen(), k.getHigh(), k.getLow(), k.getClose(), k.getVolume());tdbKLines.add(tdbKLine);}return tdbKLines;}

###3.3.3 获取Tick数据### 与获取K线数据类似

##3.4 测试用例

test.py

#请求tick数据的参数
tick_param = {'code': 'cu00.SHF', 'marketKey':'SHF-1-0','date':20170608, 'beginTime':0, 'endTime':0}
tick_url = 'http://xxx.xxx.xxx.xx:xxxx/getTick'#发送请求
r = requests.post(url=tick_url, json=kline_param)
#返回json数据
print(r.json())

code: github

转载于:https://my.oschina.net/u/2291187/blog/962001

Wind(万得)原生TDBAPI(JAVA版)封装成 WEB API (Demo版)相关推荐

  1. 怎么把java源代码封装,如何把JAVA程序封装成EXE文件

    如何把JAVA程序封装成EXE文件 可以把普通的Java程序做成真正的exe,也就是单一个exe就可以在没有安装JVM的机器上运行.这样的工具常见的有JET和gcj.前者是收费的,而且做出来的exe还 ...

  2. 智慧零售erp通用版管理系统+门店管理+商品管理+厂商管理+财务管理+销售管理+仓储管理+Axure高保真交互ERP通用版零售行业web端简易版管理系统

    作品介绍:智慧零售erp通用版管理系统+门店管理+商品管理+厂商管理+财务管理+销售管理+仓储管理+Axure高保真交互ERP通用版零售行业web端简易版管理系统 原型交互及下载请点击:https:/ ...

  3. 代码从svn到工作空间,Myeclipse中java项目转成Web项目

    从svn到工作空间 1.新建一个web项目 2.从svn覆盖刚新建的web项目 Myeclipse中java项目转成Web项目 在eclipse导入一个myeclipse建的web项目后,在Eclip ...

  4. Eclipse中将Java项目转换成Web项目的方法

    前言: 用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个java工程,将无法在Tomcat中进行部署运行. 方法: 1.找到.project文件,找到里面的<n ...

  5. eclipse项目如何变成web项目_Eclipse中将Java项目转换成Web项目的方法

    前言: 用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个java工程,将无法在Tomcat中进行部署运行. 方法: 1.找到.project文件,找到里面的标签,查看 ...

  6. 怎样把java项目转换成web项目_Eclipse中将Java项目转换成Web项目的方法

    注意: 0.点击Further configuration available,修改eclipse默认的WebContent 并修改为WebRoot,勾选Generate web.xml deploy ...

  7. java bearer token_从Web API在MVC中存储Bearer Token的位置

    我设法提出了一些我觉得可以很好用的东西 . 我正在使用Owin Middleware进行Cookie身份验证 . 在MVC应用程序中,我有一个Owin Startup文件,其中配置了Cookie身份验 ...

  8. 原生APP、WAP 封装的APP、面向API的APP区别与联系

    现在是移动互联网时代了,用户使用最多的就是手机app了,移动端的流量太大了. 但是,app的开发制作成本却是很多中小站点无法承受的,于是便衍生出了很多做网站打包的公司. 找外包公司开发APP或者自己开 ...

  9. java 调用webapi json_java通过url调用web api并接收其返回的json

    java通过url调用webapi并接收其返回的json数据,但现在结果总是:{"result":4,"data":{}}(未认证:),帮助文档如下:API使用 ...

最新文章

  1. 【OpenCV3】图像翻转——cv::flip()详解
  2. Boost:验证atomic <>不会在成员指针上提供算术运算
  3. 字符串匹配算法(一):BF(BruteForce)算法和RK(RabinKarp)算法
  4. 【UVA - 10154 】Weights and Measures (贪心排序,dp,类似0-1背包,状态设定思维)
  5. 台式机dp接口_精品导购:你想要的商务台式机 都在这里了!
  6. 移动端真机调试,手机端调试,移动端调试
  7. 改变support中AlertDialog的样式
  8. MediaPlayer的错误修复
  9. 数据库-如何快速创建连接字符串
  10. ROS安装教程(详细)
  11. Android自定义View——实现字母导航栏
  12. 【求职面试】程序员面试如何做自我介绍?
  13. 分布式医疗大数据存储方案研究综述
  14. python爬取qq音乐标签_Python爬取qq音乐的过程实例
  15. 微信小程序 动态添加类名
  16. iomanip I/O流类库操纵符
  17. 软件安全学习笔记(7):PE文件总体格式
  18. python字典、列表、元祖使用场景_(三)PYTHON字典 元祖 列表尝试应用
  19. stm32f103——串口UART
  20. 学力银行产品负责人谈:未来企业培训管理五大趋势

热门文章

  1. squirrel校园二手交易平台
  2. C 好书盘点【月儿原创】
  3. 耶鲁博弈论公开课笔记
  4. 在 Hexo 中使用 artitalk 新增说说功能
  5. 五、ITcast小爬虫 与管道文件
  6. 作为数据分析师的你都有哪些常用工具
  7. vue3使用vis绘制甘特图制作timeline可拖动时间轴,时间轴中文化
  8. Linux FTP命令全集(ftp指令)
  9. scrapy pipelines(MySQL )
  10. 麻省理工学院-2017年-深度学习与自动驾驶视频课程分享