编写国外期货合约报单程序,同样基于郑州易盛的sdk做二次开发,通过调用易盛的交易api完成交易报单。毕竟都是一家公司发布的sdk,所以交易api设计风格与行情api基本一致,调用逻辑也基本一致。编写代码时同样需要处理两方面内容,一个是调用方,即发出请求,另一个是回调方,即响应请求,这里不再赘述。整体上讲,交易开发过程稍微繁琐,要处理的东西多一些。主要用到的头文件为:EsForeignApiErrCode.h、EsForeignApiStruct.h、EsForeignApiType.h及EsunnyForeignApi.h,动态库为:libForeignTradeApi.so。下面是流程图及一些代码示例:
 
       1. 创建易盛TapAPI实例:
IEsunnyTradeApi *pTradeApi = CreateEsunnyForeignTradeApi(szCertInfo, &result, szLogFilePath, szAppId);
if (pTradeApi == NULL)
{LOG_INFO << "创建trade api实例失败,错误码:" << result;return;
}

通过调用CreateEsunnyForeignTradeApi()创建api实例——pTradeApi,随后调用该实例发起各种请求,比如连接服务器、用户登录、报单、撤单、查询持仓、查询资金等等。

       2. 创建TapAPI回调实例:
EsunnyTradeSpi *pTradeSpi = new EsunnyTradeSpi(pTradeApi, this);
       这个需要自己编写相应实现类,该类需继承易盛提供的IEsunnyTradeSpi类。重写该类里面的方法,以处理易盛服务器发过来的各类数据。
       3. 将上述两个实例关联起来,并发起连接服务器及用户登录:
pTradeApi->SetSpi(pTradeSpi);
pTradeSpi->connect(serverAddr, port, username, password);
       连接服务器部分代码:
void EsunnyTradeSpi::connect(string serverAddr, uint16_t port, string username, string password)
{// 保存登录信息serverAddr_ = serverAddr;port_ = port;username_ = username;password_ = password;// 设置服务器IP、端口, 并发起连接TEsAddressField addrField;strcpy(addrField.Ip, serverAddr_.c_str());addrField.Port = port_;bool ret = (pTradeApi_ != NULL) ? pTradeApi_->Open(addrField) : false;if (!ret){LOG_INFO << username_ << " 请求: 连接服务器出错" << Err_Unknown;}
}

请求发出后,OnOpen()会被回调以响应上述请求,可以在OnOpen()函数内编写用户登录逻辑,调用pTradeApi_->Login()发起登录后,OnLogin()及OnInitFinished()会依次响应上述请求,根据返回的信息,可以确定是否完成登录,以及API是否初始化完成。一旦出错,也会有相应错误码返回,方便查找问题。

void __cdecl EsunnyTradeSpi::OnOpen()
{
}void __cdecl EsunnyTradeSpi::OnLogin(const TEsLoginRspField *rsp, int errCode, const int iReqID)
{
}void __cdecl EsunnyTradeSpi::OnInitFinished(int errCode)
{
}

4. 期货报单:

       报单逻辑应该是整个交易系统的核心部分了。报单主要涉及以下函数,其中以On开头的函数均继承自IEsunnyTradeSpi类,需要开发者重写:
       (1)OrderInsert():报单请求
TEsOrderInsertReqField reqField;
memset(&reqField, 0, sizeof(TEsOrderInsertReqField));
......
......
pTradeApi_->OrderInsert(reqField, reqId);

报单参数很多,需要正确填写买卖/方向、开仓/平仓、市价/限价、委托数量、委托价格等等。这个需要查询文档及易盛提供的示例demo,填写完毕就可以调用OrderInsert()报单了。

       (2)OnRspOrderInsert():报单请求应答
void __cdecl EsunnyTradeSpi::OnRspOrderInsert(const TEsOrderInsertRspField *rsp, int errCode, const int iReqID)
{
}

报单成功后,该函数就会被回调,会明确通知是否委托成功,便于开发者处理业务逻辑。

       (3)OnRtnOrderState():委托变化通知
void __cdecl EsunnyTradeSpi::OnRtnOrderState(const TEsOrderStateNoticeField &rsp)
{
}

当委托状态发生变化时,会被回调。一般常见的委托状态主要有:正在排队、部分成交、完全成交,一次报单,如果数量比较多,一般不会一次全部成交,而是会分多批次成交,所以该函数会不断被回调。

       (4)OnRtnMatchState():成交变化推送通知
void __cdecl EsunnyTradeSpi::OnRtnMatchState(const TEsMatchStateNoticeField &rsp)
{
}

感觉该函数与(5)有重复之嫌,所以我在处理时,直接在该函数内调用函数(5),没有编写太多逻辑。

       (5)OnRtnMatchInfo():成交信息变化推送通知
void __cdecl EsunnyTradeSpi::OnRtnMatchInfo(const TEsMatchInfoNoticeField &rsp)
{
}
       该函数比较重要,返回的每一条信息都是成交信息,里面包含成交量、成交价、成交费用等等,这些都是投资者关心的数据。总体来说,OnRsp开头的函数均为发起请求后的应答函数,OnRtn开头函数均为服务器主动推送信息函数。报单需要注意,易盛对报单频率做了限制,对于普通期货账户,报单频率为10单/秒,所以这里在实际编写代码时需要编写报单流控逻辑。
       5. 查询期货账号持仓:
       查询持仓主要调用pTradeApi_->QryHold(),按照文档说明填写合适的参数即可。查询持仓响应函数为:
void __cdecl EsunnyTradeSpi::OnQryHold(const TEsHoldQryRspField *rsp, TEsIsLastType islast, int errCode, const int iReqID)
{
}

该函数需要由开发者自己重写,比较麻烦的是持仓数据不会一次全部返回,而是一批一批返回,需要自己做一次汇总计算才行。

       6. 查询期货账号资金:
       查询资金主要调用pTradeApi_->QryMoney(),按照文档说明填写合适的参数即可。查询资金响应函数为:
void __cdecl EsunnyTradeSpi::OnQryMoney(const TEsMoneyQryRspField *rsp, TEsIsLastType islast, int errCode, const int iReqID)
{
}

同样,该函数需要开发者自己重写,这个比较简单,会一次返回帐户资金相关信息,如:可用资金、今资金、昨资金、手续费、帐户市值等。

       编写完代码,如何测试程序呢?这一点还好,可以到易盛官网(http://www.esunny.com.cn/)注册交易测试账号,注册成功后账号内既有100万,这样就可以测试开仓及平仓了。上面只是些基本常用操作,其他操作则需要自己查阅api文档编写相应功能了。同样,实时交易程序必须高效而稳定,这样才能不错过任何行情,一旦出现交易信号,及时完成开仓或平仓,实现收益最大化。这里顺便提一下,易盛的外盘交易系统是有对冲机制的,比如同时报一手多单和一手空单,经过易盛的交易系统对冲后,实际是不会报单的。这样当多人同时使用同一账号报单时,实际自己也可以写对冲池先对冲一下,即同期货账号下的同品种多空对冲后在向易盛报单,这样可以进一步降低交易手续费。
       参考资料:
       http://www.esunny.com.cn/
       https://esunnyapi.gitbooks.io/esunnyapi_faq/content/EsunnyAPI.html

国外期货程序化交易之报单流程讲解相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 【学习笔记】超简单的多项式除法(含完整证明)
  2. Report_报表中Ref Cursor数据源的概念和用法(案例)
  3. 【李超树】李超线段树维护凸包(凸壳) (例题:blue mary开公司+线段游戏+ZZH的旅行)
  4. Spring MVC 4快速入门Maven原型已改进
  5. H.264算法的DSP移植与优化
  6. SpringBoot项目整合Retrofit最佳实践,这才是最优雅的HTTP客户端工具!
  7. ActionBarSherlock SlidingMenu整合,解决SlidingMenu example的getSupportActionBar()方法不能用问题
  8. python图片转视频加特效_使用Python opencv实现视频与图片的相互转换
  9. .html(),.text()和.val()的差异总结:
  10. iOS开发之Xcode项目文件自动展开问题的解决办法
  11. spring学习4-bean配置文件
  12. Maven中央仓库地址和Nexus 下载地址
  13. OpenKM文档管理系统开源源码v6.3.9
  14. 晶振选型需要注意哪些事项?-台湾TST嘉硕
  15. 订单里面有多个商品的问题怎么解决
  16. 区块链技术开发公司谈区块链如何优化产业链
  17. 滚!你的程序员同事才没空抛弃你,他在…
  18. 他是这么解决视频版权的,南京小伙做视频剪辑,一个月赚了7k多
  19. ThinkPad E520 win7 64 无线网卡无法开启
  20. oracle分页查询SQL模板

热门文章

  1. leetcode 层序遍历之我要打十个(上)
  2. R语言ggplot2可视化:通过在element_text函数中设置标签字体大小列表和标签字体形式列表自定义标签可视化效果
  3. 基于自然语言处理的灾难预警
  4. Android 音乐播放器的开发教程(二)反编译apk ----- 小达
  5. C语言 统计输入任意多数字的偶数和奇数的个数,并输出相应的内容
  6. 畅谈绿色数据库的应用
  7. Fully Convolutional Networks for Semantic Segmentation(FCN)阅读理解
  8. linux设备驱动——andriod平台wlan驱动,招聘丨新年招新季,加入Qualcomm连接世界!...
  9. 图书馆管理系统 (C语言)
  10. 分享一个自己做的截图小工具(基于Windows平台的批处理文件实现)