本文主要是介绍国外期货程序化交易之行情获取讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本来是做图像算法,后来稀里糊涂的被拉进期货程序化交易这个方向。刚接触时真是一头雾水,什么合约、保证金、开仓、平仓、看多、看空等等完全不懂,对期货的了解仅仅停留在新闻报道里,各种期货知识一顿恶补后,思路渐渐清晰。于是开始着手开发期货行情程序、交易程序等等。目前,开发的行情程序及交易程序,主要还是和郑州易盛的交易系统对接,基于易盛的sdk做二次开发,通过调用易盛的行情api获取期货合约行情,调用易盛的交易api完成交易报单。当然也可以申请美国盈透的账号,然后使用盈透的行情及交易api。
为了方便开发,易盛官方(http://www.esunny.com.cn/)提供了文档以及示例demo,不过还是建议按照自己的理解和思路设计程序,官方提供的demo仅供参考。实时获取行情数据使用socket协议,需要长连接易盛提供的行情服务器,不过易盛提供的sdk内部会维护长连接,开发者可以不做太多处理,但断线重连逻辑需要开发者编写。编写代码时需要处理两方面内容,一个是调用方,即发出请求,另一个是回调方,即响应请求。发出请求时,只要自己的应用直接调用易盛的api即可,而响应请求,这个需要自己的应用继承、重写易盛提供的相应方法,然后作为回调供易盛的sdk调用。同时需要注意回调函数内不要做比较耗时的操作,即不要堵塞易盛的回调线程。整体上讲,开发过程还是容易的,下面是流程图及一些代码示例:
TapAPIApplicationInfo tapAppInfo;
strcpy(tapAppInfo.AuthCode, authcode.c_str());
strcpy(tapAppInfo.KeyOperationLogPath, username.c_str());
ITapQuoteAPI *pTapQuote = CreateTapQuoteAPI(&tapAppInfo, result);
MarketDataSource *pDataSource = new MarketDataSource(pTapQuote, this);
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;}
}
void TAP_CDECL MarketDataSource::OnRspLogin(TAPIINT32 errorCode, const TapAPIQuotLoginRspInfo *info)
{}void TAP_CDECL MarketDataSource::OnAPIReady()
{}
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;}
}
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_;}
}
这篇关于国外期货程序化交易之行情获取讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!