private StackTradeResult TradeSell1Orders(StoneDelegateBuyOrderInfo buyOrder, List <StoneDelegateSellOrderInfo> listTradeSucceedSellOrders) { StackTradeResult buyOrderResult = new StackTradeResult(); decimal buyPrice = buyOrder.BuyUnit.Price; StackTradeUnit buyUnit = new StackTradeUnit() { Price = buyOrder.BuyUnit.Price, TradeStoneHandCount = buyOrder.BuyUnit.TradeStoneHandCount }; //只处理卖1 var sellUnit = this._todayTradeInfo.GetSell1Unit(); if (sellUnit == null) { return(buyOrderResult); } if (sellUnit.TradeStoneHandCount == 0 || !this._dicWaitingSellInfos.ContainsKey(sellUnit.Price) || this._dicWaitingSellInfos[sellUnit.Price] == null) { return(buyOrderResult); } if (buyPrice >= sellUnit.Price) { //成交,按量处理 buyOrderResult = TradeSamePriceSellOrder(sellUnit.Price, this._dicWaitingSellInfos[sellUnit.Price], listTradeSucceedSellOrders, buyUnit, buyOrder.UserName); if (buyOrderResult.State == StackTradeState.Succeed) { //买单 被全部消化 //暂时不清理卖单集合,被拆分的卖单,剩余部分在外部会重新加回卖单集合 buyOrder.BuyState = StoneDelegateBuyState.Succeed; buyOrder.FinishedStoneTradeHandCount = buyOrder.BuyUnit.TradeStoneHandCount; buyOrder.FinishedTime = new MyDateTime(DateTime.Now); } else if (buyOrderResult.State == StackTradeState.Splited) { //买单没有被全部消化,需要再对比处理上一级卖价。等所有卖价都对比完时,再返回 buyUnit.TradeStoneHandCount -= buyOrderResult.SucceedStoneHandCount; buyOrder.BuyState = StoneDelegateBuyState.Splited; buyOrder.FinishedStoneTradeHandCount = buyOrder.BuyUnit.TradeStoneHandCount - buyUnit.TradeStoneHandCount; buyOrder.FinishedTime = new MyDateTime(DateTime.Now); } } return(buyOrderResult); }
public StackTradeUnitUIModel(int index, bool isbuy, StackTradeUnit parent) { this.Index = index; this.IsBuy = isbuy; this.ParentObject = parent; }
/// <summary> /// 返回买单处理结果 /// </summary> /// <param name="sellPrice"></param> /// <param name="queueSellOrders"></param> /// <param name="listTradeSucceedSellOrders"></param> /// <param name="buyOrder"></param> /// <returns></returns> private StackTradeResult TradeSamePriceSellOrder(decimal sellPrice, ListStoneDelegateSellOrderInfoCollection queueSellOrders, List <StoneDelegateSellOrderInfo> listTradeSucceedSellOrders, StackTradeUnit buyUnit, string buyerUserName) { StackTradeResult buyOrderResult = new StackTradeResult(); //取出卖价对应的卖单 StoneDelegateSellOrderInfo sellOrder = queueSellOrders.Dequeue(); if (sellOrder == null) { return(buyOrderResult); } int surplusStoneHandCount = buyUnit.TradeStoneHandCount - sellOrder.SellUnit.TradeStoneHandCount; //买单量大于或等于卖单量 while (surplusStoneHandCount > 0)//继续找其他卖单凑量 { sellOrder.SellState = StoneDelegateSellState.Succeed; sellOrder.FinishedStoneTradeHandCount = sellOrder.SellUnit.TradeStoneHandCount; sellOrder.FinishedTime = new MyDateTime(DateTime.Now); listTradeSucceedSellOrders.Add(sellOrder); var operResult = this._todayTradeInfo.DecreaseSellUnit(sellOrder.SellUnit.Price, sellOrder.SellUnit.TradeStoneHandCount); if (operResult.OperResultCode != OperResult.RESULTCODE_TRUE) { LogHelper.Instance.AddErrorLog("TradeBuy1Orders DecreaseSellUnit Error1. " + operResult.Message, null); } var nextSellOrder = queueSellOrders.Dequeue(); if (nextSellOrder == null) { //说明已经没有当前价格的卖单了。 //买单只消化一部,需要被拆分 buyOrderResult.State = StackTradeState.Splited; buyOrderResult.SucceedStoneHandCount = buyUnit.TradeStoneHandCount - surplusStoneHandCount; return(buyOrderResult); } else { //判断下一卖单 sellOrder = nextSellOrder; surplusStoneHandCount = surplusStoneHandCount - sellOrder.SellUnit.TradeStoneHandCount; } } //卖单量等于买单量 if (surplusStoneHandCount == 0) { sellOrder.SellState = StoneDelegateSellState.Succeed; sellOrder.FinishedStoneTradeHandCount = sellOrder.SellUnit.TradeStoneHandCount; sellOrder.FinishedTime = new MyDateTime(DateTime.Now); listTradeSucceedSellOrders.Add(sellOrder); var operResult = this._todayTradeInfo.DecreaseSellUnit(sellOrder.SellUnit.Price, sellOrder.SellUnit.TradeStoneHandCount); if (operResult.OperResultCode != OperResult.RESULTCODE_TRUE) { LogHelper.Instance.AddErrorLog("TradeBuy1Orders DecreaseSellUnit Error2. " + operResult.Message, null); } } else { //卖单量大于买单量,需要将当前卖单拆分。将已成功的部分拆成一新订单添加到数据库中;将老订单缩减到剩余部分,继续留在市场中。 sellOrder.SellState = StoneDelegateSellState.Splited; sellOrder.FinishedStoneTradeHandCount = sellOrder.SellUnit.TradeStoneHandCount + surplusStoneHandCount; sellOrder.FinishedTime = new MyDateTime(DateTime.Now); listTradeSucceedSellOrders.Add(sellOrder); var operResult = this._todayTradeInfo.DecreaseSellUnit(sellOrder.SellUnit.Price, sellOrder.FinishedStoneTradeHandCount); if (operResult.OperResultCode != OperResult.RESULTCODE_TRUE) { LogHelper.Instance.AddErrorLog("TradeBuy1Orders DecreaseSellUnit Error3. " + operResult.Message, null); } DateTime nowTime = DateTime.Now; //拆分后的订单,再保存到数据库,并添加到集合中。 StoneDelegateSellOrderInfo newSellOrder = new StoneDelegateSellOrderInfo() { OrderNumber = OrderController.Instance.CreateOrderNumber(sellOrder.UserName, nowTime, AlipayTradeInType.StackStoneSell), UserID = sellOrder.UserID, UserName = sellOrder.UserName, SellState = StoneDelegateSellState.Waiting, DelegateTime = new MyDateTime(nowTime), SellUnit = new StackTradeUnit() { Price = sellOrder.SellUnit.Price, TradeStoneHandCount = sellOrder.SellUnit.TradeStoneHandCount - sellOrder.FinishedStoneTradeHandCount }, IsSubOrder = true }; try { DBProvider.StoneStackDBProvider.SaveWaitingStoneDelegateSellOrderInfo(newSellOrder); queueSellOrders.Enqueue(newSellOrder); } catch (Exception exc) { LogHelper.Instance.AddErrorLog("股票操作。TradeSamePriceSellOrder.SaveWaitingStoneDelegateSellOrderInfo 异常。信息为:" + newSellOrder.ToString(), exc); } } //买单已全部被消化 buyOrderResult.State = StackTradeState.Succeed; buyOrderResult.SucceedStoneHandCount = buyUnit.TradeStoneHandCount; return(buyOrderResult); }