背景
最近一直在玩vn.py,上一篇文章vn.py開發環境搭建(windows)介紹瞭如何搭建二次開發環境,解決了一些搭建環境過程中遇到的坑。那麼接下來這篇文章將解決運行期間的第一個問題。
開始vn.py
1.環境部署完成之後,啓動examples/vn_trader/run.py,彈出啓動頁面。具體搭建過程參考vn.py開發環境搭建(windows)。
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, "你的ID");
//strcpy(reqAuthenticate.AuthCode, "0000000000000000");
//strcpy(reqAuthenticate.BrokerID, "9999");
//ctp.ReqAuthenticate(&reqAuthenticate, 1);
CThostFtdcReqUserLoginField reqUserLogin = { 0 };
strcpy(reqUserLogin.BrokerID,"9999");
strcpy(reqUserLogin.UserID,"你的ID");
strcpy(reqUserLogin.Password,"你的密碼");
ctp.ReqUserLogin(&reqUserLogin, 1);
std::cout << "input new password : ";
std::cin >> a;
CThostFtdcUserPasswordUpdateField reqUserPasswordUpdate = { 0 };
strcpy(reqUserPasswordUpdate.BrokerID, "9999");
strcpy(reqUserPasswordUpdate.UserID, "你的ID");
strcpy(reqUserPasswordUpdate.OldPassword, "新密碼");
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。
大功告成!!!