Back to Wondertrader

Swordfish-MDS API {#mainpage}

src/API/oesApi0.17.5.8/include/mds_api/README.md

0.9.97.5 KB
Original Source

Swordfish-MDS API {#mainpage}

箭鱼行情数据服务系统API使用说明


Quick Start

1.1 示例代码

  • 参见 samples/mds_sample 目录下的样例文件
    • 配置文件样例 <mds_client_sample.conf>
    • TCP行情对接的样例代码 (基于异步API实现) <01_mds_async_tcp_sample.c>
    • TCP行情对接的样例代码 (精简版本, 基于异步API实现) <02_mds_async_tcp_sample.minimal.c>
    • UDP行情对接的样例代码 (基于异步API实现) <03_mds_async_udp_sample.c>
    • TCP行情对接的样例代码 (基于同步API实现) <04_mds_sync_tcp_sample.c>
    • UDP行情对接的样例代码 (基于同步API实现) <05_mds_sync_udp_sample.c>
    • 证券静态信息查询和快照行情查询的样例代码 <06_mds_query_sample.c>
    • 通过查询证券静态信息来订阅行情的样例代码 <08_mds_subscribe_by_query_detail_sample.c>
    • 用于样例代码编译的 Makefile <Makefile.sample>

04_mds_sync_tcp_sample.c 摘录如下:

{.c}

/**
 * 通过证券代码列表, 重新订阅行情数据 (根据代码后缀区分所属市场, 如果没有指定后缀, 则默认为上证股票)
 *
 * @param   pTcpChannel         会话信息
 * @param   pCodeListString     证券代码列表字符串 (以空格或逗号/分号/竖线分割的字符串)
 * @return  TRUE 成功; FALSE 失败
 */
static BOOL
MdsApiSample_ResubscribeByCodePostfix(MdsApiSessionInfoT *pTcpChannel,
        const char *pCodeListString) {
    return MdsApi_SubscribeByString(pTcpChannel,
            pCodeListString, (char *) NULL,
            MDS_EXCH_SSE, MDS_MD_PRODUCT_TYPE_STOCK, MDS_SUB_MODE_SET,
            MDS_SUB_DATA_TYPE_L1_SNAPSHOT
                    | MDS_SUB_DATA_TYPE_L2_SNAPSHOT
                    | MDS_SUB_DATA_TYPE_L2_BEST_ORDERS);
}


/**
 * 进行消息处理的回调函数
 *
 * @param   pSessionInfo        会话信息
 * @param   pMsgHead            回报消息的消息头
 * @param   pMsgItem            回报消息的数据条目 (需要根据消息类型转换为对应的数据结构)
 * @param   pCallbackParams     外部传入的参数
 * @retval  >=0                 大于等于0, 成功
 * @retval  <0                  小于0, 处理失败 (负的错误号)
 */
static int32
MdsApiSample_HandleMsg(MdsApiSessionInfoT *pSessionInfo,
        SMsgHeadT *pMsgHead, void *pMsgItem, void *pCallbackParams) {
    MdsMktRspMsgBodyT   *pRspMsg = (MdsMktRspMsgBodyT *) pMsgItem;

    /*
     * 根据消息类型对行情消息进行处理
     */
    switch (pMsgHead->msgId) {
    case MDS_MSGTYPE_L2_MARKET_DATA_SNAPSHOT:
    case MDS_MSGTYPE_L2_BEST_ORDERS_SNAPSHOT:
        /* 处理Level2快照行情消息 */
        printf("... 接收到Level2快照行情消息 (exchId[%hhu], instrId[%d])\n",
                pRspMsg->mktDataSnapshot.head.exchId,
                pRspMsg->mktDataSnapshot.head.instrId);
        break;

    case MDS_MSGTYPE_L2_TRADE:
    case ...:
         ...
    }

    return 0;
}


int
main(int argc, char *argv[]) {
    /* 配置文件 */
    static const char   THE_CONFIG_FILE_NAME[] = "mds_client_sample.conf";
    /* 尝试等待行情消息到达的超时时间 (毫秒) */
    static const int32  THE_TIMEOUT_MS = 1000;

    MdsApiClientEnvT    cliEnv = {NULLOBJ_MDSAPI_CLIENT_ENV};
    int32               ret = 0;

    /* 初始化客户端环境 (配置文件参见: mds_client_sample.conf) */
    if (! MdsApi_InitAllByConvention(&cliEnv, THE_CONFIG_FILE_NAME)) {
        return -1;
    }

    /* 根据证券代码列表重新订阅行情 (根据代码后缀区分所属市场) */
    if (! MdsApiSample_ResubscribeByCodePostfix(&cliEnv.tcpChannel,
            "600000.SH, 600001.SH, 000001.SZ, 0000002.SZ")) {
        goto ON_ERROR;
    }

    while (1) {
        /* 等待行情消息到达, 并通过回调函数对消息进行处理 */
        ret = MdsApi_WaitOnMsg(&cliEnv.tcpChannel, THE_TIMEOUT_MS,
                MdsApiSample_HandleMsg, NULL);
        if (__spk_unlikely(ret < 0)) {
            if (__spk_likely(SPK_IS_NEG_ETIMEDOUT(ret))) {
                /* 执行超时检查 (检查会话是否已超时) */
                continue;
            }

            if (SPK_IS_NEG_EPIPE(ret)) {
                /* 连接已断开 */
            }
            goto ON_ERROR;
        }
    }

    MdsApi_LogoutAll(&cliEnv, TRUE);
    return 0;

ON_ERROR:
    MdsApi_DestoryAll(&cliEnv);
    return -1;
}

1.2 示例代码的编译和运行

  1. 进入样例代码目录

    • cd mds_libs-xxx/samples/mds_sample/
  2. 编译代码

    • make -f Makefile.sample
  3. 修改配置文件,确认服务地址、用户名等正确

    • vi mds_client_sample.conf
  4. 运行样例程序

    • ./mds_subscribe_sample
    • ./mds_async_api_sample
    • ./mds_async_udp_sample

版本升级指引及修改历史

  • 版本升级指引参见 <@ref update_guide>
  • 版本修改历史参见 <@ref changelog>

常见问题

  • 价格和金额单位

    • MDS中的所有价格均为int32类型的整型数值,单位精确到元后四位, 即: 1元=10000
    • MDS中的所有金额均为int64类型的整型数值,单位精确到元后四位, 即: 1元=10000
  • 份额单位

    • MDS中的所有委托数量、成交数量等份额单位均为int32int64类型的整型数值,不带小数位
    • 注意: 上海债券的份额单位是 <b>'手'</b>,而不是 '张',与其它不同
  • MDS中的行情时间(updateTime)是交易所时间吗?

    • 是的,该时间来源于交易所,是行情数据的生成时间或者上游发送时间(如果采集不到行情生成时间的话)

MDS错误码表

错误码错误说明
1001报文格式错误
1002当前主机不是主节点
1003主存库操作失败
1004因状态等基础数据不匹配,无法更新数据
1005协议版本不兼容
1006数据不存在
1007非服务开放时间
1008非法的定位游标
1009非法的客户端登录用户名称
1010非法的证券代码
1011非法的客户代码
1012非法的客户端类型
1013客户端已被禁用
1014客户端密码不正确
1015客户端重复登录
1016客户端连接数量过多
1017客户端未经授权操作他人账户
1018数据超出修改范围
1019非法的应用系统名称
1020查询条件不匹配
1021客户端ip/mac地址格式错误
1022尚不支持或尚未开通此业务
1029密码未改变
1031非法的加密类型
1033无可用节点
1034密码强度不足
1035非法的产品类型
1036未通过黑白名单检查
1037集群编号不匹配
1038无此操作权限
1039非法的指令类型
1040数据已存在
1041需要再次尝试
1042非法的委托方式
1301行情订阅失败