若该文为原创文章,转载请注明出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/137937666
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)
Qt开发专栏:项目实战(点击传送门)
需求
使用Qt软件开发K线股P相关软件,先开发一个通过CTP量化交易的sdk获取相关推送数据的工具(当前深度行情数据)。
注意
采集数据测试
- 1.晚上9点以后可以采集到数据
- 2.工作日 上午9:00 — 10:15,10:30 — 11:30,下午13:30 — 15:00
Demo
windows运行包下载地址
CSDNf粉丝0积分下载:https://download.csdn.net/download/qq21497936/89165596
QQ群:博客首页扫码进入QQ技术群,点击**“文件”搜索“testCTPSdk”**,群内与博文同步更新)
VS移植过程QtCreator
将vs的开发demo,调用sdk,迁移至QtCreator的IDE进行模块化的开发,便于设计软件构架、模块化封装和多工程测试。
功能描述v1.0.0
- 注册登录服务器后台
- 开始按钮注册订阅
- 结束按钮取消订阅
- 导出抓取得文本数据
模块化部署
关键源码
TestSdkWidget异步多线程初始化
void TestSdkWidget::initControl()
{
// 初始化sdk管理类
{
// 线程初始化
_pStockSdkManager = StockSdkManager::getInstance();
_pStockSdkManagerThread = new QThread();
_pStockSdkManager->moveToThread(_pStockSdkManagerThread);
connect(_pStockSdkManagerThread, SIGNAL(started()),
_pStockSdkManager, SLOT(slot_start()));
// 关联
connect(_pStockSdkManager, SIGNAL(signal_stateLog(QString)),
this, SLOT(slot_stateLog(QString)));
// 开始
_pStockSdkManagerThread->start();
}
// 按钮使能
ui->pushButton_start->setEnabled(true);
ui->pushButton_stop->setEnabled(false);
}
StockSdkManager.h
#ifndef STOCKSDKMANAGER_H
#define STOCKSDKMANAGER_H
#include <QObject>
#include <QMutex>
#include "MdSpi.h"
class StockSdkManager : public QObject
{
Q_OBJECT
private:
explicit StockSdkManager(QObject *parent = 0);
public:
static StockSdkManager * getInstance(); // 单例获取指针
signals:
void signal_stateLog(QString logStr); // 日志抛出
public slots:
void slot_start(); // 线程开启
void slot_stop(); // 线程关闭
public slots:
void slot_startGetInfo(); // 注册抓取数据(注册合约ID)
void slot_stopGetInfo(); // 注销注册停止获取
private:
static StockSdkManager *_pInstance;
static QMutex _mutex;
private:
bool _running;
private:
CThostFtdcMdApi* _pMdapi; // 合约api
MdSpi *_pMdSpi; // 合约处理(重载类)
};
#endif // STOCKSDKMANAGER_H
MdSpi.h:合约处理类(重载函数获取处理数据)
#ifndef MDSPI_H
#define MDSPI_H
#include <QObject>
#include "ThostFtdcMdApi.h"
#include "ThostFtdcUserApiStruct.h"
class MdSpi : public CThostFtdcMdSpi
{
public:
MdSpi();
~MdSpi();
public:
CThostFtdcMdApi *getMdapi() const;
public:
void setMdapi(CThostFtdcMdApi *pMdapi);
public:
virtual void OnFrontConnected();
virtual void OnFrontDisconnected(int nReason);
virtual void OnRspUserLogin(CThostFtdcRspUserLoginField* pRspUserLogin, CThostFtdcRspInfoField* pRspInfo, int nRequestID, bool bIsLast);
virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField* pDepthMarketData);
private:
CThostFtdcMdApi* _pMdapi;
private:
CThostFtdcDepthMarketDataField _preTick;
};
#endif // MDSPI_H
工程模板v1.0.0
入坑
入坑一:无法停止获取
问题
点击停止获取
原因
调用sdk的join函数进入库内部线程循环,此时调用join处阻塞。
处理
管理类子线程调用join,那么join阻塞该线程,调用注册和注销在管理类外直接调用。
若该文为原创文章,转载请注明出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/137937666