本来是做图像算法,后来稀里糊涂的被拉进期货程序化交易这个方向。刚接触时真是一头雾水,什么合约、保证金、开仓、平仓、看多、看空等等完全不懂,对期货的了解仅仅停留在新闻报道里,各种期货知识一顿恶补后,思路渐渐清晰。于是开始着手开发期货行情程序、交易程序等等。目前,开发的行情程序及交易程序,主要还是和郑州易盛的交易系统对接,基于易盛的sdk做二次开发,通过调用易盛的行情api获取期货合约行情,调用易盛的交易api完成交易报单。当然也可以申请美国盈透的账号,然后使用盈透的行情及交易api。

为了方便开发,易盛官方(http://www.esunny.com.cn/)提供了文档以及示例demo,不过还是建议按照自己的理解和思路设计程序,官方提供的demo仅供参考。实时获取行情数据使用socket协议,需要长连接易盛提供的行情服务器,不过易盛提供的sdk内部会维护长连接,开发者可以不做太多处理,但断线重连逻辑需要开发者编写。编写代码时需要处理两方面内容,一个是调用方,即发出请求,另一个是回调方,即响应请求。发出请求时,只要自己的应用直接调用易盛的api即可,而响应请求,这个需要自己的应用继承、重写易盛提供的相应方法,然后作为回调供易盛的sdk调用。同时需要注意回调函数内不要做比较耗时的操作,即不要堵塞易盛的回调线程。整体上讲,开发过程还是容易的,下面是流程图及一些代码示例:

       1. 创建易盛TapAPI实例:
TapAPIApplicationInfo tapAppInfo;
strcpy(tapAppInfo.AuthCode, authcode.c_str());
strcpy(tapAppInfo.KeyOperationLogPath, username.c_str());
ITapQuoteAPI *pTapQuote = CreateTapQuoteAPI(&tapAppInfo, result);
       即通过调用CreateTapQuoteAPI()创建api实例——pTapQuote,随后调用该实例发起各种请求,比如连接服务器、用户登录、订阅合约、退订合约等。
       2. 创建TapAPI回调实例:
MarketDataSource *pDataSource = new MarketDataSource(pTapQuote, this);
       这个需要自己编写相应实现类,需要继承易盛提供的ITapQuoteAPINotify类。重写该类里面的方法,以处理易盛服务器发过来的各类数据。
       3. 将上述两个实例关联起来,并发起连接服务器及用户登录:
pTapQuote->SetAPINotify(pDataSource);
pDataSource->connect(serverAddr, port, username, password);
      连接服务器及用户登录部分代码:
void MarketDataSource::connect(string serverAddr, uint16_t port, string username, string password)
{TAPIINT32 result = TAPIERROR_SUCCEED;// 保存登录信息serverAddr_ = serverAddr;port_ = port;username_ = username;password_ = password;// 设置服务器IP、端口result = (pTapQuote_ != NULL) ? pTapQuote_->SetHostAddress(serverAddr.c_str(), port) : -999;if (result != TAPIERROR_SUCCEED){LOG_INFO << username_ << " 请求: 设置服务器IP/端口出错 " << result;return;}// 登录服务器TapAPIQuoteLoginAuth loginAuth;memset(&loginAuth, 0, sizeof(TapAPIQuoteLoginAuth));strcpy(loginAuth.UserNo, username.c_str());strcpy(loginAuth.Password, password.c_str());loginAuth.ISModifyPassword = APIYNFLAG_NO;loginAuth.ISDDA = APIYNFLAG_NO;result = (pTapQuote_ != NULL) ? pTapQuote_->Login(&loginAuth) : -999;if (result != TAPIERROR_SUCCEED){LOG_INFO << username_ << " 请求: 登录服务器出错 " << result;}
}
       登录请求发出后,OnRspLogin()及OnAPIReady()会响应请求,根据返回的信息,可以确定是否登录完成,以及API是否初始化完成,并在响应函数内做一些与主体程序有关的初始化工作。
void TAP_CDECL MarketDataSource::OnRspLogin(TAPIINT32 errorCode, const TapAPIQuotLoginRspInfo *info)
{}void TAP_CDECL MarketDataSource::OnAPIReady()
{}
       4. 订阅期货合约:
void MarketDataSource::subscribeContract(const ContractInfo &contract)
{TapAPIContract tapContract;memset(&tapContract, 0, sizeof(TapAPIContract));tapContract.Commodity.CommodityType = TAPI_COMMODITY_TYPE_FUTURES;strcpy(tapContract.Commodity.ExchangeNo, contract.ExchangeNo.c_str());strcpy(tapContract.Commodity.CommodityNo, contract.CommodityNo.c_str());strcpy(tapContract.ContractNo1, contract.ContractNo.c_str());tapContract.CallOrPutFlag1 = TAPI_CALLPUT_FLAG_NONE;tapContract.CallOrPutFlag2 = TAPI_CALLPUT_FLAG_NONE;sessionId_ = 0;TAPIINT32 result = pTapQuote_->SubscribeQuote(&sessionId_, &tapContract);if (result == TAPIERROR_SUCCEED){LOG_INFO << username_ << " "<< "请求: 合约订阅成功" << " "<< contract.CommodityNo << contract.ContractNo;}else{LOG_INFO << username_ << " "<< "请求: 合约订阅失败" << " "<< contract.CommodityNo << contract.ContractNo << " "<< "错误码: " << result;}
}
       上述代码主要参考易盛文档编写,比较简单,按照文档说明,填写正确参数,然后调用SubscribeQuote()函数即可。
       5. 接收行情数据:
void TAP_CDECL MarketDataSource::OnRtnQuote(const TapAPIQuoteWhole *info)
{if (info != NULL){TapAPIQuoteWhole marketData;memcpy(&marketData, info, sizeof(TapAPIQuoteWhole));LOG_INFO << "行情更新:"<< marketData.DateTimeStamp << " "<< marketData.Contract.Commodity.CommodityType << " "<< marketData.Contract.Commodity.ExchangeNo << " "<< marketData.Contract.Commodity.CommodityNo << " "<< marketData.Contract.ContractNo1 << " "<< marketData.QLastPrice << " "<< username_;}
}
       该方法属于易盛的回调函数,需要自己重写,易盛的sdk会自动调用。一旦合约订阅成功,在交易时间段内,就会有行情数据源源不断的推送过来,行情信息还是很丰富的,字段较多,需要按照项目需求,摘录一些重要字段然后整理使用,比较常用的主要有昨收盘价,昨结算价,开盘价,最新价,买一价,卖一价,买一量,卖一量,涨幅等等。易盛文档中提到行情是每秒2条数据,实际测试时发现,有的期货品种有时每秒会多于2条数据。注意,这里并不是一次把所订阅的合约全推送过来,而是一次推一个合约的行情,所以这个函数调用的非常频繁,一定不能阻塞。
       上面只是大体流程,具体如何写出高效、健壮、稳定的程序,以美原油合约为例,工作日全天23小时交易,那么程序怎么着也得5*24小时运行,并做到高效分发数据,还是需要时间慢慢调试完善的 。
       参考资料:
       http://www.esunny.com.cn/
       https://esunnyapi.gitbooks.io/esunnyapi_faq/content/EsunnyAPI.html

国外期货程序化交易之行情获取讲解相关推荐

  1. 基于CTP的国内期货程序化交易之行情获取讲解

           前面两篇文章主要讲了国外期货相关程序开发,使用的是郑州易盛的行情及交易api,而国内期货相关程序开发易盛貌似也是有sdk的,不过项目中使用的是上期技术的sdk,即大家经常提到的CTP a ...

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

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

  3. 放弃文华财经,自己编程实现期货程序化交易

    一.目前期货程序化现状: 由于有免费的CTP接口,期货程序化交易目前比较普遍,很多人都尝试过在文华财经.金字塔之类的软件上回测和编写实盘策略. 期货程序化交易有很多优点:程序会按照设计自动执行,不受任 ...

  4. 期货程序化交易之期货入门知识摘录整理

           开发期货程序化交易程序,首先要熟悉期货交易术语,否则不熟悉业务,开发的程序将会漏洞百出.下面是我在学习过程中摘录的一些期货相关知识,还是比较零散,可以作为入门时的资料看看.由于是陆续从网 ...

  5. 通达信期货程序化交易接口是什么?

    通达信期货程序化交易接口是什么?期货办理手续交易先讲期货的程序化交易. 联接国内四大期货交易所的期货交易系统软件关键是前高新科技综合交易服务平台(CTP ).金仕达.易盛(关键联接郑商所)等. 在其中 ...

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

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

  7. python期货程序化交易高手心得_11位顶级高手谈期货心得

    位,再多钱也是没有用的. 外盘的价 格变化是国外交易商的预期,跟国内的预期不完全吻合. 我不会去使用程序化交易,我认为程序化交易是有局限性的. 价格是变化的,你很难用一个框子来框它! 有时候期货交易它 ...

  8. python期货程序化交易高手心得_位顶级高手谈期货心得

    位顶级高手谈期货心得 王向洋 14 年期货生涯,多次获得全国期货实盘大赛冠军,曾创造的最高收益率为 5 个 月 54 倍. 期货中国网访谈精彩语录: 比赛时操盘的冒险精神强很多. 在和高手过招中你会思 ...

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

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

最新文章

  1. Python 中的进程、线程、协程、同步、异步、回调(一)
  2. linux通过tar包安装docker
  3. Java注释Override、Deprecated、SuppressWarnings详解
  4. git -- 练习的笔记
  5. c51语言中 位取反指令,C51的几种位操作运算说明
  6. 日语词频分析——mecab使用
  7. 如何提高软件测试团队工作效率
  8. 如何将逐小时数据处理为逐日数据
  9. 如何清理Windows XP冗余文件【绿色系统收藏】
  10. 6 生僻字_教改后注音书还有必要读吗?别纠结,6-8岁注音书我推荐这10套
  11. 使用Python处理声音文件(三):剪辑与淡入淡出
  12. (java毕业设计)基于java教室设备管理系统源码
  13. 机器学习--模型参数优化及scoring可选参数
  14. 数据的正态分布验证和方差齐性检验
  15. php 关键词生成,DEDECMS实现文章tag关键词自动生成列表页的方法
  16. MySQL将表中的价格全部加五_MySQL浅见(五)修改表
  17. 你偷看的小黄片,全被监视了!网友:隐私早已。。。
  18. 计算机数字音乐谱 凉凉,凉凉数字简谱
  19. 逆向工程之打造自己的仙剑奇侠
  20. CSS box-flex

热门文章

  1. nfs-ganesha rados_ng恢复原理分析
  2. 新年做客必备英语客套话
  3. Android studio—密码规范与密码小眼睛
  4. Unity3D C#中 String.Format的格式限定符
  5. 长青公益五一开展助学活动
  6. linux内存管理 简介,Linux操作系统的内存管理特性简介 (4)
  7. E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关
  8. Java 项目实战 坦克大战 (0)--前言
  9. 不错的耳机 Grado PS-1 全球限量版本
  10. 论写出大众欣赏的作品之无比艰难