future

future


撮合流程

<p>future-engine-core 作为kafka接收者服务,接收下单的消息</p> <p>public void onEvent(OrderPlaceEvent event,EngineOutputHoldeerVo holdeerVo,long sequence) 函数作为事件的入口</p> <p>1, 通过事件回掉拿到订单,并判断订单是否有效</p> <p>2,通过订单的合约id,拿到合约信息,并判断合约是否有效</p> <p>3,通过合约id拿到订单簿orderbook</p> <p>4, 初始化订单的各个参数,包括dealAvgPrice,UsedMargin,FrozenMargin等等</p> <p>5, 检查是否可以下单,发送订单作废事件</p> <p>6, 正式开始进入撮合开仓服务</p> <p>7, 先冻结用户资金</p> <p>8,doMatch()方法是合约撮合方法</p> <p>9,开始doMatch()方法,</p> <p>10,获取订单类型,获取订单价格,这个订单就是taker</p> <p>11,contractAssetDetailStorage对用户的资产进行操作</p> <p>12,如果fokIsOk==true并剩余数量大于0,或者能找到匹配的单子,进行下一步</p> <p>13,先获取到符合条件的maker,拿到maker的price</p> <p>14, 黑名单订单需要将这个单子撤销</p> <p>15,创建TradeDeal 对象, 如果maker的remainVol</p> <p>16,否则taker单被吃完,更新maker单,创建新的maker单</p> <p>17,remainVol= remainVol - deal.getVol(),更新order的三个参数,dealVol,dealAvgPrice,RemainVol,均价计算公式和老版本一样</p> <p>18,开始处理资金和仓位变动</p> <p>19,开始更新MatchingOutput 对象,addOrder添加新的newMakerOrder,设置contractId,设置order,添加order,</p> <p>这个MatchingOutPut是 TradeSettle类的一个属性,由TradeSettle类内部的函数执行之后返回</p> <p>20,如果output.hasDeal()为真,说明还有交易,如果剩余量大于0,将orderbook挂入订单簿,否则,订单设置状态为已完成</p> <p>21,对需要撤销的订单执行撤销逻辑</p> <p>22,如果订单的模式是双向持仓 并且是 平仓单,还要处理双向平仓单</p> <p>对接上面18的步骤</p> <p>1,计算仓位价值,以USDT为例子,仓位价值 = 价格 * 数量 * 面值</p> <p>2,takerFee,makerFee = 面值 * feeRate, feeRate从用户手续费配置或者全局配置获取</p> <p>3,maker的手续费可能为负数,所以要保证maker提取的手续费不能超过taker得到的手续费</p> <p>4,返回TradeFee 对象,处理maker仓位和资产变动</p> <p>5,双向开仓和单向开仓,需要不同处理</p> <p>6,先对maker 进行处理,如果maker是平仓单,开始对maker走平仓逻辑</p> <p>7,先获取仓位数据,通过uid和positionId拿到ContractPosition对象,是在positionStorage对象中</p> <p>8,计算平仓盈亏,如果是U本位,做多,pnl = 平仓仓位价值 - 开仓仓位价值</p> <p>9,所有的计算公式都在future-core的FormulaUtils文件中,计算净平仓盈亏 = 平仓盈亏- 手续费</p> <p>10,更新仓位数据,剩余持仓 = 原有持仓 - deal.vol,如果 为 0 ,修改postion的属性都为0,暂时不移除</p> <p>11, 如果不为0,获取这个用户的封控对象,计算出强平价,计算出保证金比例,计算出需要释放的保证金,更新这个position对象</p> <p>12,开始更新计算币种资产数据,从AssetsStorage这个对象中读取出来</p> <p>13,将asset的 可用余额 + netClosePnl + 释放的仓位保证金 ,更新asset对象的各种参数</p> <p>14,更新订单的结算币种手续费,更新系统手续费</p> <p>强平状态流转通知</p>

页面列表

ITEM_HTML