项目实战:Qt获取CTP量化交易接口测试数据工具 v1.0.0(获取深度行情数据、订阅取消订阅)

慈云数据 6个月前 (05-13) 技术支持 77 0

若该文为原创文章,转载请注明出处

本文章博客地址: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 
      #include 
      #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 
      #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

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon