软件详细设计说明书(例) 下载本文

.

? ?

判断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)

int m=(low+high)/2;

if(newlist->price

high=m-1;

else low=m+1;

精选范本

.

{

SellQueue[i+1]=SellQueue[i];

}

这是卖队列的排序,对于买队列的排序与之相似,只是价格排列是由高到底。在这里不再赘述。

这种插入排序方法完全符合了撮合算法中价格优先、时间优先的要求,而且效率也是比较高的。

在集合竞价前和连续竞价后进行的插入排序都是这样进行的,而在集合竞价撮合之后,对两队列的重新排列,我们首先使用了memset函数将前面已全部成交的t个元素清空,然后将t到N(原总非空元素个数)前移t位。

如下列代码所示:

for (int p=0; *t < *N; p++,*t++)

精选范本

SellQueue[high+1]=*newlist;

{ }

QueueStruct temp; temp=Queue[*t]; Queue[*t]=Queue[p]; Queue[p]=temp;

.

5.2.4 撮合算法的运行机制

在交易所正常运行时,一天内分为开市、开盘、休市、复开、收市等5个步骤。

开市:每天上午9:15开市。这时候,股民可以通过券商向交易所递单。同一只股票的买卖单开始分别进入这只股票的买卖队列中,但并不进行撮合。该过程一直持续到9:25。

开盘:每天上午9:30正式开盘。9:25-9:30为盘前处理,这段时间也就是集合竞价撮合算法运行的时间。9:25,买卖两队列开市不再接收新的单子。新的单子这时都放在缓冲区中,直到两队列运行完整个集合竞价算法后开市重新进单时,再依序将单子从缓存区取出读入买卖队列进行连续竞价的撮合。买卖队列于9:25开始集合竞价,运算完毕,得出开盘价等所有统计数据并发布行情以及发送完所有回报之后,重新接收单子进入该日正常交易中,使用连续竞价算法进行撮合。

休市:每天上午11:00休市。此时,所有的券商不再接受买卖单子,也不再给交易所递单。交易所将此前已经收到的所有单子撮合之后处于休息阶段。并进行各种当日前市盘点。

复开:每天下午13:30复开。此时,券商开市接收用户的递单,并将其送交交易所。交易所重新开市进入连续竞价撮合

收市:每天下午15:00收市。此时交易所不再接受任何单子,准时进行最后一笔单子的撮合之后,关闭撮合线程。将最后得到的收盘价等数据统计发送完之后,当天的所有工作全部结束。

如图3.2.5所示。

精选范本