目的
有的时候工作忙,就忘记了股票的新股申购,虽然从来没有中过一只新股,但是就当买彩票了,因此采用自动化方式进行股票新股申购,以防止自己忘记。
实现架构方式

图1
1. 通过在网上*载下**的TdxTradeServer进行与券商的交互,实现股票账户登录、股票买卖。
2. 申购客户端调用TdxTradeServer提供的restful接口进行账户登录、新股申购。
3. 客户端通过网上提供的信息进行当日可申购新股。
TdxTradeServer安装
1) 安装Python,我这里安装的是Python3.7 64位版本,不影响这个的安装
2) 安装pytdx, pip install pytdx
3) 安装配置服务器 get_tts,配置过程如下:

图2

图3
4. 完成以上步骤后,在C:\TdxTradeServer中查看配置文件:

图4
5. 打开配置文件,可以选择配置为多账号版本,多账号版本为在配置文件中加上一下选项:
multiaccount=true ; 设置多用户版本开启
6. 可以去掉transport_enc_key,transport_enc_iv,这样在与客户端交互的时候就是明文传输。
7. 详细内容参见https://github.com/rainx/TdxTradeServer
StockClient客户端
客户端采用C++进行开发,首先通过微软提供的vcpkg工具进行依赖库的安装,主要依赖cpr,nlohmann-json
通过使用cpr以及json解析获取新股列表程序,具体代码为:
const char *url = "http://m.data.eastmoney.com/XG/XgrlList";
auto rr = cpr::Get(cpr::Url{ url });
json requestJson = json::parse(rr.text);
auto stocks = requestJson["result"]["Calendarlist"];
通过以上代码,从东方财富网提供的新股数据,获取到可以申购的股票,然后遍历获得到的数据,判断股票申购日期是否为今天,如果为今天,则获取到今日可以申购的股票,以及价格。具体代码如下:
for (int i = 0; i < stocks.size(); i++){
if (isToday(stocks.at(i)["date"].get<string>())){
for (int j = 0; j < stocks.at(i)["sglist"].size(); j++) {
string stockCode = stocks.at(i)["sglist"].at(j)["SubCode"].get<string>();
float price = stof(stocks.at(i)["sglist"].at(j)["fxj"].get<string>());
std::cout << "申购新股:" << stockCode << " " << "价格:" << price << std::endl;
string errInfo;
bool bRet = api.send_order_ipo(stockCode.c_str(), price, errInfo);
if (bRet) {
std::cout << "申购新股成功" << std::endl;
}
else {
std::cout << "申购新股失败:" << errInfo << std::endl;
}
}
}
}
bool isToday(string strData){
auto tt = std::chrono::system_clock::to_time_t
(std::chrono::system_clock::now());
struct tm* ptm = localtime(&tt);
char date[60] = { 0 };
sprintf(date, "%d-%02d-%02d",
(int)ptm->tm_year + 1900, (int)ptm->tm_mon + 1, (int)ptm->tm_mday);
if (strData.compare(date) == 0)
return true;
return false;
}
申购新股购买函数算法流程:
1) 根据股票代码,判断上市股票为沪市还是深市股票
2) 查询当前证券最大可申购数量,发送购买数量10000000的信息,这时接口会返回错误信息,信息中包括股票可申购最大数量,但是这个数量不是我们的额度。
3) 根据步骤2中股票最大可申购数量,发送购买信息, 这个时候就会返回错误信息,该信息中包括账户可申购额度。
4) 根据步骤3中获取到的可申购额度,以及从东方财富网查询到的该股票的申购价格,进行下单。
以上就是股票申购客户端的主体流程以及具体的算法,具体程序参见https://gitee.com/ctosoft/StockClient
添加服务以及自动启动
1) 通过srvanyui程序将TdxTradeServer添加到系统服务中,这样开机就会自动启动该服务
2) 通过任务计划将StockClient添加到任务计划中,定时启动,省的忘记启动该程序。
这样就实现了股票自动打新程序。