背景
最近一直在玩vn.py,上一篇文章vn.py开发环境搭建(windows)介绍了如何搭建二次开发环境,解决了一些搭建环境过程中遇到的坑。那么接下来这篇文章将解决运行期间的第一个问题。
开始vn.py
1.环境部署完成之后,启动examples/vn_trader/run.py,弹出启动页面。具体搭建过程参考[vn.py开发环境搭建(windows)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gVeJW6uG-1579739463717)(/img/bVbCUI6)]
2。连接CTP,点击系统->连接CTP
,弹出连接界面。
3.介绍一下个字段
用户名:在simnow注册的用户名6位数字
密码:登录simnow使用的密码
经纪商代码:9999
交易服务器地址:180.168.146.187:10101
行情服务器地址:180.168.146.187:10111
产品名称:simnow_client_test
授权码:0000000000000000 16个0
4.获取你的用户名和密码
登录http://www.simnow.com.cn/,从右上角的注册账号
开始操作,这里就不讲了,大家自己鼓捣吧。
问题来了
所有准备工作做好后,点击连接,这时左下角会显示日志。
如果你是第一次登陆,那么会提示CTP首次登陆需要修改密码
,这也就是我们今天要解决的问题
试图解决
刚看到这个问题觉得没什么,修改一下密码就可以了,但是。。。。。
首先没有再vn.py上找到可以修改密码的地方,后来想了想,也正常人家只是策略平台,也不仅仅是给CTP用,
所以去注册的地方simnow官网
找找吧,但是。。。。
很遗憾仍然没有找到,这里不得不吐槽一下simnow了。是不是应该给个改密码的地方?
据说可以使用市场上的交易应用修改密码,大家可以去试试。或者大家有更好的方法也可以回复留言。
开始撸它
好吧,那么我们用程序员的方式来解决这个问题吧。
1.在vnpy/api/ctp目录下可以看到完整ctp开发的api,包括库和头文件。哈哈,是不是会让你产生非分之想?
2.我们在ThostFtdcTraderApi.h中发现了我们想要的东西
///用户口令更新请求
virtual int ReqUserPasswordUpdate(CThostFtdcUserPasswordUpdateField *pUserPasswordUpdate, int nRequestID) = 0;
3.找到ctp api文档在simnow官网上可以找到,我这里用的事《综合交易平台TraderAPI接口说明.pdf》
4.开始撸代码吧,我先是在linux开始撸,后来发现我的操作系统编译器版本太低,当然升级版本应该可以解决,但升级gcc,glibc还是相当耗时的。所以后来移植到了windows,但工程还是linux风格,使用cmake构建,好在现在vs对cmake支持的不错。
5.继续撸,先贴一段吧
#include "ctp_trade_handler.h"
#include "INIReader.h"
#include <iostream>
int main(int argc, char* argv[])
{
string a;
INIReader reader("../conf/ctp.ini");
if (reader.ParseError() != 0) {
std::cout << "Can't load 'test.ini'\n";
return 1;
}
std::cout << reader.GetInteger("user","BrokerID",9999) << endl;
ctp_trade_handle ctp;
ctp.CreateFtdcTraderApi();
ctp.RegisterFront("tcp://180.168.146.187:10100");
ctp.init();
//CThostFtdcReqAuthenticateField reqAuthenticate = { 0 };
//strcpy(reqAuthenticate.AppID, "simnow_client_test");
//strcpy(reqAuthenticate.UserID, "158477");
//strcpy(reqAuthenticate.AuthCode, "0000000000000000");
//strcpy(reqAuthenticate.BrokerID, "9999");
//ctp.ReqAuthenticate(&reqAuthenticate, 1);
CThostFtdcReqUserLoginField reqUserLogin = { 0 };
strcpy(reqUserLogin.BrokerID,"9999");
strcpy(reqUserLogin.UserID,"158477");
strcpy(reqUserLogin.Password,"qwe123");
ctp.ReqUserLogin(&reqUserLogin, 1);
std::cout << "input new password : ";
std::cin >> a;
CThostFtdcUserPasswordUpdateField reqUserPasswordUpdate = { 0 };
strcpy(reqUserPasswordUpdate.BrokerID, "9999");
strcpy(reqUserPasswordUpdate.UserID, "158477");
strcpy(reqUserPasswordUpdate.OldPassword, "qwe123");
strcpy(reqUserPasswordUpdate.NewPassword, a.c_str());
ctp.ReqUserPasswordUpdate(&reqUserPasswordUpdate, 3);
std::cin >> a;
ctp.exit();
return 0;
}
代码很简单,这里就不多说了。目前只是为了解决我修改密码的需求,后续还会不断完善。
如有需要可以自己取来撸,代码托管地址:https://github.com/FrankXMX/ctp.git欢迎watch和star
6.使用上就是填写好你的相关信息,编译运行,输入新密码。得到屏幕输出。
7.回到vn.py,使用新密码重新连接ctp。
大功告成!!!
来源:CSDN
作者:xk_xx
链接:https://blog.csdn.net/xk_xx/article/details/104073968