.
关于交易算法的详细设计
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 精选范本