//根据挂单情况获取可成交汇总 private SortedDictionary <double, int> getMarketWaitingVolumeSummary(StockTickTransaction tickData) { SortedDictionary <double, int> market = new SortedDictionary <double, int>(); if (tickData.Ask1 * tickData.AskV1 > 0) { market.Add(tickData.Ask1, Convert.ToInt32(tickData.AskV1)); } if (tickData.Ask2 * tickData.AskV2 > 0) { market.Add(tickData.Ask2, Convert.ToInt32(tickData.AskV2)); } if (tickData.Ask3 * tickData.AskV3 > 0) { market.Add(tickData.Ask3, Convert.ToInt32(tickData.AskV3)); } if (tickData.Ask4 * tickData.AskV4 > 0) { market.Add(tickData.Ask4, Convert.ToInt32(tickData.AskV4)); } if (tickData.Ask5 * tickData.AskV5 > 0) { market.Add(tickData.Ask5, Convert.ToInt32(tickData.AskV5)); } return(market); }
private int getTradableVolumeFromMarket(StockTickTransaction tickData, double price) { int volume = 0; SortedDictionary <double, int> market = new SortedDictionary <double, int>(); if (tickData.Bid1 * tickData.BidV1 > 0) { market.Add(tickData.Bid1, Convert.ToInt32(tickData.BidV1)); } if (tickData.Bid2 * tickData.BidV2 > 0) { market.Add(tickData.Bid2, Convert.ToInt32(tickData.BidV2)); } if (tickData.Bid3 * tickData.BidV3 > 0) { market.Add(tickData.Bid3, Convert.ToInt32(tickData.BidV3)); } if (tickData.Bid4 * tickData.BidV4 > 0) { market.Add(tickData.Bid4, Convert.ToInt32(tickData.BidV4)); } if (tickData.Bid5 * tickData.BidV5 > 0) { market.Add(tickData.Bid5, Convert.ToInt32(tickData.BidV5)); } foreach (var item in market) { if (item.Key >= price) { volume = +item.Value; } } return(volume); }
private void printTradingLog(TradeBook trade, List <OrderBook> orderBook, StockTickTransaction tickData) { //foreach (var order in orderBook) //{ // if (trade.orderId==order.orderId) // { // Console.WriteLine("成交时间:{0},挂单时间:{1},成交量:{2},成交价:{3},ask1:{4},bid1:{5},lp:{6}", trade.time, order.time, trade.volume, trade.price, tickData.Ask1, tickData.Bid1, tickData.LastPrice); // } //} }
private double getOrderPrice(int orderPriceMode, StockTickTransaction tickData) { double price = -1; switch (orderPriceMode) { case 5: price = tickData.Ask5; break; case 4: price = tickData.Ask4; break; case 3: price = tickData.Ask3; break; case 2: price = tickData.Ask2; break; case 1: price = tickData.Ask1; break; case -1: price = tickData.Bid1; break; case -2: price = tickData.Bid2; break; case -3: price = tickData.Bid3; break; case -4: price = tickData.Bid4; break; case -5: price = tickData.Bid5; break; default: break; } if (price == 0 && tickData.Bid1 != 0) { price = tickData.Bid1; } return(price); }
//撤单,撤掉五档行情之外的挂单 private void cancelDeviateOrders(ref List <OrderBook> orderBook, StockTickTransaction tickData) { foreach (var item in orderBook) { if (item.price > tickData.Ask5) { item.volume = 0; item.waitingVolume = 0; } } }
private List <StockTickTransaction> FetchDataFromSource(string code, DateTime date) { List <StockTickTransaction> list = new List <StockTickTransaction>(); var dt = dataSource.Get(code, new DateTime(date.Year, date.Month, date.Day, 9, 15, 0, 0), new DateTime(date.Year, date.Month, date.Day, 15, 1, 0, 0)); bool highLimitExists = false; if (dt.Columns.Contains("HighLimit")) { highLimitExists = true; } foreach (DataRow dr in dt.Rows) { StockTickTransaction tick = new StockTickTransaction(); tick.Code = Convert.ToString(dr["stkcd"]); tick.TransactionDateTime = Convert.ToDateTime(dr["tdatetime"]); tick.LastPrice = Convert.ToDouble(dr["cp"]); tick.Volume = Convert.ToDouble(dr["ts"]); tick.Amount = Convert.ToDouble(dr["tt"]); if (highLimitExists == true) { tick.HighLimit = Convert.ToDouble(dr["HighLimit"]); tick.LowLimit = Convert.ToDouble(dr["LowLimit"]); } tick.Ask1 = Convert.ToDouble(dr["S1"]); tick.Ask2 = Convert.ToDouble(dr["S2"]); tick.Ask3 = Convert.ToDouble(dr["S3"]); tick.Ask4 = Convert.ToDouble(dr["S4"]); tick.Ask5 = Convert.ToDouble(dr["S5"]); tick.AskV1 = Convert.ToDouble(dr["SV1"]); tick.AskV2 = Convert.ToDouble(dr["SV2"]); tick.AskV3 = Convert.ToDouble(dr["SV3"]); tick.AskV4 = Convert.ToDouble(dr["SV4"]); tick.AskV5 = Convert.ToDouble(dr["SV5"]); tick.Bid1 = Convert.ToDouble(dr["B1"]); tick.Bid2 = Convert.ToDouble(dr["B2"]); tick.Bid3 = Convert.ToDouble(dr["B3"]); tick.Bid4 = Convert.ToDouble(dr["B4"]); tick.Bid5 = Convert.ToDouble(dr["B5"]); tick.BidV1 = Convert.ToDouble(dr["BV1"]); tick.BidV2 = Convert.ToDouble(dr["BV2"]); tick.BidV3 = Convert.ToDouble(dr["BV3"]); tick.BidV4 = Convert.ToDouble(dr["BV4"]); tick.BidV5 = Convert.ToDouble(dr["BV5"]); list.Add(tick); } return(list); }
private StockTickTransaction onTick(int seconds, List <StockTickTransaction> data) { StockTickTransaction tick = new StockTickTransaction(); int secondsIndex = DataTimeStampExtension.GetStockSecondsIndex(data[0].TransactionDateTime); for (int i = 0; i < data.Count(); i++) { secondsIndex = DataTimeStampExtension.GetStockSecondsIndex(data[i].TransactionDateTime); if (secondsIndex <= seconds) { tick = data[i]; } else { break; } } return(tick); }
private void UpdateTickData(ref StockTickTransaction tickData, int volume) { int residualVolume = volume; residualVolume -= Convert.ToInt32(Math.Min(volume, tickData.BidV1)); tickData.BidV1 -= Math.Min(volume, tickData.BidV1); volume = residualVolume; residualVolume -= Convert.ToInt32(Math.Min(volume, tickData.BidV2)); tickData.BidV2 -= Math.Min(volume, tickData.BidV2); volume = residualVolume; residualVolume -= Convert.ToInt32(Math.Min(volume, tickData.BidV3)); tickData.BidV3 -= Math.Min(volume, tickData.BidV3); volume = residualVolume; residualVolume -= Convert.ToInt32(Math.Min(volume, tickData.BidV4)); tickData.BidV4 -= Math.Min(volume, tickData.BidV4); volume = residualVolume; residualVolume -= Convert.ToInt32(Math.Min(volume, tickData.BidV5)); tickData.BidV5 -= Math.Min(volume, tickData.BidV5); volume = residualVolume; }
private List <StockTickTransaction> ConvertToTicks(string code, HashEntry[] hashEntries) { var ticks = new List <StockTickTransaction>(); for (int i = 0; i < hashEntries.Length; i++) { var array = hashEntries[i].Value.ToString().Split(','); var tick = new StockTickTransaction() { Code = code, TransactionDateTime = hashEntries[i].Name.ToString().ToDateTime(), LastPrice = array[0].ConvertTo <double>(), Ask1 = array[1].ConvertTo <double>(), Ask2 = array[2].ConvertTo <double>(), Ask3 = array[3].ConvertTo <double>(), Ask4 = array[4].ConvertTo <double>(), Ask5 = array[5].ConvertTo <double>(), Bid1 = array[6].ConvertTo <double>(), Bid2 = array[7].ConvertTo <double>(), Bid3 = array[8].ConvertTo <double>(), Bid4 = array[9].ConvertTo <double>(), Bid5 = array[10].ConvertTo <double>(), AskV1 = array[11].ConvertTo <double>(), AskV2 = array[12].ConvertTo <double>(), AskV3 = array[13].ConvertTo <double>(), AskV4 = array[14].ConvertTo <double>(), AskV5 = array[15].ConvertTo <double>(), BidV1 = array[16].ConvertTo <double>(), BidV2 = array[17].ConvertTo <double>(), BidV3 = array[18].ConvertTo <double>(), BidV4 = array[19].ConvertTo <double>(), BidV5 = array[20].ConvertTo <double>(), Volume = array[21].ConvertTo <double>(), Amount = array[22].ConvertTo <double>(), HighLimit = array[23].ConvertTo <double>(), LowLimit = array[24].ConvertTo <double>() }; ticks.Add(tick); } return(ticks); }
public static List <StockTickTransaction> ModifyStockTickData(List <StockTickTransaction> original) { var timelist = GetStockTickStamp(); StockTickTransaction[] modify = new StockTickTransaction[timelist.Count]; int timeIndex = 0; DateTime today = new DateTime(original[0].TransactionDateTime.Year, original[0].TransactionDateTime.Month, original[0].TransactionDateTime.Day); for (int j = 0; j < original.Count; j++) { while (original[j].TransactionDateTime.TimeOfDay >= timelist[timeIndex] && timeIndex < timelist.Count - 1) { timeIndex++; } if (original[j].TransactionDateTime.TimeOfDay < timelist[timeIndex]) { var data0 = original[j]; modify[timeIndex - 1] = new StockTickTransaction { Ask1 = data0.Ask1, Ask2 = data0.Ask2, Ask3 = data0.Ask3, Ask4 = data0.Ask4, Ask5 = data0.Ask5, AskV1 = data0.AskV1, AskV2 = data0.AskV2, AskV3 = data0.AskV3, AskV4 = data0.AskV4, AskV5 = data0.AskV5, Bid1 = data0.Bid1, Bid2 = data0.Bid2, Bid3 = data0.Bid3, Bid4 = data0.Bid4, Bid5 = data0.Bid5, BidV1 = data0.BidV1, BidV2 = data0.BidV2, BidV3 = data0.BidV3, BidV4 = data0.BidV4, BidV5 = data0.BidV5, Amount = data0.Amount, Code = data0.Code, LastPrice = data0.LastPrice, TransactionDateTime = data0.TransactionDateTime, Volume = data0.Volume }; } } for (int i = 1; i < timelist.Count; i++) { if (modify[i] == null && modify[i - 1] != null) { var data0 = modify[i - 1]; modify[i] = new StockTickTransaction { Ask1 = data0.Ask1, Ask2 = data0.Ask2, Ask3 = data0.Ask3, Ask4 = data0.Ask4, Ask5 = data0.Ask5, AskV1 = data0.AskV1, AskV2 = data0.AskV2, AskV3 = data0.AskV3, AskV4 = data0.AskV4, AskV5 = data0.AskV5, Bid1 = data0.Bid1, Bid2 = data0.Bid2, Bid3 = data0.Bid3, Bid4 = data0.Bid4, Bid5 = data0.Bid5, BidV1 = data0.BidV1, BidV2 = data0.BidV2, BidV3 = data0.BidV3, BidV4 = data0.BidV4, BidV5 = data0.BidV5, Amount = data0.Amount, Code = data0.Code, LastPrice = data0.LastPrice, TransactionDateTime = data0.TransactionDateTime, Volume = data0.Volume }; modify[i].TransactionDateTime = today + timelist[i]; } if (modify[i] != null) { modify[i].TransactionDateTime = today + timelist[i]; } } return(modify.ToList()); }
//根据盘口数据更新orderbook中的waitingvolume字段 private void modifyOrderBookByTickData(ref List <OrderBook> orderBook, StockTickTransaction tickData) { var marketSummary = getMarketWaitingVolumeSummary(tickData); var orderSummary = getOrderBookSummary(orderBook); foreach (var market in marketSummary) { if (orderSummary.ContainsKey(market.Key) && orderSummary[market.Key] > 0) { //从后往前更新数据 int waitingVolume = market.Value; for (int i = orderBook.Count() - 1; i >= 0; i--) { var order = orderBook[i]; if (order.price == market.Key && order.volume > 0) { order.waitingVolume = waitingVolume; waitingVolume = Math.Max(waitingVolume - order.volume, 0); } } } } }
private void placeAnOrder(ref List <OrderBook> orderBook, StockTickTransaction tickData, double price, DateTime time, int volume, int orderId) { var marketSummary = getMarketWaitingVolumeSummary(tickData); var order = new OrderBook(); order.time = time; order.price = price; order.orderId = orderId; order.volume = volume; order.code = tickData.Code; order.waitingVolume = 0; if (marketSummary.ContainsKey(price)) { order.waitingVolume = marketSummary[price]; } else if (marketSummary.Count() > 0) { if (price > marketSummary.Keys.Max() && marketSummary.Keys.Max() > 0) { order.waitingVolume = 2 * marketSummary[marketSummary.Keys.Max()]; } } orderBook.Add(order); }
private double getStockMidPrice(StockTickTransaction tick, double volumeTarget = 1000) { double mid = 0; if (tick == null || tick.AskV1 == 0 || tick.BidV1 == 0 || tick.Ask1 == 0 || tick.Bid1 == 0) { return(mid); } var askv1 = Math.Min(volumeTarget, tick.AskV1); var askv2 = Math.Max(Math.Min(volumeTarget - askv1, tick.AskV2), 0); var askv3 = Math.Max(Math.Min(volumeTarget - askv1 - askv2, tick.AskV3), 0); var askv4 = Math.Max(Math.Min(volumeTarget - askv1 - askv2 - askv3, tick.AskV4), 0); var askv5 = Math.Max(Math.Min(volumeTarget - askv1 - askv2 - askv3 - askv4, tick.AskV5), 0); var bidv1 = Math.Min(volumeTarget, tick.BidV1); var bidv2 = Math.Max(Math.Min(volumeTarget - bidv1, tick.BidV2), 0); var bidv3 = Math.Max(Math.Min(volumeTarget - bidv1 - bidv2, tick.BidV3), 0); var bidv4 = Math.Max(Math.Min(volumeTarget - bidv1 - bidv2 - bidv3, tick.BidV4), 0); var bidv5 = Math.Max(Math.Min(volumeTarget - bidv1 - bidv2 - bidv3 - bidv4, tick.BidV5), 0); var askvtotal = askv1 + askv2 + askv3 + askv4 + askv5; var bidvtotal = bidv1 + bidv2 + bidv3 + bidv4 + bidv5; mid = (askv1 * tick.Ask1 + askv2 * tick.Ask2 + askv3 * tick.Ask3 + askv4 * tick.Ask4 + askv5 * tick.Ask5 + bidv1 * tick.Bid1 + bidv2 * tick.Bid2 + bidv3 * tick.Bid3 + bidv4 * tick.Bid4 + bidv5 * tick.Bid5) / (askvtotal + bidvtotal); return(mid); }
//按盘口价格模拟成交 private void transactionSimulation(ref List <OrderBook> orderBook, ref List <TradeBook> tradeBook, StockTickTransaction tickData) { //如果orderbook上的挂单时间早于tickData数据的时间,认为orderbook的挂单完全成交。 for (int i = 0; i < orderBook.Count(); i++) { var order = orderBook[i]; if (order.time < tickData.TransactionDateTime) { if (order.price <= tickData.Bid1 && order.volume > 0) //若order的卖价小于等于bid1的价格,认为其在该时刻已经成交了。 { //记录成交信息 TradeBook trade = new TradeBook(); trade.tradeId = tradeId; tradeId += 1; trade.time = tickData.TransactionDateTime; trade.price = order.price; trade.volume = order.volume; trade.orderId = order.orderId; //刷新orderbook情况 UpdateOrderBookWaitingVolume(order.price, orderBook[i].waitingVolume + orderBook[i].volume, i + 1, ref orderBook); order.waitingVolume = 0; order.volume = 0; tradeBook.Add(trade); printTradingLog(trade, orderBook, tickData); } } } //如果orderbook上的挂单时间等于或者晚于tickData数据的时间,按照盘口成交,并减少盘口的量。 var summary = getOrderBookSummary(orderBook);//先汇总挂单价格 //按挂单价格遍历 foreach (var price in summary.Keys) { for (int i = 0; i < orderBook.Count(); i++)//按order挂单的先后顺序成交 { int tradableVolume = getTradableVolumeFromMarket(tickData, price); int tradedVolume = 0; if (tradableVolume <= 0) { break; } var order = orderBook[i]; if (orderBook[i].volume == 0 || orderBook[i].price != price) { continue; } //先成交他人的订单 if (tradableVolume <= orderBook[i].waitingVolume) { //无法成交 UpdateOrderBookWaitingVolume(price, tradableVolume, i, ref orderBook); tradedVolume = tradableVolume; tradableVolume = 0; UpdateTickData(ref tickData, tradedVolume); break; } //再成交策略的挂单 else if (tradableVolume <= orderBook[i].waitingVolume + orderBook[i].volume) { //部分成交 UpdateOrderBookWaitingVolume(price, tradableVolume, i + 1, ref orderBook); TradeBook trade = new TradeBook(); trade.tradeId = tradeId; tradeId += 1; trade.time = tickData.TransactionDateTime; trade.price = price; trade.volume = tradableVolume - orderBook[i].waitingVolume; trade.orderId = orderBook[i].orderId; UpdateOrderBookWaitingVolume(price, tradableVolume, i + 1, ref orderBook); orderBook[i].volume -= tradableVolume - orderBook[i].waitingVolume; orderBook[i].waitingVolume = 0; tradedVolume = tradableVolume; UpdateTickData(ref tickData, tradedVolume); tradableVolume = 0; tradeBook.Add(trade); printTradingLog(trade, orderBook, tickData); break; } else { //完全成交 UpdateOrderBookWaitingVolume(price, orderBook[i].waitingVolume + orderBook[i].volume, i + 1, ref orderBook); TradeBook trade = new TradeBook(); trade.code = code; trade.tradeId = tradeId; tradeId += 1; trade.time = tickData.TransactionDateTime; trade.price = price; trade.volume = orderBook[i].volume; trade.orderId = orderBook[i].orderId; UpdateOrderBookWaitingVolume(price, tradableVolume, i + 1, ref orderBook); tradedVolume = orderBook[i].waitingVolume + orderBook[i].volume; orderBook[i].volume = 0; orderBook[i].waitingVolume = 0; UpdateTickData(ref tickData, tradedVolume); tradableVolume -= tradedVolume; tradeBook.Add(trade); printTradingLog(trade, orderBook, tickData); } } } }
private List <StockTickTransaction> getMergeData(List <StockTickTransaction> list1, List <StockTickTransaction> list2) { List <StockTickTransaction> list = new List <StockTickTransaction>(); foreach (var item in list1) { StockTickTransaction trans = new StockTickTransaction(); trans.Volume = item.Volume; trans.Amount = item.Amount; trans.Code = item.Code; trans.LastPrice = item.LastPrice; trans.TransactionDateTime = item.TransactionDateTime; trans.Ask1 = item.Ask1; trans.Ask2 = item.Ask2; trans.Ask3 = item.Ask3; trans.Ask4 = item.Ask4; trans.Ask5 = item.Ask5; trans.AskV1 = item.AskV1; trans.AskV2 = item.AskV2; trans.AskV3 = item.AskV3; trans.AskV4 = item.AskV4; trans.AskV5 = item.AskV5; trans.Bid1 = item.Bid1; trans.Bid2 = item.Bid2; trans.Bid3 = item.Bid3; trans.Bid4 = item.Bid4; trans.Bid5 = item.Bid5; trans.BidV1 = item.BidV1; trans.BidV2 = item.BidV2; trans.BidV3 = item.BidV3; trans.BidV4 = item.BidV4; trans.BidV5 = item.BidV5; list.Add(trans); } foreach (var item in list2) { StockTickTransaction trans = new StockTickTransaction(); trans.Volume = item.Volume; trans.Amount = item.Amount; trans.Code = item.Code; trans.LastPrice = item.LastPrice; trans.TransactionDateTime = item.TransactionDateTime; trans.Ask1 = item.Ask1; trans.Ask2 = item.Ask2; trans.Ask3 = item.Ask3; trans.Ask4 = item.Ask4; trans.Ask5 = item.Ask5; trans.AskV1 = item.AskV1; trans.AskV2 = item.AskV2; trans.AskV3 = item.AskV3; trans.AskV4 = item.AskV4; trans.AskV5 = item.AskV5; trans.Bid1 = item.Bid1; trans.Bid2 = item.Bid2; trans.Bid3 = item.Bid3; trans.Bid4 = item.Bid4; trans.Bid5 = item.Bid5; trans.BidV1 = item.BidV1; trans.BidV2 = item.BidV2; trans.BidV3 = item.BidV3; trans.BidV4 = item.BidV4; trans.BidV5 = item.BidV5; list.Add(trans); } return(list.OrderBy(x => x.TransactionDateTime).ToList()); }