Data Access 数据访问
扩展模块运行时, TQSDK 将负责从主程序接收数据流, 并在内存中维护行情与交易数据集.
内存数据结构
TQSDK 在内存中以 javascript object 存放所有当前用到的 行情/交易 数据, 数据结构如下:
{
"quotes": { //实时行情数据
"cu1612": {
"instrument_id": "cu1612", //合约代码
"datetime": "2016-12-30 13:21:32.500000", //时间
"ask_price1": 36590.0, //卖价
"ask_volume1": 121, //卖量
"bid_price1": 36580.0, //买价
"bid_volume1": 3, //买量
"last_price": 36580.0, //最新价
"highest": 36580.0, //最高价
"lowest": 36580.0, //最低价
"amount": 213445312.5, //成交额
"volume": 23344, //成交量
"open_interest": 23344, //持仓量
"pre_open_interest": 23344, //昨持
"pre_close": 36170.0, //昨收
"open": 36270.0, //今开
"close": 36270.0, //收盘
"lower_limit": 34160.0, //跌停
"upper_limit": 38530.0, //涨停
"average": 36270.1, //均价
"pre_settlement": 36270.0, //昨结
"settlement": 36270.0, //结算价
},
...
},
"klines": { //K线数据
"cu1601": { //合约代码
180000000000: { //K线周期, 单位为纳秒, 180000000000纳秒 = 3分钟
"last_id": 3435, //整个序列最后一个记录的序号
"data": {
3384: {
"datetime": 192837400000000, //UnixNano 北京时间,如果是日线,则是交易日的 UnixNano
"open": 3432.33, //开
"high": 3432.33, //高
"low": 3432.33, //低
"close": 3432.33, //收
"volume": 2, //成交量
"open_oi": 1632, //起始持仓量
"close_oi": 1621, //结束持仓量
},
3385: {
...
},
...
},
"binding": {
"cu1709": {
3384: 2900, //本合约K线所对应的另一个合约的K线号
3385: 2950,
...
}
}
},
...
},
...
},
"ticks": {
"cu1601": {
"last_id": 3550, //整个序列最后一个元素的编号
"data": {
3384: {
"datetime": 1928374000000000, //UnixNano 北京时间
"trading_day": 1928374000000000, //交易日的UnixNano 北京时间
"last_price": 3432.33, //最新价
"highest": 3452.33, //最高价
"lowest": 3402.33, //最低价
"bid_price1": 3432.2, //买一价
"ask_price1": 3432.4, //卖一价
"bid_volume1": 1, //买一量
"ask_volume1": 2, //卖一量
"volume": 200, //成交量
"open_interest": 1621, //持仓量
},
3385: {
...
},
...
}
},
...
},
"notify": { //通知信息
"2010": {
"type": "MESSAGE", //MESSAGE TEXT
"code": 1000,
"content": "abcd",
}
},
"trade": { //交易相关数据
"user1": { //登录用户名
"user_id": "user1", //登录用户名
"session": { //当前session信息
"session_id": "1434",
"max_order_id": "4423",
},
"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, //当前持仓盈亏
"position_profit": 12345, //当前持仓盈亏
}
},
"positions": { //持仓
"SHFE.cu1801": { //position_key, 对于普通持仓, position_key=symbol, 对于
//核心字段
"exchange_id": "SHFE", //交易所
"instrument_id": "cu1801", //合约代码
"volume_long": 5, //多头持仓手数
"volume_short": 5, //空头持仓手数
"hedge_flag": "SPEC", //套保标记
//参考字段
"open_price_long": 3203.5, //多头开仓均价
"open_price_short": 3100.5, //空头开仓均价
"open_cost_long": 3203.5, //多头开仓市值
"open_cost_short": 3100.5, //空头开仓市值
"margin": 32324.4, //占用保证金
"float_profit_long": 32324.4, //多头浮动盈亏
"float_profit_short": 32324.4, //空头浮动盈亏
"volume_long_today": 5, //多头今仓手数
"volume_long_his": 5, //多头老仓手数
"volume_long_frozen": 5, //多头持仓冻结
"volume_long_frozen_today": 5, //多头今仓冻结
"volume_short_today": 5, //空头今仓手数
"volume_short_his": 5, //空头老仓手数
"volume_short_frozen": 5, //空头持仓冻结
"volume_short_frozen_today": 5, //空头今仓冻结
}
},
"orders": { //委托单
"abc|123": { //order_key, 用于唯一标识一个委托单
//核心字段
"order_type": "TRADE", //指令类型
"session_id": "abc", //会话ID
"order_id": "123", //委托单ID, 在每个会话中唯一
"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", //交易所单号
}
},
"trades": { //成交记录
"abc|123|1": { //trade_key, 用于唯一标识一个成交项
//核心字段
"session_id": "abc",
"order_id": "123",
"exchange_id": "SHFE", //交易所
"ins_id": "cu1801", //交易所内的合约代码
"exchange_trade_id": "1243", //交易所成交号
"direction": "BUY", //成交方向
"offset": "OPEN", //开平标志
"volume": 6, //成交手数
"price": 1234.5, //成交价格
//参考字段
"trade_date_time": "2017/03/04T10:30:20" //成交时间
"commission": 30.2 //手续费
}
},
},
},
}
直接访问内存数据集中的数据
TQSDK 中有一个全局变量 TQ.DATA 指向整个数据集。由于这数据集是一个标准的 javascript object, 因此可以使用简单的 javascript 语法来直接访问其中的任意数据, 像这样
获取 SHFE.cu1801 合约的最新价
let last_price = TQ.DATA["quotes"]["SHFE.cu1801"]["last_price"];
/*
last_price = 3540.5
*/
获取 SHFE.cu1801 合约的持仓信息
let position = TQ.DATA["trade"]["user1"]["positions"]["SHFE.cu1801"];
/*
position = {
exchange_id: "SHFE",
instrument_id: "cu1801",
volume_long: 5,
...
}
*/
![digraph dfd2{
node[shape=record]
subgraph level0{
enti1 [label="服务器", shape=box, fontname="SimSun" size="20,20"];
}
subgraph cluster_level1{
store [label="Data Centre"];
api [label="{<f0> TQ.DATA|<f2> TQ.CHANGING_DATA}"];
}
enti1 -> store [label="发送数据集 CHANGING_DATA", fontname="SimSun" size="20,20"];
store -> store [label="数据集 CHANGING_DATA 合并到 DATA", fontname="SimSun" size="20,20"];
store -> api [label="提供可访问数据", fontname="SimSun" size="20,20"];
}](../../../_images/graphviz-494e54586704437804d8b21d130ffddf4e39cf2d.png)
如上图所示,客户端在运行过程中不断从服务器接受最新的数据,在每次接受到数据之后,将 CHANGING_DATA 合并到 DATA。
通过数据访问函数访问数据
直接访问数据集时, 用户需要自行负责错误处理. 为简化用户代码, TQSDK 封装了几个简单的数据访问函数:
- 获取指定 K 线序列 - GET_KLINE
- 获取指定合约对象 - GET_QUOTE
- 获取账户信息 - GET_ACCOUNT
- 获取组合信息 - GET_COMBINE
- 获取持仓信息 - GET_POSITION
- 获取持仓信息 - GET_POSITION_DICT
- 获取持仓信息 - GET_UNIT_POSITION
- 获取委托单信息 - GET_ORDER_DICT
- 获取成交记录 - GET_TRADE_DICT
- 数据是否有更新 - IS_CHANGING
这些函数在成功时都返回对应的object, 失败时返回 undefined