Example #1
0
        /// <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);
            }
        }
Example #2
0
        /// <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);
        }