模拟撮合引擎
模拟撮合引擎插件(Matching Engine Simulator)用于模拟用户在某个时间点发出或取消订单的操作,并获取相应的交易结果。
该插件以行情数据(快照数据或逐笔数据)和用户委托订单(买方或卖方)作为输入,根据订单撮合规则实现模拟撮合后,将订单成交结果(含部分成交结果、拒绝订单和已撤订单)输出至交易明细输出表,未成交部分等待与后续行情撮合成交,或者等待用户撤单。
在插件市场安装插件
版本要求
- DolphinDB Server: 2.00.9及更高版本
安装步骤
在DolphinDB 客户端中使用 listRemotePlugins 命令查看插件仓库中的插件信息。
login("admin", "123456") listRemotePlugins()
使用 installPlugin 命令完成插件安装。
installPlugin("MatchingEngineSimulator")
使用
loadPlugin
命令加载插件(即上一步返回的.txt文件)。loadPlugin("MatchingEngineSimulator")
注意:使用2.00.9版本server的用户,可从二进制插件包 中获取二进制插件包,并用 loadPlugin
命令加载后使用。
插件接口
MatchingEngineSimulator::createMatchEngine
语法
MatchingEngineSimulator::createMatchEngine(name,
exchange,
config,
dummyQuoteTable,
quoteColMap,
dummyUserOrderTable,
userOrderColMap,
orderDetailsOutput,
[orderDetailsAndSnapshotOutput],
[snapshotOutput])
详情
创建一个模拟撮合引擎。
参数
- name:名称,字符串标量,全局唯一。
- exchange:交易所标识,深交所"XSHE"或上交所"XSHG"。
- config: 是一个字典标量,包含配置的键值对,类型为(STRING, DOUBLE)。
字典 key | 含义 |
---|---|
dataType | 行情类别:0(逐笔),1(快照),4(分钟频率),5(日频) |
depth | 匹配的订单簿深度,5 - 50 |
outputOrderBook | 是否输出订单簿。0(不输出), 1(输出) |
outputInterval | 输出订单簿的最小时间间隔,单位为毫秒 |
latency | 模拟时延,单位为毫秒,用来模拟用户订单从发出到被处理的时延。(用户订单的撤单无时延) |
orderBookMatchingRatio | 成交百分比 |
matchingMode | 快照模式下,匹配的两种模式,可设置为 1 或者 2撮合模式一:与最新成交价以及对手方盘口按配置的比例撮合撮合模式二:与区间的成交列表以及对手方盘口撮合成交 |
matchingRatio | 快照模式下,快照的区间成交百分比,默认和成交百分比 orderBookMatchingRatio 相等 |
enableOrderDetailsAndSnapshotOutput | 是否需要输出到复合输出表 |
outputTimeInfo | 成交输出表中是否需要订单收到时的行情最新时间,”匹配开始时间“”匹配完成时间“0(不需要), 1(需要) |
outputQueuePosition | 是否输出订单在真实行情数据的位置信息。如果输出该信息,则在成交明细和未成交订单接口中会增加以下 5 个指标:优于委托价格的行情未成交委托单总量次于委托价格的行情未成交委托单总量等于委托价格的行情未成交委托单总量等于委托价格且早于用户订单时间的行情未成交委托单总量优于委托价格的行情档位数该参数可设置为如下值:0:默认值,表示不输出1:表示订单撮合成交计算上述指标的时候,把最新的一条行情纳入订单薄2:表示订单撮合成交计算上述指标的时候,把最新的一条行情不纳入订单薄,即统计的是撮合计算前的位置信息 |
outputOrderConfirmation | 是否输出委托回报,默认为 true。 |
cpuId | 绑定到的 CPU 核的 ID,只在第一次接收到行情或者用户订单 的时候绑定该线程 |
dummyQuoteTable:插入行情数据的表的实际结构,对于一些引擎内部使用到的列,由参数 quoteColMap 提供列名映射关系。
quoteColMap:行情数据表的列名映射关系,一个字典标量,类型为(STRING, DOUBLE)。
其中,对于逐笔模式,行情表必须提供的列如下:
名称 | 类型 | 含义 |
---|---|---|
symbol | SYMBOL | 股票标的 |
symbolSource | SYMBOL | 证券市场:深交所、上交所 |
timestamp | TIMESTAMP | 时间戳 |
sourceType | INT | 0(order) ,1(transaction) |
orderType | INT | order:1:市价2:限价3:本方最优10:撤单(仅上交所,即上交所撤单记录在 order 中)transaction:0:成交1:撤单(仅深交所,即深交所撤单记录在 transaction 中) |
price | DOUBLE | 订单价格 |
qty | LONG | 订单数量 |
buyNo | LONG | transaction 对应其原始数据;order 填充原始订单号,无意义,深交所数据为了补全上交所数据格式增加的冗余列 |
sellNo | LONG | transaction 对应其原始数据;order 填充原始委托订单号,无意义,深交所数据为了补全上交所数据格式增加的冗余列 |
direction | INT | 1(买 ),2(卖) |
seqNum | LONG | 逐笔数据序号 |
对于快照模式,行情表必须提供的列如下:
注意:撮合模式二中必须提供 tradePrice(成交价格)和 tradeQty(成交数量)列表字段,撮合模式一中可以不包含这两列。
名称 | 类型 | 含义 |
---|---|---|
symbol | SYMBOL | 股票标的 |
symbolSource | SYMBOL | 证券市场:深交所、上交所 |
timestamp | TIMESTAMP | 时间戳 |
lastPrice | DOUBLE | 最新价 |
upLimitPrice | DOUBLE | 涨停板价 |
downLimitPrice | DOUBLE | 跌停板价 |
totalBidQty | LONG | 区间买单成交数量总和 |
totalOfferQty | LONG | 区间卖单成交数量总和 |
bidPrice | DOUBLE[] | 买单价格列表 |
bidQty | LONG[] | 买单数量列表 |
offerPrice | DOUBLE[] | 卖单价格列表 |
offerQty | LONG[] | 卖单数量列表 |
tradePrice | DOUBLE[] | 成交价格列表 |
tradeQty | LONG[] | 成交数量列表 |
对于分钟频率和日频数据,行情表必须提供的列如下:
字段 | 类型 | 名称 |
---|---|---|
symbol | SYMBOL | 标的代码 |
tradeTime | TIMESTAMP | 时间 |
open | DOUBLE | 开盘价 |
low | DOUBLE | 最低价 |
high | DOUBLE | 最高价 |
close | DOUBLE | 收盘价 |
volume | LONG | 成交量 |
amount | DOUBLE | 成交额 |
upLimitPrice | DOUBLE | 涨停价 |
downLimitPrice | DOUBLE | 跌停价 |
- dummyUserOrderTable:插入用户订单数据的表的实际结构,对于一些引擎内部使用到的列,由参数 userOrderColMap 提供列名映射关系。
- userOrderColMap:用户订单表的列名映射关系,一个字典标量,类型为(STRING, DOUBLE)。 用户订单表必须提供的列如下:
名称 | 类型 | 含义 |
---|---|---|
symbol | STRING | 股票标的。取消订单时股票标的无效,以 orderId 为准。 |
timestamp | TIMESTAMP | 时间戳 |
orderType | INT | 上交所:0:市价单中最优五档即时成交剩余撤销委托订单1:市价单中最优五档即时成交剩余转限价委托订单2:市价单中本方最优价格委托订单3:市价单中对手方最优价格委托订单5:限价单6:撤单7:市价单中最优五档即时成交剩余撤销委托订单(保护限价)8:市价单中最优五档即时成交剩余转限价委托订单(保护限价)9:市价单中本方最优价格委托订单(保护限价)10:市价单中对手方最优价格委托订单(保护限价)深交所:0:市价单中最优五档即时成交剩余撤销委托订单1:市价单中即时成交剩余撤销委托订单2:市价单中本方最优价格委托订单3:市价单中对手方最优价格委托订单4:市价单中全额成交或撤销委托订单5:限价单6:撤单 分钟频率、日频模式:0:市价单5:限价单6:撤单 |
price | DOUBLE | 订单委托价格 |
orderQty | LONG | 委托数量 |
direction | INT | 1(买 ),2(卖) |
orderId | LONG | 用户订单 ID,仅撤单时起作用 |
- orderDetailsAndSnapshotOutput:复合输出表,包含订单簿及用户订单成交委托详细情况表。需要调用 extractInfo接口(详见后文该接口说明)来解析出具体数据。
名称 | 类型 | 含义 |
---|---|---|
msgType | INT | 1(成交结果)或 2(订单簿) |
content | BLOB | 具体数据 |
- orderDetailsOutput:订单详情结果输出表(包括用户订单委托回报,成交、拒单以及撤单状态)。
- 在配置项 outputQueuePosition 为 1 时(详见本接口的 config 参数说明),启用 openVolumeWithBetterPrice, openVolumeWithWorsePrice, openVolumeAtOrderPrice, priorOpenVolumeAtOrderPrice 和depthWithBetterPrice五列。
- 在配置项 outputTimeInfo 为 1 时(详见本接口的 config 参数说明),启用 receiveTime, startMatchTime, endMatchTime 列。
名称 | 类型 | 含义 |
---|---|---|
orderId | LONG | 成交的用户订单 ID |
symbol | STRING | 股票标的 |
direction | INT | 1(买 ),2(卖) |
sendTime | TIMESTAMP | 订单发送时间 |
orderPrice | DOUBLE | 委托价格 |
orderQty | LONG | 订单委托数量 |
tradeTime | TIMESTAMP | 成交时间 |
tradePrice | DOUBLE | 成交价格 |
tradeQty | LONG | 成交量 |
orderStatus | INT | 用户订单是否完全成交4:已报-2:表示撤单被拒绝-1:表示订单被拒绝0:表示订单部分成交1:表示订单完全成交2:表示订单被撤单 |
sysReceiveTime | NANOTIMESTAMP | 订单收到时的时间(系统时间) |
openVolumeWithBetterPrice | LONG | 优于委托价格的行情未成交委托单总量 |
openVolumeWithWorsePrice | LONG | 次于委托价格的行情未成交委托单总量 |
openVolumeAtOrderPrice | LONG | 等于委托价格行情未成交委托单总量 |
priorOpenVolumeAtOrderPrice | LONG | 等于委托价格行情且比自己早的行情未成交委托单总量 |
depthWithBetterPrice | INT | 优于委托价格的行情档位数 |
receiveTime | TIMESTAMP | 订单收到时的行情最新时间 |
startMatchTime | NANOTIMESTAMP | 匹配开始时间 |
endMatchTime | NANOTIMESTAMP | 匹配完成时间 |
订单状态 orderStatus 为 -1 即订单被拒绝的场景:
- 撤单时间早于用户订单时间(sendTime)
- 回撤了一个不存在的订单或者是已经完全交易的订单
- 用户订单不符合规范:volume <0;买单的 volume 不是100 的倍数;科创版“68”的限价单小于200股或超过10万股;科创版“68”的市价单小于200股或超过5万股;上交“11”或深交”12”的 volume 不是 10 的倍
- price 大于最高价或者小于最低价
- 用户订单即时匹配时没有前面行情
- 市价单或者本方委托, 行情盘口没有数据
- 提交或处理市价单时,用户订单时间在 9:15-9:25 或者 14:57 以后
订单状态 orderStatus 为 -2 即撤单被拒绝的场景:
- 用户提交订单的时间在 9:15 之前、15:00 之后,订单开始处理时最新的行情时间在 9:15 之前、15:00 之后
- 用户提交撤单的时间在 9:20-9:25、14:57-15:00,撤单被处理时最新的行情时间在 9:20-9:25、14:57-15:00
- snapshotOutput:行情快照输出表。
名称 | 类型 | 含义 |
---|---|---|
symbol | STRING | 股票标的 |
timestamp | TIMESTAMP | 时间 |
avgBidPrice | DOUBLE | 买单成交均价 |
avgOfferPrice | DOUBLE | 卖单成交均价 |
totalBidQty | LONG | 买单成交数量总和 |
totalOfferQty | LONG | 卖单成交数量总和 |
bidPrice | DOUBLE[] | 买单价格列表 |
bidQty | LONG[] | 买单数量列表 |
offerPrice | DOUBLE[] | 卖单价格列表 |
offerQty | LONG[] | 卖单数量列表 |
lastPrice | DOUBLE | 最新价 |
highPrice | DOUBLE | 最高价 |
lowPrice | DOUBLE | 最低价 |
返回值
一个模拟撮合引擎。
MatchingEngineSimulator::getOpenOrders
语法
MatchingEngineSimulator::getOpenOrders(engine, symbolList);
详情
获取未成交的用户订单信息。
参数
- engine:通过 createMatchEngine 接口创建的撮合引擎。
- symbolList:股票标的列表,选填,表示获取所有的未成交订单。
返回值
返回值是一个表。包含如下列:
注意:仅当 outputQueuePosition=1 时,包含 openVolumeWithBetterPrice, openVolumeWithWorsePrice, openVolumeAtOrderPrice, priorOpenVolumeAtOrderPrice, depthWithBetterPrice,
updateTime 五列。(详见 createMatchEngine 接口的 config 参数说明)
名称 | 类型 | 含义 |
---|---|---|
orderId | LONG | 订单 ID |
timestamp | TIMESTAMP | 时间 |
symbol | STRING | 股票标的 |
price | DOUBLE | 委托价格 |
totalQty | LONG | 用户订单数量 |
openQty | LONG | 用户订单余量 |
direction | INT | 1(买 ),2(卖) |
isMacthing | INT | 订单是否到达撮合时间 |
openVolumeWithBetterPrice | LONG | 优于委托价格的行情未成交委托单总量 |
openVolumeWithWorsePrice | LONG | 次于委托价格的行情未成交委托单总量 |
openVolumeAtOrderPrice | LONG | 等于委托价格行情未成交委托单总量 |
priorOpenVolumeAtOrderPrice | LONG | 等于委托价格行情且比自己早的行情未成交委托单总量 |
depthWithBetterPrice | INT | 优于委托价格的行情档位数 |
updateTime | TIMESTAMP | 最新更新时间 |
MatchingEngineSimulator::resetMatchEngine
语法
MatchingEngineSimulator::resetMatchEngine(engine)
详情
清空内部缓存的所有订单信息以及行情信息。
参数
- engine: 通过 createMatchEngine 接口创建的撮合引擎。
返回值
无。
MatchingEngineSimulator::getEngineList
语法
MatchingEngineSimulator::getEngineList();
详情
获取所有的 engine。
返回值
返回一个 engine 列表。类型为字典,key 为 ID,value 为 engine 对象。
MatchingEngineSimulator::getSymbolList
语法
MatchingEngineSimulator::getSymbolList(engine);
详情
获取某引擎中当前存在的股票 symbol 列表。
参数
- engine: 通过 createMatchEngine 接口创建的撮合引擎。
返回值
返回一个 STRING 类型的向量,包含当前存在的股票标的。
MatchingEngineSimulator::stopMatchEngine
语法
MatchingEngineSimulator::stopMatchEngine(engine, symbolList);
详情
停止模拟撮合引擎。
参数
- engine:通过 createMatchEngine 接口创建的撮合引擎。
- symbolList:字符串标量,可选参数,表示需要停止模拟的股票。若不填,则停止所有股票模拟。
MatchingEngineSimulator::extractInfo
语法
MatchingEngineSimulator::extractInfo(msgType, msg, [table]);
详情
解析 orderDetailsAndSnapshotOutput 表中的内容。(详见 createMatchEngine 接口的 orderDetailsAndSnapshotOutput 参数说明)
参数
- msgType:1 表示订单状态详情表,2 表示订单簿。
- msg: 待解析的 BLOB 类型的数据。
- table: 与 orderDetailsAndSnapshotOutput 相同结构的表。
返回值
如果指定 table,则将解析结果 append 到 table 的末尾中,并返回 true。
如果未指定 table,则返回解析结果。
MatchingEngineSimulator::insertMsg
语法
MatchingEngineSimulator::insertMsg(engine, msgBody, msgType);
详情
插入行情和用户订单数据。
参数
- engine: 通过 createMatchEngine 接口创建的撮合引擎。
- msgBody:行情或用户订单数据。
- msgType:数据类型。1 表示行情,2 表示用户订单。
返回值
如果插入的是行情数据,返回 Void;
如果插入的是用户订单数据,返回用户的订单 ID(LONG 类型的向量)。
MatchingEngineSimulator::setLimitPrice
语法
MatchingEngineSimulator::setLimitPrice(engine, data);
详情
设置模拟撮合引擎的涨停价和跌停价。
注意:价格超过涨停价和跌停价范围内的用户订单都会被拒绝。
参数
- engine: 通过 createMatchEngine 接口创建的撮合引擎。
- data:一个表。包含 3 列(symbol, upLimitPrice, downLimitPrice),分别是 STRING,DOUBLE,DOUBLE 类型。
返回值
如果设置成功,返回 true。
MatchingEngineSimulator::setPrevClose
语法
MatchingEngineSimulator::setPrevClose(engine, prevClose);
详情
设置模拟撮合引擎的前收盘价
注意:深交所的逐笔模式且有创业版的股票时,必须设置前收盘价。
参数
- engine: 通过 createMatchEngine 接口创建的撮合引擎。
- prevClose:一个字典。键值类型为 STRING-DOUBLE。字典的 key 为股票号,value 为对应股票的前收盘价。
返回值
如果设置成功,返回 true。
MatchingEngineSimulator::getSnapshot
详情
获取逐笔引擎中的行情快照信息。
语法
MatchingEngineSimulator::getSnapshot(engine, symbolList);
参数
- engine: 是通过 createMatchEngine 接口创建的逐笔撮合引擎。
- symbolList: 股票标的,字符串向量。如果没有填该参数,表示获取所有股票标的快照。
返回值
返回一个表 ,结构如下:
名称 | 类型 | 含义 |
---|---|---|
symbol | STRING | 股票标的 |
timestamp | TIMESTAMP | 时间 |
avgTradePriceAtBid | DOUBLE | 买单成交均价 |
avgTradePriceAtOffer | DOUBLE | 卖单成交均价 |
totalTradeQtyAtBid | LONG | 买单成交数量总和 |
totalTradeQtyAtOffer | LONG | 卖单成交数量总和 |
bidPrice | DOUBLE[] | 买单价格列表 |
bidQty | LONG[] | 买单数量列表 |
offerPrice | DOUBLE[] | 卖单价格列表 |
offerQty | LONG[] | 卖单数量列表 |
lastPrice | DOUBLE | 最新价 |
highPrice | DOUBLE | 最高价 |
lowPrice | DOUBLE | 最低价 |
例子
例 1:通过自定义函数指定模拟撮合需要的参数
login("admin", "123456") //登录
loadPlugin("/DolphinDBPlugin/MatchingEngineSimulator/bin/PluginMatchingEngineSimulator.txt") //加载插件
go
//用户订单
MARKET_OTHER_BEST = 3
MARKET_THIS_BEST = 2
MARKET_BEST_FIVE = 0
MARKET_INSTANT_DEAL = 1
MARKET_ALL_DEAL = 4
LIMIT_ORDER = 5
ORDER_CANCEL = 6
def initArgsSnapshotmode2(){
dummyQuoteTable = table(1:0, `symbol`symbolSource`timestamp`lastPrice`highestPrice2`lowestPrice2`highestPrice`lowestPrice`openPrice`preClosePrice`upLimitPrice`downLimitPrice`avgBidPrice`avgOfferPrice`totalBidQty`totalOfferQty`bidPrice`bidQty`offerPrice`offerQty`tradePrice`tradeQty, [STRING, STRING, TIMESTAMP,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE, DOUBLE, LONG, LONG, DOUBLE[], LONG[], DOUBLE[], LONG[],DOUBLE[],LONG[]])
quoteColMap = dict( `symbol`symbolSource`timestamp`lastPrice`highestPrice`lowestPrice`highestPrice2`lowestPrice2`openPrice`preClosePrice`upLimitPrice`downLimitPrice`avgBidPrice`avgOfferPrice`totalBidQty`totalOfferQty`bidPrice`bidQty`offerPrice`offerQty`tradePrice`tradeQty, `symbol`symbolSource`timestamp`lastPrice`highestPrice`lowestPrice`highestPrice2`lowestPrice2`openPrice`preClosePrice`upLimitPrice`downLimitPrice`avgBidPrice`avgOfferPrice`totalBidQty`totalOfferQty`bidPrice`bidQty`offerPrice`offerQty`tradePrice`tradeQty)
dummyUserOrderTable = table(1:0, `symbol`timestamp`orderType`price`orderQty`direction`orderId, [STRING, TIMESTAMP, INT, DOUBLE, LONG, INT, LONG])
userOrderColMap = dict( `symbol`timestamp`orderType`price`orderQty`direction`orderId, `symbol`timestamp`orderType`price`orderQty`direction`orderId)
orderDetailsOutput = table(1:0, `orderId`symbol`direction`sendTime`orderPrice`orderQty`tradeTime`tradePrice`tradeQty`orderStatus`sysReceiveTime, [LONG, STRING, INT,TIMESTAMP,DOUBLE,LONG, TIMESTAMP,DOUBLE,LONG, INT,NANOTIMESTAMP])
orderDetailsAndSnapshotOutput = table(1:0, `msgType`content, [INT, BLOB])
snapshotOutput = table(1:0, `symbol`timestamp`avgBidPrice`avgOfferPrice`totalBidQty`totalOfferQty`bidPrice`bidQty`offerPrice`offerQty`lastPrice`highPrice`lowPrice, [STRING, TIMESTAMP,DOUBLE,DOUBLE, LONG, LONG,DOUBLE[],LONG[], DOUBLE[], LONG[],DOUBLE,DOUBLE,DOUBLE])
return [dummyQuoteTable,quoteColMap,dummyUserOrderTable,userOrderColMap,orderDetailsOutput,orderDetailsAndSnapshotOutput,snapshotOutput]
}
在上述代码中,
- 登录 DolphinDB 客户端(
login("admin", "123456")
)并使用loadPlugin
载入位于 /DolphinDBPlugin/MatchingEngineSimulator/bin/PluginMatchingEngineSimulator.txt 的插件。 - 在
go
语句后指定用户订单。
定义了 initArgsSnapshotmode2
函数,并为各个命名函数指定需要执行的语句。
initArgsSnapshotmode2
返回一个包含多个表格和字典的列表,其中:
dummyQuoteTable
:报价表。quoteColMap
:字典,用于映射报价表中的列名。dummyUserOrderTable
:用户订单表。userOrderColMap
:字典,用于映射用户订单表中的列名。orderDetailsOutput
、snapshotOutput
、orderDetailsAndSnapshotOutput
分别代表了交易输出、快照输出、复合输出表。
例 2:快照模式下以模式二模拟撮合委托订单
下例展示了在快照模式下以模式二(matchingMode = 2
,详见 createMatchEngine
接口的 config 参数说明)模拟撮合证券交易市场委托订单的关键过程。
config = dict(STRING, DOUBLE); //定义了一个包含多个配置参数的字典
config["latency"] = 0; //模拟时延
config["orderBookMatchingRatio"] = 0.12; //成交百分比
config["dataType"] = 1; // 行情类别为快照
config["outputOrderBook"] = 1; //是否输出订单,此处1表示输出
config["depth"] = 6; //匹配的订单簿的深度,区间为5到50,此处为6
config["matchingMode"] = 2; //快照模式下的匹配模式,此处为按照模式二撮合订单
name = "engine_snapshot" //指定引擎名称
exchange = "XSHE" //指定交易所名称
symbol = "AAA123" //指定证券代码
try{dropStreamEngine(name)}catch(ex){}
args = initArgsSnapshotmode2()
engine = MatchingEngineSimulator::createMatchEngine(name, exchange, config, args[0], args[1], args[2], args[3], args[4], args[5], args[6])
MatchingEngineSimulator::resetMatchEngine(engine)
appendMsg(engine, (symbol, "XSHE", 2021.01.08 10:14:01.400,23.5,,,25.0,23.0,,,,, 23.51, 23.59, 100, 100, [23.45 23.4 23.3 23.2 23.1 23.0], [1000 1000 1000 1000 1000 1000], [23.72 23.78 23.8 23.9 24.0 24.1], [1000 1000 1000 1000 1000 1000],[23.441 23.1235 23.653 23.771],[100 100 100 100]), 1)
appendMsg(engine, (symbol, 2021.01.08 10:14:01.400, MARKET_THIS_BEST, 23.2, 200, ORDER_SEL, 1), 2) // 23.72
appendMsg(engine, (symbol, 2021.01.08 10:14:01.400, MARKET_THIS_BEST, 23.3, 400, ORDER_SEL, 2), 2) // 272
res = MatchingEngineSimulator::getOpenOrders(engine)
ex = table([1,2] as orderId, [2021.01.08 10:14:01.400,2021.01.08 10:14:01.400] as timestamp, ["AAA123","AAA123"] as symbol, [23.72,23.72] as price, [200,400] as totalQty, [200,400] as openQty, [2,2] as BsFlag, [true, true] as isMatching)
assert 1, each(eqObj, res.values(), ex.values())
appendMsg(engine, (symbol, 2021.01.08 10:14:01.450, LIMIT_ORDER, 23.68, 400, ORDER_SEL, 2), 2) // 23.68
appendMsg(engine, (symbol, "XSHE", 2021.01.08 10:14:01.500,24.3,,,25.0,23.0,,,,, 23.51, 23.59, 1000, 1000, [23.45 23.4 23.3 23.2 23.1 23.0], [1000 1000 1000 1000 1000 1000], [23.72 23.78 23.8 23.9 24.0 24.1], [1000 1000 1000 1000 1000 1000],[23.65 23.81 23.73 23.72 23.45],[100 100 100 200 100]), 1)
appendMsg(engine, (symbol, "XSHE", 2021.01.08 10:14:01.600,24.3,,,25.0,23.0,,,,, 23.51, 23.59, 1000, 1000, [23.45 23.4 23.3 23.2 23.1 23.0], [1000 1000 1000 1000 1000 1000], [23.67 23.78 23.8 23.9 24.0 24.1], [1000 1000 1000 1000 1000 1000],[23.72 0],[1200 0]), 1)
res = select orderId, symbol, direction, sendTime, orderPrice, orderQty, tradeTime, tradePrice, tradeQty, orderStatus, sysReceiveTime from args[4]
在上述代码中,
- 定义了一个名为
config
的字典,它包含了一些配置参数,如模拟时延、成交百分比、行情类别、是否输出订单、订单簿深度等。 - 指定了引擎名称、交易所名称和证券代码。
- 还定义了一些函数,如
appendMsg
和getOpenOrders
,用于向引擎中添加消息和获取当前未完成的订单。 - 使用
assert
函数来验证结果是否符合预期。
其中,函数 dropStreamEngine
用于释放已创建的流数据引擎的定义,例如上述例子中的 name = "engine_snapshot"
。