/// <summary> /// send order /// исполнить ордер /// </summary> public void SendOrder(Order order) { var guid = Guid.NewGuid().ToString().Replace('-', '0'); string needId = guid; while (needId.Length > 32) { needId = needId.Remove(needId.Length - 1); } var result = _client.SendOrder(order, needId); if (result == null || result.Code != 0) { order.State = OrderStateType.Fail; MyOrderEvent?.Invoke(order); SendLogMessage($"Order placement error № {result?.Code}.", LogMessageType.Error); } else if (result.Data.Status == "Ack") { var newCoupler = new OrderCoupler() { OsOrderNumberUser = order.NumberUser, OrderNumberMarket = result.Data.Info.OrderId, }; _couplers.Add(newCoupler); order.State = OrderStateType.Activ; order.NumberMarket = result.Data.Info.OrderId; MyOrderEvent?.Invoke(order); } else if (result.Data.Status == "DONE") { var newCoupler = new OrderCoupler() { OsOrderNumberUser = order.NumberUser, OrderNumberMarket = result.Data.Info.OrderId, }; _couplers.Add(newCoupler); order.State = OrderStateType.Done; order.NumberMarket = result.Data.Info.OrderId; MyOrderEvent?.Invoke(order); } }
/// <summary> /// order and trade came /// пришел ордер и трейд /// </summary> /// <param name="bitMaxOrder"></param> private void ClientMyOrderEvent(OrderState bitMaxOrder) { var data = bitMaxOrder.Data; OrderCoupler needCoupler = _couplers.Find(c => c.OrderNumberMarket == data.OrderId); if (needCoupler == null) { return; } Order order = new Order(); order.NumberUser = needCoupler.OsOrderNumberUser; order.NumberMarket = data.OrderId; order.PortfolioNumber = data.S.Split('/')[1]; order.Price = data.P.ToDecimal(); order.Volume = data.Q.ToDecimal(); order.Side = data.Sd == "Buy" ? Side.Buy : Side.Sell; order.SecurityNameCode = data.S; order.ServerType = ServerType; order.TimeCallBack = TimeManager.GetDateTimeFromTimeStamp(Convert.ToInt64(data.T)); order.TypeOrder = OrderPriceType.Limit; if (data.St == "New") { order.State = OrderStateType.Activ; } else if (data.St == "Canceled") { order.State = OrderStateType.Cancel; _couplers.Remove(needCoupler); } else if (data.St == "PartiallyFilled") { order.State = OrderStateType.Patrial; } else if (data.St == "Filled") { order.State = OrderStateType.Done; _couplers.Remove(needCoupler); } else if (data.St == "Rejected") { order.State = OrderStateType.Fail; } if (bitMaxOrder.Data.St == "PartiallyFilled" || bitMaxOrder.Data.St == "Filled") { var cumVolume = data.Cfq.ToDecimal(); var tradeVolume = cumVolume - needCoupler.CurrentVolume; needCoupler.CurrentVolume += tradeVolume; MyTrade myTrade = new MyTrade { NumberOrderParent = data.OrderId, Side = data.Sd == "Buy" ? Side.Buy : Side.Sell, SecurityNameCode = data.S, Price = data.Ap.ToDecimal(), Volume = tradeVolume, NumberTrade = data.Sn.ToString(), Time = TimeManager.GetDateTimeFromTimeStamp(Convert.ToInt64(data.T)), }; MyTradeEvent?.Invoke(myTrade); } MyOrderEvent?.Invoke(order); }