详细设计说明书
卖队列开盘撮合买队列
图3.2.3所示
第四步:行情揭示:
1.)
如该只证券的成交量为零,则将成交价位揭示为开盘价、最近成交价、最高价、最低价,并揭示出成交量、成交金额。
2.)
剩余有效委托中,实际的最高叫买价揭示为叫买揭示价,若最高叫买价不存在,则叫买揭示价揭示为空;实际的最低叫卖价揭示为叫卖揭示价,若最低叫卖价不存在,则叫卖揭示价揭示为空。
集合竞价中未能成交的委托,自动进入连续竞价。
按照这样的原则和要求,我们设计了如下的集合竞价撮合算法。如图3.2.4所示。
详细设计说明书
BuyQueue[ ]判断两队列是否都不为空是否小于0开盘价为昨日收盘价,成交量为0SellQueue[ ]判断差价 BuyQueue[0].price-SellQueue[0].price大于等于0i=j=0, M、N分别为BuyQueue[ ]与SellQueue[ ]非空元素的数目; BOOL k; Buy=BuyQueue[0]; Sell=SellQueue[0]判断差价 BuyQueue[i].price-SellQueue[j].price大于等于0判断差量Buy.count-Sell.count小于等于0i++; k=false; Buy1.count=Buy.count; Buy.count=Buy.count+BuyQueue[i].count;是判断是否i 详细设计说明书 集合竞价算法描述: 和连续竞价一样,首先设定QueueStruct结构为元素的买卖两个队列BuyQueue和SellQueue。 为了尽可能的提高效率,减少资源占用,我们用静态数组构建这两个队列。 其中BuyQueue是时间优先、买价降序排序,而SellQueue是时间优先、卖价升序排序。在开市到开盘这段时间内,买卖单已经分别进入了买卖队列内排好了序。 一旦宣布开盘,则触发集合撮合,如下: ? 判断两队列是否都不为空,如是,转2;如否,转21; ? 判断BuyQueue[0].prince与SellQueue[0].prince之差,如大于等于0,转3:如小于0,转21; ? 定义int i=j=0;M、N分别为买卖两队列非空元素的个数;BOOL k;QueueStruct Buy=BuyQueue[0];Sell=SellQueue[0];Buy1;Sell1;转4; ? 判断BuyQueue[i].prince与SellQueue[j].prince之差,如大于等于0,转5:如小于0,转14; ? 判断Buy.count与Sell.count之差,如大于0,转6;如小于等于0,转9; ? j++; k=true; Sell1.count=Sell.count;Sell.count=Sell.count+SellQueue[iSellQueue].count;转7; ? ? 判断j是否小于N,如是,转4;如不是,转8; 开盘价为 BuyQueue[i].price;总成交量为 Sell.count;统计成交数据及回报,并返回; ? i++;k=false; Buy1.count=Buy.count;Buy.count=Buy.count+BuyQueue[i].count;转10; ? 判断i是否小于M,如是,转4;如不是,转11; 详细设计说明书 ? 判断Buy.count与Sell.count之差,如小于0,转12;如等于0,转13; ? 开盘价为SellQueue[j].price;总成交量为 Buy.count;统计成交数据及回报,并返回; ? 开 盘 价 为 (SellQueue[j].price+BuyQueue[i-1].price)/2;总成交量为sell.count;统计成交数据及回报,并返回; ? ? 判断k值,如为true,转15;如为false,转18; 判断Buy1.count与Sell1.count之差,如大于0,转16;如小于0,转17; ? 开盘价为 BuyQueue[i].price;总成交量为 Sell1.count;统计成交数据及回报,并返回; ? 开 盘 价 为 (SellQueue[j-1].price+BuyQueue[i-1].price)/2;总成交量为Sell1.count;统计成交数据及回报,并返回; ? 判断Buy1.count与Sell.count之差,如小于0,转19;如等于0,转20; ? 开盘价为 SellQueue[j].price;总成交量为 Buy1.count;统计成交数据及回报,并返回; ? 开 盘 价 为 (SellQueue[j].price+BuyQueue[i-1].price)/2;总成交量为Buy1.count;统计成交数据及回报,并返回; ? 开盘价为昨日收盘价,成交量为0;保留所有数据至开盘进入连续竞价撮合; 详细设计说明书 5.2.3 买卖队列排序 上面我们介绍了撮合算法的核心部分,但实际上在撮合前后都要对两个买卖队列进行一定的插入和排列处理,这在整个算法中也是很重要的部分。下面我们就来具体介绍一下。 对所有的排列和插入我们考虑了效率问题之后,最后统一使用了二分插入排序法。 在单子进入队列时,我们首先统计出当前队列中的非空数据个数,然后再通过新单子与当前队列中间值的价格比较,确定新单子在队列的前半部分还是后半部分,然后再取该区域中间值与之比较,直到确定新单子应在的位置。 如下列代码所示: int low=0; int high=N-1; //N为队列中非空元素的个数 while(low<=high) { } for(int i=N-1; i>=high+1; --i) { SellQueue[i+1]=SellQueue[i]; int m=(low+high)/2; if(newlist->price high=m-1; else low=m+1; } 这是卖队列的排序,对于买队列的排序与之相似,只是价格排列是由高到底。在这里不再赘述。 SellQueue[high+1]=*newlist;