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

2024-08-28 14:08

本文主要是介绍国外期货程序化交易之行情获取讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       本来是做图像算法,后来稀里糊涂的被拉进期货程序化交易这个方向。刚接触时真是一头雾水,什么合约、保证金、开仓、平仓、看多、看空等等完全不懂,对期货的了解仅仅停留在新闻报道里,各种期货知识一顿恶补后,思路渐渐清晰。于是开始着手开发期货行情程序、交易程序等等。目前,开发的行情程序及交易程序,主要还是和郑州易盛的交易系统对接,基于易盛的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



这篇关于国外期货程序化交易之行情获取讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114977

相关文章

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

JS和jQuery获取节点的兄弟,父级,子级元素

原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。 JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素。 <div id="test"><div></div><div></div

vcpkg子包路径批量获取

获取vcpkg 子包的路径,并拼接为set(CMAKE_PREFIX_PATH “拼接路径” ) import osdef find_directories_with_subdirs(root_dir):# 构建根目录下的 "packages" 文件夹路径root_packages_dir = os.path.join(root_dir, "packages")# 如果 "packages"

ispunct函数讲解 <ctype.h>头文件函数

目录 1.头文件函数 2.ispunct函数使用  小心!VS2022不可直接接触,否则..!没有这个必要,方源一把抓住VS2022,顷刻 炼化! 1.头文件函数 以上函数都需要包括头文件<ctype.h> ,其中包括 ispunct 函数 #include<ctype.h> 2.ispunct函数使用 简述: ispunct函数一种判断字符是否为标点符号的函

Weex入门教程之4,获取当前全局环境变量和配置信息(屏幕高度、宽度等)

$getConfig() 获取当前全局环境变量和配置信息。 Returns: config (object): 配置对象;bundleUrl (string): bundle 的 url;debug (boolean): 是否是调试模式;env (object): 环境对象; weexVersion (string): Weex sdk 版本;appName (string): 应用名字;

深度学习速通系列:深度学习算法讲解

深度学习算法是一系列基于人工神经网络的算法,它们通过模拟人脑处理信息的方式来学习和解决复杂问题。这些算法在图像识别、语音识别、自然语言处理、游戏等领域取得了显著的成就。以下是一些流行的深度学习算法及其基本原理: 1. 前馈神经网络(Feedforward Neural Networks, FNN) 原理:FNN 是最基本的神经网络结构,它由输入层、隐藏层和输出层组成。信息从输入层流向隐藏层,最

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

android两种日志获取log4j

android   log4j 加载日志使用方法; 先上图: 有两种方式: 1:直接使用架包 加载(两个都要使用); 架包:android-logging-log4j-1.0.3.jar 、log4j-1.2.15.jar  (说明:也可以使用架包:log4j-1.2.17.jar)  2:对架包输入日志的二次封装使用; 1:直接使用 log4j 日志框架获取日志信息: A:配置 日志 文