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

.

关于交易算法的详细设计

5.2 撮合算法

在前文中,我们已经提到了,撮合算法是整个交易所乃至整个证券仿真系统的核心部分。此算法的成功与否,直接影响着仿真系统是否能实现以及实现效率的高低。

按照真实的交易原则,撮合算法分为连续竞价和集中竞价两种方式。

精选范本

.

下面我们将分别对这两种方式进行实现。

5.2.1 连续竞价

连续竞价是在绝大部分交易时间使用的撮合算法。 连续竞价原则:

1.) 价格优先原则:价格较高的买入申报优先于价格较低的买入申报,价格较低的卖出申报优先于价格较高的卖出申报。

2.) 时间优先原则:同价位申报、依照申报时序决定优先顺序,即买卖方向、价格相同的,先申报者先于后申报者。先后顺序按证券交易所主机接受申报的时间确定。

在正常情况下,买队列的第一笔(报价最高)的报价一定小于卖队列的第一笔(最低报价)的报价。此时不发生撮合。一旦买卖队列的价格发生了交叉,如图2.3.1所示,发生交叉的那部分就会进行撮合。

而事实上,由于每一笔新来的单子进入数列后都会触发一次比较,所以每次触发撮合都是由新单子促成的。称为“来一笔撮合一次”,也就是连续竞价。

精选范本

.

卖队列撮合成功买队列b

图2.3.1

连续竞价算法描述:

首先设定QueueStruct结构为元素的买卖两个队列BuyQueue和SellQueue。 为了尽可能的提高效率,减少资源占用,我们用静态数组构建这两个队列。 其中BuyQueue是时间优先、买价降序排序,而SellQueue是时间优先、卖价升序排序,在连续竞价条件下,可以保证BuyQueue[0]的price小于SellQueue[0]的price。

连续竞价算法如下:

1.)

接收一个新单子newlist,判断newlist是买单还是卖单;如果是买单,则转2,如果是卖单,则转B;

2.)

取卖单队列头SellQueue[0],if SellQueue[0].price>newlist.price,

精选范本

.

利用插入排序将newlist插入到买队列BuyQueue中,转1;

3.)

if SellQueue[0].count>newlist.count,newlist完全撮合,SellQueue[0].count=SellQueue[0].count-newlist.count,转2;

4.)

if SellQueue[0].count<=newlist.count,SellQueue[0]撮合,并将SellQueue[0]

SellQueue

newlist.count=newlist.count-SellQueue[0].count,转2;

5.)

取买单队列头BuyQueue[0],if BuyQueue[0].price

6.)

if BuyQueue[0].count>newlist.count,newlist完全撮合,BuyQueue[0].count=BuyQueue[0].count-newlist.count,转1;

7.)

if BuyQueue[0].count<=newlist.count,

BuyQueue[0]撮合, 并将BuyQueue[0]从BuyQueue队列中删除, newlist.count=newlist.count-BuyQueue[0].count,转5;

如下面流程图5.2.2所示:

精选范本

.

BuyQueue[ ]newlistSellQueue[ ]判断BuyQueue[ ]是否为空为空不为空卖单判断其为买单还是卖单买单判断SellQueue[ ]是否为空不为空为空判断差价 无法交易,newlist进大于0newlist.price-BuyQueue[0].price入SellQueue[ ]排序小于等于0通过2分插入排序找到其在SellQueue[ ]中的位置可交易,判断差量 newlist.count-BuyQueue[0].count大于等于0BuyQueue[0]被完全磨合小于0判断差价 小于0无法交易,newlist进newlist.price-SellQueue[0].price入BuyQueue[ ]排序大于等于0可交易,判断差量 newlist.count-SellQueue[0].count小于0大于等于0SellQueue[0]被完全磨合通过2分插入排序找到其在BuyQueue[ ]中的位置newlist完全被磨合BuyQueue内全部非空成员向前进一位返回成交信息SellQueue内全部非空成员向前进一位

图3.2.2

精选范本