• 易盛内外通用版交易API转websocket


    一、前言

        因为一些工作需要,所以研究了一下易盛交易API,然后想到C++对于很多人来说还是非常不友好的所以就想着说要不写一个C++转websocket(以下简称WS)的接口,用WS接口不就可以跨全部平台来交易了吗(特别是WEB和python)?后来在研究和转写的过程中,发现从技术的角度来说其实很没有必要,所以弄了一半,搞了个框架就懒得搞了。但是折腾了几个月不能浪费了对吧,所以就分享出来给大家一起研究学习了。

        此前已经写了两篇相关的,分别是如何搭建交易API的环境,以及WS server的demo:

        https://www.cnblogs.com/cation/p/15245161.html

        https://www.cnblogs.com/cation/p/15254165.html

    二、思路

        1、主线程启动后,启动WS的Server,并一直监听client

        2、client连接后启动子进程

        3、子进程内获取client的消息

        4、通过对消息的识别来实现“登陆、登出、查询、下单”等操作

    三、代码

        腾讯微云下载

        https://share.weiyun.com/qrgMVIzX

    四、使用

        1、准备

        跟代码一起奉送的是一个WS client。

        另外你还得有个API授权码,不过易盛demo中是带了测试账号和授权码的。

        开发环境自己搞定,然后启动项目。

        2、登陆

        先启动项目,启动后再启动WS client。

        WS clinet连接成功时会报一个“Illegal JSON format”的error,是正常的,因为这个client会有个广告词启动时发给server,属于可识别范围外的字符所以就会报一个error。

         填入JSON字符,发送给server后就登陆API了。可以看到登陆成功后会收到一系列的RSP。

         登陆成功后还是发JSON字符串,比如下面做个查询。

    五、已支持的指令

    ========登陆 登出========
    启明星登陆
    {"command":"login","ip":"XXXXXXX","port":XXXXXXX,"auth":"XXXXXXX","type":"QMX","username":"XXXXXXX","password":"XXXXXXX"}
    北斗星登陆
    {"command":"login","ip":"XXXXXXX","port":XXXXXXX,"auth":"XXXXXXX","type":"BDX","username":"XXXXXXX","password":"XXXXXXX"}
    登出
    {"command":"logout"}

    ========查询指令 qry========
    查持仓
    {"command":"qry","item":"position","username":"XXXXXXX"}
    {"command":"qry","item":"position_sum","username":"XXXXXXX"}
    查资金
    {"command":"qry","item":"fund","username":"XXXXXXX"}
    查委托
    {"command":"qry","item":"order","username":"XXXXXXX"}
    查成交
    {"command":"qry","item":"fill","username":"XXXXXXX"}

    ========下单指令 order========
    最常见:限价、期货、日内、买入、1手
    {"command":"order","item":"insert","username":"XXXXXXX","ExchangeNo":"CME","CommodityType":"F","CommodityNo":"ES","ContractNo":"2112","TimeInForce":"GFD","OrderType":"limit","OrderSide":"B","OrderPrice":4300,"OrderQty":1}
    {"command":"order","item":"insert","username":"XXXXXXX","ExchangeNo":"CME","CommodityType":"F","CommodityNo":"ES","ContractNo":"2112","TimeInForce":"GTD","ExpireTime":"2021-12-31","OrderType":"limit","OrderSide":"B","OrderPrice":4300,"OrderQty":1}

    我自己瞎定义的Error code:
    -1000 just one client allow
    -1001 Illegal JSON forma
    -1002 can not find key:command
    -1003 login时的各种可能错误
    -1004 login repeat
    -1005 urecognized command
    -1006 trans command error and catch...
    -1007 command can not anlysis
    -1008 GET指令执行时各种可能错误
    -1009 QRY指令执行时各种可能错误
    -1010 ORDER指令执行时各种可能错误
    -1011 SET指令执行时各种可能错误
    -1012 need login 没有登录就执行各种命令
    -1013 登陆失败
    -1014 API未准备好
    -1015 rspMsg2Client(sClient, "error", "-1015", "InsertOrder Error iErr="+ iErr); 下单失败
    success code:
    1000 rspMsg2Client(sockClient, "rsp", "1000", "WSServer ready"); server 准备好了
    1001 rspMsg2Client(sockClient, "rsp", "1001", "received"); 收到了client的消息 回报
    1002 rspMsg2Client(sockClient, "rsp","1002", "login submit"); 提交了登陆信息,回报
    1003 rspMsg2Client(sockClient, "rsp","1003","logout submit"); 提交了登出信息 回报
    1004 rspMsg2Client(sClient,"rsp", "1004", "OnConnect"); 提交登陆后触发了onConnect
    1005 rspMsg2Client(sClient, "rsp", "1005", "OnRspLogin"); 提交登陆后触发了OnRspLogin
    1006 rspMsg2Client(sClient, "rsp", "1006", "OnAPIReady"); 提交登陆后触发了OnAPIReady
    1007 rspMsg2Client(sClient, "rsp", "1007", "OnDisconnect"); 登陆后触发了OnDisconnect
    1008 rspMsg2Client(sClient, "rsp", "1008", "OnRspSubmitUserLoginInfo"); 启明星用
    1009 rspMsg2Client(sockClient, "rsp", "1009", "qry submit"); 提交了查询的回报
    1010 rspMsg2Client(sClient, "rsp", "1010", charsw); 返回查询的position信息
    1011 rspMsg2Client(sClient, "rsp", "1011", charsw); 返回查询的position_sum信息
    1012 rspMsg2Client(sClient, "rsp", "1012", charsw); 返回查询的fund信息
    1013 rspMsg2Client(sClient, "rsp", "1013", charsw); 返回查询的order信息
    1014 rspMsg2Client(sClient, "rsp", "1014", charsw); 返回查询的fill信息
    1015 rspMsg2Client(sockClient, "rsp", "1015", "order submit"); 提交了订单的回报
    1016 rspMsg2Client(sClient, "rsp", "1016", "order insert done"); 成功下单的回报

    1 OnConnect
    1 OnAPIReady
    1 OnDisconnect
    1 OnRspLogin
    1 logout_submit

    六、回顾

        其实API本身并不复杂,甚至还有点简洁,这也是为啥我后来觉得转成WS接口没有意义了,不过折腾了不短的时间,就分享给大家,也算是一个思路了,有感兴趣的可以继续加把劲丰富一下!反正我是没精力了。

  • 相关阅读:
    IT轮子系列(七)——winform 版本更新组件
    IT轮子系列(六)——Excel上传与解析,一套代码解决所有Excel业务上传,你Get到了吗
    IT轮子系列(四)——使用Jquery+formdata对象 上传 文件
    IT轮子系列(一)——DropDownList 的绑定(二)
    IT轮子系列(五)——MVC API 文件上传,总有一款是你需要的
    IT轮子系列(三)——如何显示方法名——Swagger的使用(三)
    IT轮子系列(三)——如何给返回类型添加注释——Swagger的使用(二)
    IT轮子系列(二)——mvc API 说明文档的自动生成——Swagger的使用(一)
    IT轮子系列(一)——DropDownList 的绑定,你秒懂了吗
    python3.7 安装 xlrd 模块---Mac
  • 原文地址:https://www.cnblogs.com/cation/p/15468449.html
Copyright © 2020-2023  润新知