交易及银期转账

交易账户结构

用户(USER)

一个用户由一个唯一的 USER_ID 标识. 每个用户的账户信息互相独立.

在任一时刻, 一个用户的交易账户可以由以下信息完整描述

  • 1-N个资金账户(ACCOUNT)
  • 0-N个持仓记录(POSITION)
  • 0-N个委托单(ORDER)

这些信息完整的描述了用户交易账户的[当前状态]. 需要注意的是, 用户过往的交易记录, 转账记录等并不在其中, 那些信息对于用户的交易动作没有任何影响.

资金账户(ACCOUNT)

每个资金账户由一个 ACCOUNT_ID 标识. 一个USER可以同时拥有多个ACCOUNT. 每个 ACCOUNT 中的各字段都使用同一币种.

下面是一个ACCOUNT的内容示例:

"CNY": {
  //核心字段
  "account_id": "423423",                   //账号
  "currency": "CNY",                        //币种
  "balance": 9963216.550000003,             //账户权益
  "available": 9480176.150000002,           //可用资金
  //参考字段
  "pre_balance": 12345,                     //上一交易日结算时的账户权益
  "deposit": 42344,                         //本交易日内的入金金额
  "withdraw": 42344,                        //本交易日内的出金金额
  "commission": 123,                        //本交易日内交纳的手续费
  "premium": 123,                           //本交易日内交纳的权利金
  "static_balance": 124895,                 //静态权益
  "position_profit": 12345,                 //持仓盈亏
  "float_profit": 8910.231,                 //浮动盈亏
  "risk_ratio": 0.048482375,                //风险度
  "margin": 11232.23,                       //占用资金
  "frozen_margin": 12345,                   //冻结保证金
  "frozen_commission": 123,                 //冻结手续费
  "frozen_premium": 123,                    //冻结权利金
  "close_profit": 12345,                    //本交易日内平仓盈亏
  "position_profit": 12345,                 //当前持仓盈亏
  "position_profit": 12345,                 //当前持仓盈亏
}

持仓(POSITION)

每个持仓项描述一个合约的当前持仓情况. 通常以相应的合约代码(SYMBOL)作为KEY

下面是一个 POSITION 的内容示例:

"SHFE.cu1801":{                             //position_key=symbol
  //核心字段
  "exchange_id": "SHFE",                    //交易所
  "instrument_id": "cu1801",                //合约代码
  //参考字段
  "hedge_flag": "SPEC",                     //套保标记
  "open_price_long": 3203.5,                //多头开仓均价
  "open_price_short": 3100.5,               //空头开仓均价
  "open_cost_long": 3203.5,                 //多头开仓成本
  "open_cost_short": 3100.5,                //空头开仓成本
  "float_profit_long": 32324.4,             //多头浮动盈亏
  "float_profit_short": 32324.4,            //空头浮动盈亏
  "position_cost_long": 32324.4,            //多头持仓成本
  "position_cost_short": 32324.4,           //空头持仓成本
  "position_profit_long": 32324.4,          //多头浮动盈亏
  "position_profit_long": 32324.4,          //空头浮动盈亏
  "volume_long_today": 5,                   //多头今仓持仓手数
  "volume_long_his": 5,                     //多头老仓持仓手数
  "volume_short_today": 5,                  //空头今仓持仓手数
  "volume_short_his": 5,                    //空头老仓持仓手数
  "margin_long": 32324.4,                   //多头持仓占用保证金
  "margin_short": 32324.4,                  //空头持仓占用保证金
  "order_volume_buy_open": 1,               //买开仓挂单手数
  "order_volume_buy_close": 1,              //买平仓挂单手数
  "order_volume_sell_open": 1,              //卖开仓挂单手数
  "order_volume_sell_close": 1,             //卖平仓挂单手数
}

委托单(ORDER)

委托单的单号:

  • 每个委托单都必须有一个单号, 单号可以是不超过128个字节长的任意中英文字符, 数字和点号(.)组合.
  • 单号由发出下单指令的终端负责设定. 它必须保证, 对于同一个USER, 每个单号都是不重复的.
  • 单号中如果出现了点号(.), 将被视为 unit 分隔符使用 (详见下文 UNIT 说明)

委托单状态:

  • 任何一个委托单的状态只会是这两种之一: FINISHED 或 ALIVE
  • FINISHED: 已经可以确定, 这个委托单以后不会再产生任何新的成交
  • ALIVE: 除上一种情况外的其它任何情况, 委托单状态都标记为 ALIVE, 即这个委托单还有可能产生新的成交

下面是一个 ORDER 的内容示例:

"123": {                                    //order_id, 用于唯一标识一个委托单. 对于一个USER, order_id 是永远不重复的
  //核心字段
  "order_id": "123",                        //委托单ID, 对于一个USER, order_id 是永远不重复的
  "order_type": "TRADE",                    //指令类型
  "exchange_id": "SHFE",                    //交易所
  "instrument_id": "cu1801",                //在交易所中的合约代码
  "direction": "BUY",                       //下单方向
  "offset": "OPEN",                         //开平标志
  "volume_orign": 6,                        //总报单手数
  "volume_left": 3,                         //未成交手数
  "trade_type": "TAKEPROFIT",               //指令类型
  "price_type": "LIMIT",                    //指令类型
  "limit_price": 45000,                     //委托价格, 仅当 price_type = LIMIT 时有效
  "time_condition":   "GTD",                  //时间条件
  "volume_condition": "ANY",                //数量条件
  "min_volume": 0,
  "hedge_flag": "SPECULATION",              //保值标志
  "status": "ALIVE",                        //委托单状态, ALIVE=有效, FINISHED=已完
  //参考字段
  "last_msg": "",                           //最后操作信息
  "force_close": "NOT",                     //强平原因
  "frozen_money":     15750,                    //冻结金额
  "insert_date_time": "151754",             //下单时间
  "exchange_order_id": "434214",            //交易所单号
}

交易单元(UNIT)

为满足委托单管理的需求, 本协议中定义了交易单元的概念. 每个交易单元拥有自己独立的一组 持仓/委托单/资金盈亏/资金占用 信息.

交易者在发出委托单时, 可以通过委托单的单号指定委托单所属的交易单元, 由此委托单产生的交易后果, 都会被归属统计到相应的交易单元中.

下面举例说明UNIT的用法:

终端发出一个下单指令:

{
  "aid": "insert_order",
  "order_id": "策略1.0001",
  "instrument_id": "cu1810",
  "direction": "BUY",
  "volume": 1,
  "offset": "OPEN",
}

这个委托单指定了 order_id = “策略1.0001”, 其中的 “策略1” 被作为交易单元处理. 当这个委托单成交后, 交易单元 “策略1” 中会记录当前持仓情况:

"策略1": {
  "positions": {
    "SHFE.cu1810":{
      "volume_long": 1,
    }
  },
}

如果终端再发出另一个下单指令:

{
  "aid": "insert_order",
  "order_id": "策略2.0001",
  "instrument_id": "cu1810",
  "direction": "BUY",
  "offset": "OPEN",
  "volume": 1,
}

成交以后, 交易单元记录情况将变成:

{
  "策略1": {
    "positions": {
      "SHFE.cu1810":{
        "volume_long": 1,
      }
    },
  },
  "策略2": {
    "positions": {
      "SHFE.cu1810":{
        "volume_long": 1,
      }
    },
  }
}

更进一步, 交易单元还支持层级结构. 例如, 单号为 AA.BB.CC.D 的委托单, 同时属于以下几个unit

  • root unit, unit_id == “”
  • AA
  • AA.BB
  • AA.BB.CC

一个 UNIT 的完整内容示例如下:

"A": {
  "stat": {
    "close_profit": 342340
  },
  "positions": {                        // UNIT 中的持仓情况
    "SHFE.cu1810":{
      "unit_id": "A",
      "symbol": "SHFE.cu1810",
      "volume_long": 10,
      "volume_short": 0,
      "cost_long": 4324230,
      "cost_short": 0,

      "order_volume_buy_open": 0,
      "order_volume_sell_open": 0,
      "order_volume_buy_close": 0,
      "order_volume_sell_close": 0,
    }
  },
}

交易账户信息同步

交易账户信息通过 rtn_data 包的 trade 字段进行差分发送, 如下所示:

{
  "aid": "rtn_data",                                      //数据推送
  "data": [                                               //diff数据数组, 一次推送中可能含有多个数据包
  {
    "trade": {                                            //交易相关数据
      "user1": {                                          //登录用户名
        "user_id": "user1",                               //登录用户名
        "accounts": {                                     //账户资金信息
          "CNY": {                                        //account_key, 通常为币种代码
            //核心字段
            "account_id": "423423",                       //账号
            "currency": "CNY",                            //币种
            "balance": 9963216.550000003,                 //账户权益
            "available": 9480176.150000002,               //可用资金
            //参考字段
            "pre_balance": 12345,                         //上一交易日结算时的账户权益
            "deposit": 42344,                             //本交易日内的入金金额
            "withdraw": 42344,                            //本交易日内的出金金额
            "commission": 123,                            //本交易日内交纳的手续费
            "preminum": 123,                              //本交易日内交纳的权利金
            "static_balance": 124895,                     //静态权益
            "position_profit": 12345,                     //持仓盈亏
            "float_profit": 8910.231,                     //浮动盈亏
            "risk_ratio": 0.048482375,                    //风险度
            "margin": 11232.23,                           //占用资金
            "frozen_margin": 12345,                       //冻结保证金
            "frozen_commission": 123,                     //冻结手续费
            "frozen_premium": 123,                        //冻结权利金
            "close_profit": 12345,                        //本交易日内平仓盈亏
            "position_profit": 12345,                     //当前持仓盈亏
          }
        },
        "positions": {                                    //持仓
          "SHFE.cu1801": {                                //合约代码
            //核心字段
            "exchange_id": "SHFE",                        //交易所
            "instrument_id": "cu1801",                    //合约代码
            //参考字段
            "hedge_flag": "SPEC",                         //套保标记
            "open_price_long": 3203.5,                    //多头开仓均价
            "open_price_short": 3100.5,                   //空头开仓均价
            "open_cost_long": 3203.5,                     //多头开仓成本
            "open_cost_short": 3100.5,                    //空头开仓成本
            "float_profit_long": 32324.4,                 //多头浮动盈亏
            "float_profit_short": 32324.4,                //空头浮动盈亏
            "position_cost_long": 32324.4,                //多头持仓成本
            "position_cost_short": 32324.4,               //空头持仓成本
            "position_profit_long": 32324.4,              //多头浮动盈亏
            "position_profit_long": 32324.4,              //空头浮动盈亏
            "volume_long_today": 5,                       //多头今仓持仓手数
            "volume_long_his": 5,                         //多头老仓持仓手数
            "volume_short_today": 5,                      //空头今仓持仓手数
            "volume_short_his": 5,                        //空头老仓持仓手数
            "margin_long": 32324.4,                       //多头持仓占用保证金
            "margin_short": 32324.4,                      //空头持仓占用保证金
            "order_volume_buy_open": 1,                   //买开仓挂单手数
            "order_volume_buy_close": 1,                  //买平仓挂单手数
            "order_volume_sell_open": 1,                  //卖开仓挂单手数
            "order_volume_sell_close": 1,                 //卖平仓挂单手数
          }
        },
        "orders": {                                       //委托单
          "123": {                                        //order_id, 用于唯一标识一个委托单. 对于一个USER, order_id 是永远不重复的
            //核心字段
            "order_id": "123",                            //委托单ID, 对于一个USER, order_id 是永远不重复的
            "order_type": "TRADE",                        //指令类型
            "exchange_id": "SHFE",                        //交易所
            "instrument_id": "cu1801",                    //在交易所中的合约代码
            "direction": "BUY",                           //下单方向, BUY=
            "offset": "OPEN",                             //开平标志
            "volume_orign": 6,                            //总报单手数
            "volume_left": 3,                             //未成交手数
            "trade_type": "TAKEPROFIT",                   //指令类型
            "price_type": "LIMIT",                        //指令类型
            "limit_price": 45000,                         //委托价格, 仅当 price_type = LIMIT 时有效
            "time_condition": "GTD",                      //时间条件
            "volume_condition": "ANY",                    //数量条件
            "min_volume": 0,
            "hedge_flag": "SPECULATION",                  //保值标志
            "status": "ALIVE",                            //委托单状态, ALIVE=有效, FINISHED=已完
            //参考字段
            "last_msg":       "",                               //最后操作信息
            "force_close": "NOT",                         //强平原因
            "frozen_money":   15750,                        //冻结金额
            "insert_date_time":       "151754",                 //下单时间
            "exchange_order_id": "434214",                //交易所单号
          }
        },
        "trades": {                                       //成交记录
          "123|1": {                                      //trade_key, 用于唯一标识一个成交项
            "order_id": "123",
            "exchange_id": "SHFE",                        //交易所
            "instrument_id": "cu1801",                    //交易所内的合约代码
            "exchange_trade_id": "1243",                  //交易所成交号
            "direction": "BUY",                           //成交方向
            "offset": "OPEN",                             //开平标志
            "volume": 6,                                  //成交手数
            "price": 1234.5,                              //成交价格
            "trade_date_time": 1928374000000000           //成交时间
          }
        },
      },
    },
    ]
  }
}

终端登录鉴权

我们使用 aid = “req_login” 的包作为登录请求包. 此包的结构由具体的实现定义. 以 Open Trade Gateway 项目为例, req_login 包结构如下:

{
  "aid": "req_login",
  "bid": "aaa",
  "user_name": "43214",
  "password": "abcd123",
}

登录成功或失败的信息, 通过 notify 发送

交易指令

下单

终端通过发送 insert_order 包实现下单

{
  "aid": "insert_order",                    //必填, 下单请求
  "order_id": "SomeStrategy.Instance1.001", //必填, 委托单号, 需确保在一个账号中不重复, 限长512字节
  "user_id": "user1",                       //可选, 与登录用户名一致, 在只登录了一个用户的情况下,此字段可省略
  "exchange_id": "SHFE",                    //必填, 下单到哪个交易所
  "instrument_id": "cu1803",                //必填, 下单合约代码
  "direction": "BUY",                       //必填, 下单买卖方向
  "offset": "OPEN",                         //可选, 下单开平方向, 当指令相关对象不支持开平机制(例如股票)时可不填写此字段
  "volume": 1,                              //必填, 下单手数
  "price_type": "LIMIT",                    //必填, 报单价格类型
  "limit_price": 30502,                     //当 price_type == LIMIT 时需要填写此字段, 报单价格
}

撤单

终端通过发送 cancel_order 包实现撤单

{
  "aid": "cancel_order",                    //必填, 撤单请求
  "order_id": "0001",                       //必填, 委托单的order_id
}

银期转账

签约银行和转账记录

签约银行和转账记录信息由 rtn_data 包中 trade 部分的 banks 和 transfers 发送, 如下所示

{
  "aid": "rtn_data",                                        //数据推送
  "data": [                                                 //diff数据数组, 一次推送中可能含有多个数据包
    {
      "trade": {                                            //交易相关数据
        "user1": {                                          //登录用户名
          "banks": {                                        //用户相关银行
            "bank1": {
              "id": "4324",
              "brch_id": "1234",
              "name": "工行",
              "account": "3421321",
            }
          },
          "transfers": {                                    //账户转账记录
            "0001": {
              "datetime": "2017/03/01 14:30:00"             //转账时间
              "trade_type": "BTOF",                         //业务类型
              "amount": 3243,                               //涉及金额
              "currency": "CNY",                            //币种
              "bank_account": "32423",                      //银行账号
            }
          },
        },
      },
    ]
  }
}

请求银期转账

{
  "aid": "req_transfer",                                    //必填, 转账请求
  "future_account": "0001",                                 //必填, 期货账户
  "future_account_password": "0001",                        //必填, 期货账户密码
  "bank_id": "0001",                                        //必填, 银行ID
  "bank_brch_id": "0001",                                   //必填, 银行分支代码
  "bank_account": "0001",                                   //必填, 银行账户
  "bank_password": "0001",                                  //必填, 银行账户密码
  "currency": "0001",                                       //必填, 委托单的order_id
  "amount": "0001",                                         //必填, 委托单的order_id
}

转账操作的结果, 将由转账记录同步的方式提供给终端

字段常量表

order_type

Name Value/Description
TRADE 交易指令
SWAP 互换交易指令
EXECUTE 期权行权指令
QUOTE 期权询价指令

trade_type

Name Value/Description
STOPLOSS 止损
TAKEPROFIT 止盈

price_type

Name Value/Description
ANY 任意价
LIMIT 限价
BEST 最优价
FIVELEVEL 五档价

volume_condition

Name Value/Description
ANY 任何数量
MIN 最小数量
ALL 全部数量

time_condition

Name Value/Description
IOC 立即完成,否则撤销
GFS 本节有效
GFD 当日有效
GTD 指定日期前有效
GTC 撤销前有效
GFA 集合竞价有效

hedge_flag

Name Value/Description
SPECULATION 普通
ARBITRAGE  
HEDGE  
MARKETMAKER  

force_close

Name Value/Description
NOT 非强平
LACK_DEPOSIT 资金不足
CLIENT_POSITION_LIMIT 客户超仓
MEMBER_POSITION_LIMIT 会员超仓
POSITION_MULTIPLE 持仓非整数倍
VIOLATION 违规
OTHER 其他
PERSONAL_DELIV 自然人临近交割
HEDGE_POSITION_LIMIT 客户套保超仓

协议实现

DIFF Collection 中列出了一些本协议的开源实现