内容发布更新时间 : 2024/11/5 17:28:01星期一 下面是文章的全部内容请认真阅读。
详细设计说明书
关于交易算法的详细设计
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 详细设计说明书 5.2.2 集合竞价 集合竞价是指对所有有效委托进行集中处理,深、沪两市的集合竞价时间为交易日上午9:15至9:25。 集合竞价原则: ? ? ? ? 集合竞价分四步完成: 第一步:确定有效委托在有涨跌幅限制的情况下,有效委托是这样确定的: 根据该只证券上一交易日收盘价以及确定的涨跌幅度来计算当日的最高限价、 最低限价。有效价格范围就是该只证券最高限价、最低限价之间的所有价位。 限价超出此范围的委托为无效委托,系统作自动撤单处理。 第二步:系统根据竞价规则自动确定集合竞价的成交价,这个价格就是当日的开盘价, 所有高于开盘价的买盘和所有低开开盘价的卖盘均以此价格成交, 集合竞价的成交价确定原则是:以此价格成交,能够得到最大成交量。 第三步:集中撮合处理所有的买委托按照委托限价由高到低的顺序排列, 限价相同者按照进入系统的时间先后排列;所有卖委托按委托限价由低到高的顺序排列 , 限价相同者按照进入系统的时间先后排列。依序逐笔将排在前面的买委托与卖委托配对成交,即按照\价格优先,同等价格下时间优先\的成交顺序依次成交,直至成交条件不满足为止,即不存在限价高于等于成交价的叫买委托、或不存在限价低于等于成交价的叫卖委托。 所有成交都以同一成交价成交。 这同一成交价成交的买卖单一般量都是很大的,如图3.2.3所示 凡是高于开盘价的买单一定成交; 凡是低于开盘价的卖单一定成交; 凡是高于开盘价的卖单一定不成交; 凡是低于开盘价的买单一定不成交;