/TdxTradeServer

TongDaXin Tarde Server 通达信交易服务器

Primary LanguageC++

TongDaXin Trade Server

概述

本程序实现了一个服务器,用来接收交易请求,并将请求转发给trade.dll,使其可以通过rest api 被其它程序调用。

注意,注意,注意: 本程序不提供trade.dll文件,仅仅调用该dll库进行交易,并将其封装成rest api使用,
我们也不会提供任何trade.dll文件给使用者(关于trade.dll,请自行百度\谷歌)
如需技术支持,可以想办法联系我。

结构图

+--------------------------------------------------------------+
|              Your Quant or Other System                      |
|                                                              |
|                                                              |
|  +----------------------+ +----------------------------------+
|  |                      | |                                 ||
|  |  Python client Api   | |  Other Language Apis            ||
|  |  pytdx               | |                                 ||
|  |                      | |                                 ||
|  |                      | |                                 ||
|  +----------------------+ +----------------------------------+
|                                                              |
|                                                              |
+----------------------------+---^-----------------------------+
                             |   |
+----------------------------v---+-----------------------------+
|                                                              |
|          TongDaXin Trade SerVer Listening : 10092 port       |
|                               +                              |
|                               |      +---------------------+ |
|                               |      |                     | |
|                               +----->+      Trade.dll      | |
|                                      |                     | |
|                                      |                     | |
|                            +         +---------------------+ |
+--------------------------------^-----------------------------+
                             |   |
+----------------------------v---+-----------------------------+
|                                                              |
|                  Tong Da Xin Trade Servers                   |
|                                                              |
|                                                              |
|                                                              |
+--------------------------------------------------------------+

构建

本程序使用QT5.9.1开发,使用restbed作为web server实现,使用jsonformoderncpp作为json序列化和反序列化工具,使用conan作为c++依赖库的管理。 请使用兼容c++11的编译器编译(这里我使用的vs2015的编译器,理论上mingw应该也可以)

构建过程

  1. 安装python
  2. 安装Conan
  3. 安装Qt 并配置VS2015 C++ Compiler
  4. 配置git
  5. 安装cmake
  6. 配置git,mingz,cmake命令在系统path中可以调用
  7. 安装msys2 (openssl编译需要)
  8. 在msys2中安装perl, cmake
pacman -S perl
pacman -S make
  1. 配置conan.conf
[general]
bash_path="c:\msys32\bin\bash"
..
[settings_defaults]
arch=x86
compiler=Visual Studio
compiler.version=14
compiler.runtime=MTd
build_type=Debug
os=Windows
  1. 在项目目录下执行
conan install --build zlib --buildOpenSSL --build asio --build restbed

然后打开QT Creator编译即可。

配置

我们可以通过配置文件来配置系统,配置文件可以在如下两个地方被放置

  1. [程序运行目录]/TdxTradeServer.ini
  2. ~/TdxTradeServer/TdxTradeServer.ini , ~ 代表当前用户的主目录

配置文件Demo

bind=10.11.5.175    ; 绑定的ip地址,默认是127.0.0.1
port=10092          ; 绑定的端口
trade_dll_path=D:\\trade_rainx.dll   ;一份可以使用的trade.dll文件
transport_enc_key=4f1cf3fec4c84c84   ; 可选, aes加密秘钥
transport_enc_iv=0c78abc083b011e7    ; 可选, aes加密iv

注意,后面的加密选项为可选,如果transport_enc_key 或者 transport_enc_iv 不提供的话,将使用明文和client api通讯,请注意和client api保持一致。 如果您跨机器调用接口,建议使用加密功能,并且,请生成随即密钥和iv, 注意,我们这里keyiv必须是16个字节

通讯协议

服务器端通过restbed实现了一个webserver, 程序会提供 http://[your_bind]:[your_port]/api endpoint, 所有的交互都由客户端通过HTTP POST到本endpoint 实现。

  • 请求的内容(payload)放在Request的Body中
  • 应答的内容(payload)放在Response的Body中
  • 在非加密的情况下,payload 使用json序列化方式传输
  • 在加密情况下,payload 使用 URLENCODE(BASE64(AES128_CBC(JSON(PAYLOAD)))) 结构加密传输,双方都采用相同方式加密解密

请求的内容结构如下

{
    "func": "one_function",
    "params": {
        "param1": "p1",
        "param2": "p2"
    }
}

应答的结构如下

{
    "success": true,
    "data": {
        ....
    },
    "error": "some errors only appear when success is False"
}

测试连通性

假设端口为 19820

In [5]: requests.post("http://127.0.0.1:19820/api", json={"func":"ping"}).text
Out[5]: '{"success":true, "data": "pong"}'

In [6]: requests.get("http://127.0.0.1:19820/status").text
Out[6]: '{"reqnum":1,"success":true}'