前面两篇文章主要讲了国外期货相关程序开发,使用的是郑州易盛的行情及交易api,而国内期货相关程序开发易盛貌似也是有sdk的,不过项目中使用的是上期技术的sdk,即大家经常提到的CTP api——综合交易平台api。相比较而言,易盛给自己的sdk起的名字好听一点,叫易盛国际金融衍生品交易分析系统,听着高大上一些。
       上期技术的api使用思路与易盛的api基本一致,大同小异,其实无论谁设计这个架构,基本也都是这个思路,一个发起请求调用,一个响应请求回调,调用逻辑由sdk提供方编写,回调逻辑由开发者编写,这样共同完成整个业务逻辑开发。不过毕竟是两家公司开发的sdk,所以在定义参数及一些交易术语上,还是有些不同的,这个需要开发者多查阅文档、多摸索才行。
       基于CPT api开发行情获取程序,主要用到的头文件为:ThostFtdcMdApi.h、ThostFtdcUserApiDataType.h及ThostFtdcUserApiStruct.h,动态库为:libthostmduserapi.so。
       下面是一些代码示例:
       1. 创建CTP api实例:
CThostFtdcMdApi *pMarketDataApi = CThostFtdcMdApi::CreateFtdcMdApi(dirName);
      即通过调用CreateFtdcMdApi()创建api实例——pMarketDataApi,随后调用该实例发起各种请求,比如连接服务器、用户登录、订阅合约、退订合约等。
       2. 创建CTP api回调实例:
MarketDataSource *pDataSource = new MarketDataSource(pMarketDataApi, this);

这个需要自己编写相应实现类,需要继承上期技术提供的CThostFtdcMdSpi类。重写该类里面的方法,以处理服务器发过来的各类数据。

       3. 将上述两个实例关联起来,并发起连接服务器及用户登录:
pMarketDataApi->RegisterSpi(pDataSource);
pDataSource->connect(serverAddr, brokerId, username, password);

连接服务器以及实例初始化相关代码:

void MarketDataSource::connect(string serverAddr, string brokerId, string username, string password)
{serverAddr_ = serverAddr;brokerId_ = brokerId;username_ = username;password_ = password;pMarketDataApi_->RegisterFront((char *)serverAddr_.c_str());pMarketDataApi_->Init();
}

连接请求发出后,OnFrontConnected()及OnRspUserLogin()会响应请求,根据返回的信息,可以确定是否登录完成。登录成功后,就可以订阅合约了。

void MarketDataSource::OnFrontConnected()
{LOG_INFO << username_ << " 回调: 与服务器已建立连接, 开始登录";
}void MarketDataSource::OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{if (pRspInfo == NULL){LOG_INFO << username_ << " 登录回调异常, 指针为空";return;}if (pRspInfo->ErrorID == Err_Succeed){LOG_INFO << username_ << " 登录成功, 当前交易日: " << pMarketDataApi_->GetTradingDay();}
}

4. 订阅期货合约:

void MarketDataSource::subscribeContracts(std::set<ContractInfo> &contracts)
{const size_t count = contracts.size();char *instruments[count];int i = 0;for (std::set<ContractInfo>::iterator it = contracts.begin(); it != contracts.end(); ++it){string strInstrument = it->CommodityNo + it->ContractNo;instruments[i] = new char[32];memset(instruments[i], 0, 32);strcpy(instruments[i], strInstrument.c_str());i++;}int result = Err_Succeed;result = pMarketDataApi_->SubscribeMarketData(instruments, (int)count);if (result == Err_Succeed){LOG_INFO << username_ << " " << "请求: 合约订阅成功";}else{LOG_INFO << username_ << " "<< "请求: 合约订阅失败" << " "<< "错误码: " << result << " " << ErrorCode::get(result);}for (i = 0; i < count; ++i){delete[] instruments[i];}
}

上述代码主要参考CTP文档编写,比较简单,按照文档说明,填写正确参数,然后调用SubscribeMarketData()函数即可。

       5. 接收行情数据:
void MarketDataSource::OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData)
{if (pDepthMarketData != NULL){CThostFtdcDepthMarketDataField marketData;memcpy(&marketData, pDepthMarketData, sizeof(CThostFtdcDepthMarketDataField));LOG_INFO << "行情更新:"<< marketData.TradingDay << " "<< marketData.UpdateTime << " "<< marketData.UpdateMillisec << " "<< marketData.InstrumentID << " "<< marketData.LastPrice << " "<< username_;}
}

一旦合约订阅成功,在交易时间段内,就会有行情数据源源不断的推送过来。上期技术文档中提到行情是每秒2条数据,这个还是比较准的。注意,这里有一个坑,那就是在非交易时间段,经常会接收脏数据,姑且叫测试数据吧。但这个测试数据是个十几位长的超级大浮点数,需要做好过滤,否则程序就各种异常了,甚至程序Crash。

基于CTP的国内期货程序化交易之行情获取讲解相关推荐

  1. python期货自动化交易_Python API面纱下的函数——基于CTP的国内期货程序化交易之报单流程讲解...

    很多用户已经阅读了真格量化的Python API文档,知道了其是对一些交易柜台,比如CTP C++ API的封装.这里我们可以看看这些API在C++中的原始面貌. 我们还是以CTP柜台为例.与海外市场 ...

  2. 基于CTP的国内期货程序化交易之报单流程讲解

           相比国外期货交易开发,国内期货交易开发就有些繁琐了,坑比较多.第一就是交易时间段多,像国外期货美原油,全天23小时连续交易,而国内期货沪金,全天分四个时间段交易,分别为9:00至10:1 ...

  3. 国外期货程序化交易之行情获取讲解

    本来是做图像算法,后来稀里糊涂的被拉进期货程序化交易这个方向.刚接触时真是一头雾水,什么合约.保证金.开仓.平仓.看多.看空等等完全不懂,对期货的了解仅仅停留在新闻报道里,各种期货知识一顿恶补后,思路 ...

  4. DeepEye:一个基于深度学习的程序化交易识别与分类方法

    DeepEye:一个基于深度学习的程序化交易识别与分类方法 徐广斌,张伟 上海证券交易所资本市场研究所,上海 200120  上海证券交易所产品创新中心,上海 200120    摘要:基于沪市A股交 ...

  5. 基于python的股票程序化交易软件_程序化交易(三):基于 Python 的股票程序化交易/量化框架 easyquant...

    续前贴,在前面的基础上弄了一个简单的程序化交易框架 easyquant 开源在 github 上,欢迎大家 star & fork.下面是简单介绍: 交易模块 easytrader 支持 华泰 ...

  6. 基于IB(Interactive Brokers)盈透证券的股票及期货行情获取讲解

           盈透证券,作为老牌帝国主义券商,能够提供强到变态的交易软件TWS,多到变态的全球股票.期货等产品覆盖,以及低到变态的交易费用.如果做全球股票或期货交易,能够对接盈透证券相关接口还是不错的 ...

  7. 基于python的股票程序化交易论文_基于Python工具的股票量化投资策略研究

    2019 年第 07 期 20 世 纪 80 年代, 一 些 投 资 者 开 始 利用 计 算 机 研究金 融 数据 , 并 初显 成 效 . 20 世 纪 末 , 投 资 者 把 计 算 机 技术 ...

  8. 炒股程序化交易接口怎么获取实时行情

    API通达信接口获取股票实时行情,接口是ApplicationProgrammingInterface的简称,是一些预先定义的函数,包括通达信接口获取股票实时行情,接口地址.传入参数和返回参数.

  9. 国外期货程序化交易之报单流程讲解

           编写国外期货合约报单程序,同样基于郑州易盛的sdk做二次开发,通过调用易盛的交易api完成交易报单.毕竟都是一家公司发布的sdk,所以交易api设计风格与行情api基本一致,调用逻辑也基 ...

最新文章

  1. 从零开始一起学习SLAM | 为啥需要李群与李代数?
  2. 每个程序员都应该知道的10件事!
  3. python100行代码-100 Lines Python
  4. 科大星云诗社动态20210424
  5. boost::geometry模块model::polygon相关的测试程序
  6. 光纤收发器具体是怎么分类的?
  7. js正则表达式限制文本框只能输入数字,小数点,英文字母
  8. TCP/IP,HTTP,Socket的区别与联系
  9. 祥云,灯笼,剪纸……春节海报,点缀必备PSD素材
  10. qq微信淘宝京东自动转链转发机器人MkStone京东淘宝转链助手
  11. Windows桌面美化——记录我的设置
  12. docker安装gitlab
  13. S=A-BIS-dS+u2w2I+u1w1E数模作业
  14. 无法将maven 编译部署src/main/java下的资源文件
  15. 2016,初入江湖,尚未见刀光剑影
  16. input的value属性值
  17. 学会用这个工具,小白也能在Linux上畅玩手机游戏
  18. SQL 查询重复数据,多字段联合重复
  19. (happytime)Onvif Server端口占用 10013问题解决方法
  20. 苹果邮件怎么添加qq邮箱_科技资讯:QQ邮箱格式怎么填写

热门文章

  1. 一度智信:拼多多怎么投诉商家
  2. 国庆头像html代码
  3. POI 2011 切题记
  4. 手游联运平台是什么?
  5. 2022青海省农商银行(农信社)招聘每日一练及答案
  6. 东南西北十字图_怎么辨别东南西北的方向 分清东南西北口诀与窍门技巧(图)...
  7. 关于前端页面展示图片展示时改变方向的解决办法
  8. Java8 Collectors.joining() 详解
  9. java如何实现导出Excel(附源码)--文末送书
  10. ASO优化:影响 APP权重与吸量的五大要素