軟件詳細(xì)設(shè)計(jì)說明書(例)_第1頁(yè)
軟件詳細(xì)設(shè)計(jì)說明書(例)_第2頁(yè)
軟件詳細(xì)設(shè)計(jì)說明書(例)_第3頁(yè)
軟件詳細(xì)設(shè)計(jì)說明書(例)_第4頁(yè)
軟件詳細(xì)設(shè)計(jì)說明書(例)_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

案卷號(hào) 00001日期軟件詳細(xì)設(shè)計(jì)說明書(例)作 者:完成日期:簽收人:簽收日期:修改情況記錄:版本號(hào) 修改批準(zhǔn)人 修改人 安裝日期 簽收人目錄1引言33IYPu。1.1編寫目的31.2范圍41.3定義41.4參考資料42總體設(shè)計(jì)52.1需求規(guī)定52.2運(yùn)行環(huán)境52.3基本設(shè)計(jì)概念和處理流程62.4結(jié)構(gòu)82.5功能需求與程序的關(guān)系112.6人工處理過程132.7尚未解決的問題133接口設(shè)計(jì)133.1用戶接口133.2外部接口143.3內(nèi)部接口144運(yùn)行設(shè)計(jì)184.1運(yùn)行模塊組合184.2運(yùn)行控制184.3運(yùn)行時(shí)間185系統(tǒng)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)195.1邏輯結(jié)構(gòu)設(shè)計(jì)要點(diǎn)195.2物理結(jié)構(gòu)設(shè)計(jì)要點(diǎn)15.3數(shù)據(jù)結(jié)構(gòu)與程序的關(guān)系46系統(tǒng)出錯(cuò)處理設(shè)計(jì)46.1出錯(cuò)信息46.2補(bǔ)救措施56.3系統(tǒng)維護(hù)設(shè)計(jì)5引言1.1編寫目的隨著證券交易電子化程度的不斷提高,券商對(duì)于各種業(yè)務(wù)提出了新的要求,為了滿足券商的發(fā)展需求,更好的為客戶提供服務(wù),現(xiàn)結(jié)合原有各版本的證券交易軟件的優(yōu)點(diǎn)和特點(diǎn),開發(fā)一套采用 Client/Server結(jié)構(gòu)的證券交易軟件管理系統(tǒng)( SQL版)。本系統(tǒng)從底層予以優(yōu)化,使整個(gè)系統(tǒng)的運(yùn)行速度得到較大提高,通過重新優(yōu)化數(shù)據(jù)庫(kù)內(nèi)部結(jié)構(gòu),使系統(tǒng)的可擴(kuò)充性得到極大提高。75l7W。本說明書給出 SQL版證券交易系統(tǒng)的設(shè)計(jì)說明, 包括最終實(shí)現(xiàn)的軟件必須滿足的功能、性能、接口和用戶界面、附屬工具程序的功能以及設(shè)計(jì)約束等。 VgAN0。目的在于:為編碼人員提供依據(jù);為修改、維護(hù)提供條件;項(xiàng)目負(fù)責(zé)人將按計(jì)劃書的要求布置和控制開發(fā)工作全過程;項(xiàng)目質(zhì)量保證組將按此計(jì)劃書做階段性和總結(jié)性的質(zhì)量驗(yàn)證和確認(rèn)。本說明書的預(yù)期讀者包括:項(xiàng)目開發(fā)人員,特別是編碼人員;軟件維護(hù)人員;技術(shù)管理人員;執(zhí)行軟件質(zhì)量保證計(jì)劃的專門人員;參與本項(xiàng)目開發(fā)進(jìn)程各階段驗(yàn)證、確認(rèn)以及負(fù)責(zé)為最后項(xiàng)目驗(yàn)收、鑒定提供相應(yīng)報(bào)告的有關(guān)人員。合作各方有關(guān)部門的復(fù)雜人;項(xiàng)目負(fù)責(zé)人和全體參加人員。1.2范圍說明:a. 待開發(fā)的軟件系統(tǒng)的名稱: 模擬股票交易系統(tǒng)b. 列出本項(xiàng)目的任務(wù)提出者、開發(fā)者、用戶以及將運(yùn)行該項(xiàng)軟件的單位。1.3定義列出本文件中用到的專門術(shù)語(yǔ)的定義和縮寫詞的原詞組。本報(bào)告用到的術(shù)語(yǔ)符合國(guó)家標(biāo)準(zhǔn)《軟件工程術(shù)語(yǔ)( GB/T11475-1995)》。1.4參考資料列出要用到的參考資料,如:a. 本項(xiàng)目的經(jīng)核準(zhǔn)的計(jì)劃任務(wù)書或合同、上級(jí)機(jī)關(guān)的批文;b.屬于本項(xiàng)目的其他已發(fā)表的文件;c. 本文件中各處引用的文件、資料,包括所要用到的軟件開發(fā)標(biāo)準(zhǔn)。列出這些文件的標(biāo)題、 文件編號(hào)、發(fā)表日期和出版單位, 說明能夠得到這些文件資料的來(lái)源。總體設(shè)計(jì)2.1需求規(guī)定說明對(duì)本系統(tǒng)的主要的輸入輸出項(xiàng)目、 處理的功能性能要求, 詳細(xì)的說明可參見 《需求分析說明書》。2.2運(yùn)行環(huán)境簡(jiǎn)要地說明對(duì)本系統(tǒng)的運(yùn)行環(huán)境 (包括硬件環(huán)境和支持環(huán)境) 的規(guī)定,詳細(xì)說明參見《需求分析說明書》。數(shù)據(jù)庫(kù)服務(wù)器奔騰Pro內(nèi)存128MB以上硬盤9GB100M網(wǎng)卡應(yīng)用服務(wù)器奔騰Pro內(nèi)存64MB以上硬盤4GB100M網(wǎng)卡網(wǎng)絡(luò)配置100M/10M工作站(柜臺(tái))P100以上內(nèi)存8MB以上硬盤1G以上100M/10M網(wǎng)卡軟件操作系統(tǒng)WindowsNT4.0 以上數(shù)據(jù)庫(kù)管理系統(tǒng)SQLServer2005相關(guān)軟件工具WindowsNTWorkstation/WindowsNTserverWindows2000Professional/Server開發(fā)工具平臺(tái):Windows95/98、WindowsNT、Windows2000開發(fā)工具:visualstidio2005sp1,C#.Net測(cè)試環(huán)境Windows31、Windows95/98、WindowsNT、Windows20002.3基本設(shè)計(jì)概念和處理流程說明本系統(tǒng)的基本設(shè)計(jì)概念和處理流程,盡量使用圖表的形式。營(yíng)業(yè)部系統(tǒng)一共有四個(gè)對(duì)象, 即客戶、員工、市場(chǎng)和銀行,市場(chǎng)的概念是交易所的細(xì)化,比如上海證券交易所的A股和B股就是兩個(gè)市場(chǎng), 有了市場(chǎng)的概念我們就可以把交易所這個(gè)概念細(xì)化,并使同一個(gè)市場(chǎng)的共性更突出。 銀行則通過銀證轉(zhuǎn)賬業(yè)務(wù)介入, 并成為營(yíng)業(yè)部系統(tǒng)不可或缺的組成部分。 sh9RP。上述四個(gè)對(duì)象通過一些業(yè)務(wù)流程進(jìn)行相互操作從而形成整個(gè)交易活動(dòng)。 因此整個(gè)系統(tǒng)模型可以表述為圖 2-1設(shè)計(jì)時(shí)需要將營(yíng)業(yè)部系統(tǒng)所使用的各種信息分為描述四個(gè)對(duì)象的信息和描述業(yè)務(wù)流程的信息。由于四個(gè)對(duì)象相對(duì)而言是一種穩(wěn)定型信息,而業(yè)務(wù)流程則較易變化,且營(yíng)業(yè)部之間差異很大,因此應(yīng)將四個(gè)對(duì)象盡量定型,而將各種業(yè)務(wù)流程盡可能做成組件,以便營(yíng)業(yè)部可根據(jù)實(shí)際需求組裝成適合自己的系統(tǒng)。 J1gny。根據(jù)以上思想,在設(shè)計(jì)對(duì)象模型時(shí)應(yīng)充分考慮到可擴(kuò)展性,盡量做到抽象化、參數(shù)化,從而使對(duì)象需求變化時(shí)不致影響系統(tǒng)結(jié)構(gòu)。 IBmkB。圖2.12.4結(jié)構(gòu)用一覽表及框圖的形式說明本系統(tǒng)的系統(tǒng)元素 (各層模塊、子程序、公用程序等) 的劃分,扼要說明每個(gè)系統(tǒng)元素的標(biāo)識(shí)符和功能, 分層次地給出各元素之間的控制與被控制關(guān)系。NS08G。本系統(tǒng)采用 c/s模式的3層結(jié)構(gòu)按照不同會(huì)話來(lái)劃分的話可以分為 3大系統(tǒng)模塊委托服務(wù)數(shù)據(jù)轉(zhuǎn)換銀證轉(zhuǎn)賬MdyvZ??蛻舳说顷懩K:

系統(tǒng)監(jiān)控接口處理子系統(tǒng) 系統(tǒng)維護(hù)子系統(tǒng)數(shù)據(jù)庫(kù) 日終管理局域網(wǎng) 系統(tǒng)管理資金管理 柜臺(tái)管理報(bào)表管理 查詢管理圖2-2交易系統(tǒng)體系結(jié)構(gòu)最關(guān)鍵的交易系統(tǒng)模塊結(jié)構(gòu)圖如下:pi/pcTcheckUserMoneyCount(stockData)OrcheckUserStockCount要通過數(shù)據(jù)訪問層來(lái)訪問用戶表在撮合隊(duì)列中處理并且返回處理結(jié)果tradeInQueue(stockDatanewstockData)SuccessunSuccessupDateUserInfo(stockData) upDateDelegate通過調(diào)用ADO Info(stockDat層工廠來(lái)訪問 a)不同的數(shù)據(jù)庫(kù) 同左更新的是(更新用戶表 委托臨時(shí)表)

buyStocksellStockquoteStockCanselDelegateRules/Model規(guī)范買賣指令傳輸?shù)臄?shù)據(jù)結(jié)adoFactory通過該模塊可動(dòng)態(tài)建立不同數(shù)據(jù)庫(kù)的連接Orical、sqlserver,access數(shù)據(jù)訪問層accessaccess.postDate(stockData)將數(shù)據(jù)更新到數(shù)據(jù)庫(kù)

構(gòu)必須是stockData形式Check數(shù)據(jù)訪問層sqlserverSqlserver。postDate(stockData)股票信息發(fā)布經(jīng)過修改我認(rèn)為每次由客戶端每 5秒去查詢一次服務(wù)器更新信息不可取,服務(wù)端和客戶端的負(fù)擔(dān),特別是服務(wù)器端的運(yùn)算。 pGnH7。

因?yàn)檫@會(huì)加重修改后實(shí)現(xiàn)變更為: 用戶一開始登陸后獲得一次服務(wù)器的全部股票當(dāng)前信息。 而服務(wù)器端每次發(fā)生交易后, 給每一個(gè)在線用戶發(fā)送當(dāng)前交易需要更新的股票信息, 這樣就減輕了客戶機(jī)和服務(wù)端的信息 ZGava。客戶端第一次登陸發(fā)送請(qǐng)求獲得所有股票信息,并畫分時(shí)線圖StockidStockpriceTCP/IP服務(wù)器 每次交易返回最新信息2.5功能需求與程序的關(guān)系(該關(guān)系由需求分析報(bào)告編寫者根據(jù)結(jié)構(gòu)圖說明)本條用一張如下的矩陣圖說明各項(xiàng)功能需求的實(shí)現(xiàn)同各塊程序的分配關(guān)系:獲取并發(fā)送繪制分時(shí)MD5加密發(fā)送用戶接受并識(shí)別調(diào)用數(shù)據(jù)層撮合交易服務(wù)器返回用戶請(qǐng)求圖解密交易請(qǐng)求用戶請(qǐng)求查詢客戶端信息用戶登陸√√√√查看用戶√√√持倉(cāng)實(shí)時(shí)指√√√數(shù)交易委托√√√√√√√取消交易√√√√√√2.6人工處理過程說明在本軟件系統(tǒng)的工作過程中不得不包含的人工處理過程(如果有的話) 。沒有完成股票管理的模塊設(shè)計(jì),所以股票必須從數(shù)據(jù)庫(kù)后臺(tái)添加如果有新股發(fā)行,還必須添加有關(guān)股票的交易隊(duì)列2.7尚未解決的問題說明在概要設(shè)計(jì)過程中尚未解決而設(shè)計(jì)者認(rèn)為在系統(tǒng)完成之前必須解決的各個(gè)問題。接口設(shè)計(jì)3.1用戶接口說明將向用戶提供的命令和它們的語(yǔ)法結(jié)構(gòu),以及軟件的回答信息。向用戶提供簡(jiǎn)單易用的 UI,以及幫助文檔??蛻舳藢⑻峁┮韵鹿δ苁紫葟棾鲇脩舻顷懣?,供用戶輸入用戶名和密碼菜單項(xiàng)提供個(gè)股查詢和分時(shí)圖按鈕菜單欄下是選項(xiàng)卡,提供股票實(shí)時(shí)信息和個(gè)股分時(shí)圖欄提供用戶交易界面和交易按鈕以及查看用戶盈虧按鍵3.2外部接口說明本系統(tǒng)同外界的所有接口的安排包括軟件與硬件之間的接口、之間的接口關(guān)系。

本系統(tǒng)與各支持軟件采用基于正確公開標(biāo)準(zhǔn)的部件和技術(shù)以確保最大限度的協(xié)作能力以及與第三方系統(tǒng)與部件集成的簡(jiǎn)便性。這類標(biāo)準(zhǔn)包括但不限于以下幾種: L2gHp。網(wǎng)絡(luò)協(xié)議與標(biāo)準(zhǔn)(TCP/IP,HTTP,SSL,etc)語(yǔ)言(SQL,C#.net,etc.)數(shù)據(jù)庫(kù)連接性(ADO。net)3.3內(nèi)部接口說明本系統(tǒng)之內(nèi)的各個(gè)系統(tǒng)元素之間的接口的安排。邏輯層和數(shù)據(jù)訪問層通過以經(jīng)的 stockDataModel接口,來(lái)限定訪問 stockData類型的數(shù)據(jù)客戶端通過調(diào)用 buyStock(stockData)和sellStock(stockData)來(lái)訪問邏輯層,在這個(gè)函數(shù)中包含了訪問邏輯層的接口 dealTransaction(stockData)kym9d。通過AdoFactory訪問不同的數(shù)據(jù)庫(kù)客戶端登陸協(xié)議D(二字節(jié))+(客戶名字長(zhǎng)度)(4字節(jié))+(客戶名字)+(客戶密碼長(zhǎng)度)(4字節(jié))+(客戶密碼);客戶買賣協(xié)議B(二字節(jié))+(股票ID)(4字節(jié))+(股票數(shù)量)(4字節(jié))S(二字節(jié))+(股票ID)(4字節(jié))+(股票數(shù)量)(4字節(jié))查詢交易信息并返回給客戶端C(二字節(jié))具體有拆包解包的類usingSystem;usingSystem.Text;namespaceProjectCenterTradingSys{public class Protocal{privateprivatepublic

byte[]messagebuffer;byte[]messagelength;byte[]messagebag;該函數(shù)是將字符串轉(zhuǎn)換為字節(jié)數(shù)組public byte[]StringtoByte( string stringInfo){messagebuffer=System.Text. ASCIIEncoding.ASCII.GetBytes(stringInfo); IzYWk。return messagebuffer;}該函數(shù)將整型轉(zhuǎn)換為個(gè)字節(jié)public byte[]InttoByte( int number){messagelength= BitConverter .GetBytes(number);return messagelength;}將浮點(diǎn)型轉(zhuǎn)換為個(gè)字節(jié)public byte[]DoubletoByte( doubleprice){byte[]pricebyte=

BitConverter

.GetBytes(price);return pricebyte;}合并一個(gè)字符串(字節(jié)數(shù)組)和他的長(zhǎng)度作為一個(gè)包public byte[]Combinarray( byte[]messle, byte[]messinfo) a9TSM。{messagebag= newbyte[messle.Length+messinfo.Length]; m8NV index;for (index=0;index<messle.Length;index++)messagebag[index]=messagelength[index];for (int index1=0;index1<messinfo.Length;index1++)

lELyU。messagebag[index+index1]=messagebuffer[index1];

E9t26。return messagebag;}解包頭public byte[]BagHead(charhead){byte[]headbyte=return headbyte;

BitConverter .GetBytes(head);}讀包頭public charDeBagHead(byte[]buffer){charheadinfo=return headinfo;

BitConverter .ToChar(buffer,0);}該函數(shù)為解包信息為字符串!public string deMessgeBag(byte[]Messagebag, int start, out int next) E0AtU。{next=

BitConverter .ToInt32(Messagebag,start);string message=System.Text. ASCIIEncoding.ASCII.GetString(Messagebag,start+4,next);

kwwmB。return message;}運(yùn)行設(shè)計(jì)4.1運(yùn)行模塊組合說明對(duì)系統(tǒng)施加不同的外界運(yùn)行控制時(shí)所引起的各種不同的運(yùn)行模塊組合, 說明每種運(yùn)行所歷經(jīng)的內(nèi)部模塊和支持軟件。 yzaVr。4.2運(yùn)行控制說明每一種外界的運(yùn)行控制的方式方法和操作步驟。4.3運(yùn)行時(shí)間說明每種運(yùn)行模塊組合將占用各種資源的時(shí)間。系統(tǒng)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)5.1邏輯結(jié)構(gòu)設(shè)計(jì)要點(diǎn)給出本系統(tǒng)內(nèi)所使用的每個(gè)數(shù)據(jù)結(jié)構(gòu)的名稱、標(biāo)識(shí)符以及它們之中每個(gè)數(shù)據(jù)項(xiàng)、記錄、文卷和系的標(biāo)識(shí)、定義、長(zhǎng)度及它們之間的層次的或表格的相互關(guān)系??蛻舳祟悎D:

RtcrP。9NFgp。windowForm:FormPrivate:userLogDialoguserNametextBoxuserPasswordtextBoxuserlogOKbottonuserlogCanselbuttontabPageMenuBarstockRealtimeGraphitemstockQuoteDialogdataGridViewuserBuyStockIDuserBuyStockcountuserBuyStockpriceuserBuyStockButton...selluserStocklistViewuserStockLookButtonsendMestoServer(stringInfo)//該函數(shù)用來(lái)向主機(jī)發(fā)送請(qǐng)求協(xié)議U:發(fā)送用戶名,密碼B:buy股票id,count,price,userS:sellQYrn1。(接上)MD5encrypt(string)//以下都要通過 sendMestoServer//向主機(jī)發(fā)送信息logOK_press(event,handle);stockQuoteitem_press(e,h);buyStockButton_press(e,h);sellStockButton_press(e,h);stocklookButton_press(e,h);//////該函數(shù)調(diào)用 drawPicture畫圖stockRealtimeGraphitem_press(e,h)mFUAe。ClassRealTimeGraph9pJNZ。PrivatestockID動(dòng)態(tài)數(shù)組存儲(chǔ)股票價(jià)格ArrayListstockPrice[]Public://在windowform 類中recievemess后更新當(dāng)前價(jià)格,即在數(shù)組后添加一項(xiàng)最新價(jià)格updatePrice(price,sotckPrice)drawPicture(stockID,stockPrice)

Class stockData訂單號(hào) publicintListID;publicintUsrID;publicstringStockIndex;publicfloutPrice;publicintCount;publicboolIsbuy;該類即為向服務(wù)端傳送數(shù)據(jù)時(shí)的包服務(wù)器端0wZtV。StockQueuePrivatestockData datastockData nextPublicDeleteQueueHead();AddStockData();ClassTradeService該類還要補(bǔ)充若干個(gè) StockQueue類型的成員變量privatevoidStartListening(){byte[]ipadre=newbyte[]{10,82,14,47};IPAddressip=newIPAddress(ipadre);m_Tcplisten=newTcpListener(ip,m_Port);m_Tcplisten.Start();while(true){try{Sockets=m_Tcplisten.AcceptSocket();clientSocket=s;m_serverThread=newThread(newThreadStart(serviceClient));//多線程deal各個(gè)連接用戶的socketMiQWO。m_serverThread.Start();}catch(ExceptionE){Console.WriteLine(E.ToString());}}}如以上startlistening代碼所示,監(jiān)聽創(chuàng)造一個(gè)連接客戶端的套接字,再用多線程處理該連接,而服務(wù)器端則繼續(xù)監(jiān)聽新的套接字。 bTKUF。這樣主要的交易代碼就可以放入 ServiceClient這個(gè)函數(shù)中,當(dāng)有新客戶信息連入時(shí),即可進(jìn)行查詢數(shù)據(jù)庫(kù),對(duì)比插入股票隊(duì)列等工作 iSHi1。ClassClientInfo//這個(gè)類記錄了客戶端的 socket數(shù)據(jù)訪問層類圖tQE5E。ClassADOSQLserverPrivatedataSetKlHMc。//ds下可有4個(gè)dataTableuserTablestockTableUser_stockTabletempTablePublic:驗(yàn)證用戶信息BoolCheckUserlogin(stringusridstringpassword);BoolCheckUserMoney(string userID);BoolCheckUserStockCount(stringuserID);交易成功修改用戶和股票信息Void updateUserTable(ClassstockData)Void updateStockTable(ClassstockData)Void updateUser_stockTable(ClassstockData)///還未成功的交易放入臨時(shí)表,Void updateTemTable(ClassstockData)注意,每次交易成功要?jiǎng)h除臨時(shí)表的信息Void deleteInfo(Class stockData)

Class stockData訂單號(hào) publicintListID;publicintUsrID;publicstringStockIndex;publicintPrince;publicintCount;publicboolIsbuy;該類即為向服務(wù)端傳送數(shù)據(jù)時(shí)的包bcaSP。關(guān)于交易算法的詳細(xì)設(shè)計(jì)5.2撮合算法在前文中,我們已經(jīng)提到了,撮合算法是整個(gè)交易所乃至整個(gè)證券仿真系統(tǒng)的核心部分。此算法的成功與否,直接影響著仿真系統(tǒng)是否能實(shí)現(xiàn)以及實(shí)現(xiàn)效率的高低。按照真實(shí)的交易原則,撮合算法分為連續(xù)競(jìng)價(jià)和集中競(jìng)價(jià)兩種方式。下面我們將分別對(duì)這兩種方式進(jìn)行實(shí)現(xiàn)。 連續(xù)競(jìng)價(jià)連續(xù)競(jìng)價(jià)是在絕大部分交易時(shí)間使用的撮合算法。連續(xù)競(jìng)價(jià)原則:1.)價(jià)格優(yōu)先原則:價(jià)格較高的買入申報(bào)優(yōu)先于價(jià)格較低的買入申報(bào),價(jià)格較低的賣出申報(bào)優(yōu)先于價(jià)格較高的賣出申報(bào)。o6ely。2.)時(shí)間優(yōu)先原則:同價(jià)位申報(bào)、依照申報(bào)時(shí)序決定優(yōu)先順序,即買賣方向、價(jià)格相同的,先申報(bào)者先于后申報(bào)者。先后順序按證券交易所主機(jī)接受申報(bào)的時(shí)間確定。5hF1C。在正常情況下,買隊(duì)列的第一筆(報(bào)價(jià)最高)的報(bào)價(jià)一定小于賣隊(duì)列的第一筆(最低報(bào)價(jià))的報(bào)價(jià)。此時(shí)不發(fā)生撮合。一旦買賣隊(duì)列的價(jià)格發(fā)生了交叉,如圖所示,發(fā)生交叉的那部分就會(huì)進(jìn)行撮合。WMbtD。而事實(shí)上,由于每一筆新來(lái)的單子進(jìn)入數(shù)列后都會(huì)觸發(fā)一次比較, 所以每次觸發(fā)撮合都是由新單子促成的。 稱為“來(lái)一筆撮合一次”,也就是連續(xù)競(jìng)價(jià)。11xyM。列隊(duì)賣撮合成功列隊(duì)買b圖連續(xù)競(jìng)價(jià)算法描述:首先設(shè)定QueueStruct結(jié)構(gòu)為元素的買賣兩個(gè)隊(duì)列 BuyQueue和SellQueue。為了盡可能的提高效率,減少資源占用,我們用靜態(tài)數(shù)組構(gòu)建這兩個(gè)隊(duì)列。其中

BuyQueue是時(shí)間優(yōu)先、買價(jià)降序排序,而

SellQueue

是時(shí)間優(yōu)先、賣價(jià)升序排序,在連續(xù)競(jìng)價(jià)條件下,可以保證

BuyQueue[0]的

price

小于SellQueue[0]

price

。gBcGj。連續(xù)競(jìng)價(jià)算法如下:1.)

接收一個(gè)新單子

newlist

,判斷

newlist

是買單還是賣單;如果是買單,則轉(zhuǎn)

2,如果是賣單,則轉(zhuǎn)

B;

hNjrw。2.)

取 賣

隊(duì) 列 頭

SellQueue[0]

,

ifSellQueue[0].price>newlist.price

,利用插入排序?qū)ewlist

插入到買隊(duì)列

BuyQueue中,轉(zhuǎn)

1;

6Tc0P。3.)

if

SellQueue[0].count>newlist.count

,newlist

完全撮合,SellQueue[0].count

SellQueue[0].count

-4.)5.)6.)7.)

newlist.count,轉(zhuǎn)2;sOezQ。ifSellQueue[0].count<=newlist.count,SellQueue[0]撮合,并將SellQueue[0]從SellQueue隊(duì)列中刪除,newlist.count=newlist.count-SellQueue[0].count,轉(zhuǎn)2;UftmP。取買單隊(duì)列頭BuyQueue[0],ifBuyQueue[0].price<newlist.price,利用插入排序?qū)ewlist插入到賣隊(duì)列BuyQueue中,轉(zhuǎn)1;t3Xck。ifBuyQueue[0].count>newlist.count ,newlist 完全撮合,BuyQueue[0].count=BuyQueue[0].count-newlist.count ,轉(zhuǎn)1;kk6ZT。ifBuyQueue[0].count<=newlist.count ,BuyQueue[0]撮合, 并將BuyQueue[0]從BuyQueue隊(duì)列中刪除,newlist.count=newlist.count-BuyQueue[0].count ,轉(zhuǎn)5;2GjG5。如下面流程圖所示:BuyQueue[] newlist SelQueue[]判BuyQueue[斷]判斷其為買判SelQueue[斷]是否為空 單還是賣單 是否為空賣單 買單為空 不為空 不為空 為空無(wú)法交newlist易進(jìn),大0于判斷差價(jià)判斷差價(jià)小0于無(wú)法交newlist易進(jìn),newlist.lQu-ue[0].price入排序入SelQueue[排序]newlist.price-BuyQueue[0]price.SelBuyQueue[]小于0等于 大于0等于通2過分插入排序找到其可交易,判斷差量在可交易,判斷差量通2過分插入排序找到其中的位置newlist.countlQueu-Sel[0].countSelQueue[]newlist.count-BuyQueue[0].count在BuyQueue[中的位]置大于0等于 小0于 小0于 大于0等于BuyQueue[0]完SelQueue[0]被被完全磨合newlist完全磨合全被磨合BuyQueue內(nèi)全部非 SelQueue內(nèi)全部非空成員向前進(jìn)一位 返回成交信息 空成員向前進(jìn)一位圖czM14。r6eZv。 集合競(jìng)價(jià)集合競(jìng)價(jià)是指對(duì)所有有效委托進(jìn)行集中處理, 深、滬兩市的集合競(jìng)價(jià)時(shí)間為交易日上午9:15至9:25。集合競(jìng)價(jià)原則:? 凡是高于開盤價(jià)的買單一定成交;? 凡是低于開盤價(jià)的賣單一定成交;? 凡是高于開盤價(jià)的賣單一定不成交;? 凡是低于開盤價(jià)的買單一定不成交;集合競(jìng)價(jià)分四步完成:第一步:確定有效委托在有漲跌幅限制的情況下,有效委托是這樣確定的:根據(jù)該只證券上一交易日收盤價(jià)以及確定的漲跌幅度來(lái)計(jì)算當(dāng)日的最高限價(jià)、最低限價(jià)。有效價(jià)格范圍就是該只證券最高限價(jià)、最低限價(jià)之間的所有價(jià)位。 5EmVS。限價(jià)超出此范圍的委托為無(wú)效委托,系統(tǒng)作自動(dòng)撤單處理。第二步:系統(tǒng)根據(jù)競(jìng)價(jià)規(guī)則自動(dòng)確定集合競(jìng)價(jià)的成交價(jià),這個(gè)價(jià)格就是當(dāng)日的開盤價(jià),所有高于開盤價(jià)的買盤和所有低開開盤價(jià)的賣盤均以此價(jià)格成交,集合競(jìng)價(jià)的成交價(jià)確定原則是:以此價(jià)格成交,能夠得到最大成交量。第三步:集中撮合處理所有的買委托按照委托限價(jià)由高到低的順序排列,限價(jià)相同者按照進(jìn)入系統(tǒng)的時(shí)間先后排列;所有賣委托按委托限價(jià)由低到高的順序排列,限價(jià)相同者按照進(jìn)入系統(tǒng)的時(shí)間先后排列。依序逐筆將排在前面的買委托與賣委托配對(duì)成交,即按照"價(jià)格優(yōu)先,同等價(jià)格下時(shí)間優(yōu)先"的成交順序依次成交,直至成交條件不滿足為止,即不存在限價(jià)高于等于成交價(jià)的叫買委托、或不存在限價(jià)低于等于成交價(jià)的叫賣委托。所有成交都以同一成交價(jià)成交。 這同一成交價(jià)成交的買賣單一般量都是很大的,如圖 所示列隊(duì)賣開盤撮合列隊(duì)買圖 所示第四步:行情揭示:1.)如該只證券的成交量為零,則將成交價(jià)位揭示為開盤價(jià)、最近成交價(jià)、最高價(jià)、最低價(jià),并揭示出成交量、成交金額。V00Bg。2.)剩余有效委托中,實(shí)際的最高叫買價(jià)揭示為叫買揭示價(jià),若最高叫買價(jià)不存在,則叫買揭示價(jià)揭示為空;實(shí)際的最低叫賣價(jià)揭示為叫賣揭示價(jià),若最低叫賣價(jià)不存在,則叫賣揭示價(jià)揭示為空。THxUR。集合競(jìng)價(jià)中未能成交的委托,自動(dòng)進(jìn)入連續(xù)競(jìng)價(jià)。按照這樣的原則和要求,我們?cè)O(shè)計(jì)了如下的集合競(jìng)價(jià)撮合算法。如圖所示。BuyQueue[]判斷兩隊(duì)列是否開盤價(jià)為昨日收否都不為空盤價(jià),成交量為0SellQueue[]小于0是i=j=0,M、N分別為BuyQueue[]與SellQueue[]非空元素判斷差價(jià)的數(shù)目;BOOLk;Buy=BuyQueue[0];Sell=SellQueue[0]BuyQueue[0].price-SellQueue[0].price大于等于0判斷差價(jià) 小于0BuyQueue[i].price-SellQueue[j].price大于等于0判斷差量Buy.count-Sell.count小于等于0大于0i++;k=false;Buy1.count=Buy.count;j++;k=true;Sell1.count=Sell.count;Buy.count=Buy.count+BuyQueue[i].count;Sell.count=Sell.count+SellQueue[iSellQueue].count;是判斷是否i<M判斷是否j<N是否否判斷Buy.count-Sell.count開盤價(jià)為BuyQueue[i].price;總成交量為Sell.count小于0等于0開盤價(jià)為SellQueue[j].price;開盤價(jià)為(SellQueue[j].price+BuyQueue[i-1].price)/2;總總成交量為Buy.count成交量為sell.count判true判斷k值斷Buy1.count-Sell1.count等于0大于0開盤價(jià)為(SellQueue[j-1].price+BuyQueue[i-1].price)/2;總false開盤價(jià)為BuyQueue[i].price;總成交量為Sell1.count成交量為Sell1.count判斷Buy1.count-Sell.count等于0小于0開盤價(jià)為(SellQueue[j].price+BuyQueue[i-1].price)/2;開盤價(jià)為SellQueue[j].price;總成總成交量為Buy1.count交量為Buy1.count圖集合競(jìng)價(jià)算法描述:和連續(xù)競(jìng)價(jià)一樣,首先設(shè)定QueueStruct 結(jié)構(gòu)為元素的買賣兩個(gè)隊(duì)列BuyQueue和SellQueue 。Lc5rS。為了盡可能的提高效率,減少資源占用,我們用靜態(tài)數(shù)組構(gòu)建這兩個(gè)隊(duì)列。其中BuyQueue是時(shí)間優(yōu)先、買價(jià)降序排序,而SellQueue是時(shí)間優(yōu)先、賣價(jià)升序排序。在開市到開盤這段時(shí)間內(nèi),買賣單已經(jīng)分別進(jìn)入了買賣隊(duì)列內(nèi)排好了序。PtTWW。一旦宣布開盤,則觸發(fā)集合撮合,如下:? 判斷兩隊(duì)列是否都不為空,如是,轉(zhuǎn) 2;如否,轉(zhuǎn)21;?判斷BuyQueue[0].prince與SellQueue[0].prince之差,如大于等于0,轉(zhuǎn)3:如小于0,轉(zhuǎn)21;hebbr。?定義inti=j=0;M、N分別為買賣兩隊(duì)列非空元素的個(gè)數(shù);BOOLk;QueueStructBuy=BuyQueue[0];Sell=SellQueue[0];Buy1;Sell1;轉(zhuǎn)4;N1mUr。?判斷BuyQueue[i].prince與SellQueue[j].prince之差,如大于等于0,轉(zhuǎn)5:如小于0,轉(zhuǎn)14;J5oV3。?判斷Buy.count與Sell.count之差,如大于0,轉(zhuǎn)6;如小于等于0,轉(zhuǎn)9;?j++;k=true;Sell1.count=Sell.count;Sell.count=Sell.count+SellQueue[iSellQueue].count;轉(zhuǎn)7;xGodg。?判斷j是否小于N,如是,轉(zhuǎn)4;如不是,轉(zhuǎn)8;?開盤價(jià)為BuyQueue[i].price;總成交量為Sell.count;統(tǒng)計(jì)成交數(shù)據(jù)及回報(bào),并返回;0la2s。?i++;k=false;Buy1.count=Buy.count;Buy.count=Buy.count+BuyQueue[i].count;轉(zhuǎn)10;aw25D。?判斷i是否小于M,如是,轉(zhuǎn)4;如不是,轉(zhuǎn)11;?判斷Buy.count與Sell.count之差,如小于0,轉(zhuǎn)12;如等于0,轉(zhuǎn)13;?開盤價(jià)為SellQueue[j].price;總成交量為Buy.count;統(tǒng)計(jì)成交數(shù)據(jù)及回報(bào),并返回;fxOl9。?開盤價(jià)為(SellQueue[j].price+BuyQueue[i-1].price)/2;總成交量為sell.count;統(tǒng)計(jì)成交數(shù)據(jù)及回報(bào),并返回;hG8bH。?判斷k值,如為true,轉(zhuǎn)15;如為false,轉(zhuǎn)18;?判斷Buy1.count與Sell1.count之差,如大于0,轉(zhuǎn)16;如小于0,轉(zhuǎn)17;?開盤價(jià)為BuyQueue[i].price;總成交量為Sell1.count;統(tǒng)計(jì)成交數(shù)據(jù)及回報(bào),并返回;HPXYn。?開盤價(jià)為(SellQueue[j-1].price+BuyQueue[i-1].price)/2;總成交量為Sell1.count ;統(tǒng)計(jì)成交數(shù)據(jù)及回報(bào),并返回;G174q。? 判斷Buy1.count 與Sell.count 之差,如小于0,轉(zhuǎn)19;如等于0,轉(zhuǎn)20;?開盤價(jià)為SellQueue[j].price;總成交量為Buy1.count;統(tǒng)計(jì)成交數(shù)據(jù)及回報(bào),并返回;RuCnM。?開盤價(jià)為(SellQueue[j].price+BuyQueue[i-1].price)/2;總成交量為Buy1.count;統(tǒng)計(jì)成交數(shù)據(jù)及回報(bào),并返回;DgPpp。?開盤價(jià)為昨日收盤價(jià),成交量為0;保留所有數(shù)據(jù)至開盤進(jìn)入連續(xù)競(jìng)價(jià)撮合; 買賣隊(duì)列排序上面我們介紹了撮合算法的核心部分,但實(shí)際上在撮合前后都要對(duì)兩個(gè)買賣隊(duì)列進(jìn)行一定的插入和排列處理,這在整個(gè)算法中也是很重要的部分。下面我們就來(lái)具體介紹一下。Beacf。對(duì)所有的排列和插入我們考慮了效率問題之后,最后統(tǒng)一使用了二分插入排序法。在單子進(jìn)入隊(duì)列時(shí),我們首先統(tǒng)計(jì)出當(dāng)前隊(duì)列中的非空數(shù)據(jù)個(gè)數(shù),然后再通過新單子與當(dāng)前隊(duì)列中間值的價(jià)格比較,確定新單子在隊(duì)列的前半部分還是后半部分,然后再取該區(qū)域中間值與之比較,直到確定新單子應(yīng)在的位置。4N8pv。如下列代碼所示:intlow=0;inthigh=N-1;

//N

為隊(duì)列中非空元素的個(gè)數(shù)while(low<=high){intm=(low+high)/2;if(newlist->price<SellQueue[m].price)high=m-1;else low=m+1;}for(inti=N-1;i>=high+1;--i){SellQueue[i+1]=SellQueue[i];}SellQueue[high+1]=*newlist;這是賣隊(duì)列的排序,對(duì)于買隊(duì)列的排序與之相似,只是價(jià)格排列是由高到底。在這里不再贅述。這種插入排序方法完全符合了撮合算法中價(jià)格優(yōu)先、時(shí)間優(yōu)先的要求,而且效率也是比較高的。在集合競(jìng)價(jià)前和連續(xù)競(jìng)價(jià)后進(jìn)行的插入排序都是這樣進(jìn)行的,而在集合競(jìng)價(jià)撮合之后,對(duì)兩隊(duì)列的重新排列,我們首先使用了memset函數(shù)將前面已全部成交的t個(gè)元素清空,然后將t到N(原

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論