Ejemplo n.º 1
0
        /// <summary>
        /// обработчик отчета об ошибках отмены моих ордеров
        /// </summary>
        private void OrderCancelRejectHandler(FixEntity entity)
        {
            try
            {
                string rej = entity.GetFieldByTag((int)Tags.CxlRejReason);

                if (rej == "1")
                {
                    Order order = new Order();
                    order.ServerType   = ServerType.Lmax;
                    order.NumberMarket = entity.GetFieldByTag((int)Tags.ClOrdID);
                    order.TimeCallBack = DateTime.UtcNow;
                    var numUser = entity.GetFieldByTag((int)Tags.OrigClOrdID);

                    try
                    {
                        order.NumberUser = Convert.ToInt32(numUser);
                    }
                    catch (Exception e)
                    {
                        return;
                    }
                    order.State = OrderStateType.Fail;
                    MyOrderEvent?.Invoke(order);
                    return;
                }
                SendLogMessage("Ошибка отмены ордера. Причина: " + _errorDictionary.CxlRejReason[rej] + "-" + entity.GetFieldByTag((int)Tags.Text), LogMessageType.Trade);
            }
            catch (ArgumentException e)
            {
                SendLogMessage(e.Message, LogMessageType.Error);
            }
            catch (Exception e)
            {
                SendLogMessage("OrderCancelRejectHandlerError " + e.Message, LogMessageType.Error);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// обработчик отчета о моих ордерах и сделках
        /// </summary>
        private void ExecutionReportHandler(FixEntity entity)
        {
            try
            {
                string type = entity.GetFieldByTag((int)Tags.ExecType);

                if (type != "F")
                {
                    Order order = new Order();
                    order.ServerType = ServerType.Lmax;
                    var time = entity.GetFieldByTag((int)Tags.TransactTime);
                    order.TimeCallBack     = DateTime.ParseExact(time, "yyyyMMdd-HH:mm:ss.fff", CultureInfo.CurrentCulture);
                    order.SecurityNameCode = entity.GetFieldByTag((int)Tags.SecurityID);
                    var numUser = entity.GetFieldByTag((int)Tags.ClOrdID);

                    if (type == "0")
                    {
                        try
                        {
                            // если пришел сигнал о новом ордере, но ClOrdID не может быть конвертирован в int, значит ордер создавался не в OsEngine, игнорим его
                            order.NumberUser = Convert.ToInt32(numUser);
                        }
                        catch (Exception e)
                        {
                            return;
                        }

                        order.State        = OrderStateType.Activ;
                        order.NumberMarket = entity.GetFieldByTag((int)Tags.OrderID);
                        order.Side         = entity.GetFieldByTag((int)Tags.Side) == "1" ? Side.Buy : Side.Sell;
                        order.Volume       = Convert.ToDecimal(entity.GetFieldByTag((int)Tags.OrderQty),
                                                               CultureInfo.InvariantCulture);

                        if (entity.GetFieldByTag((int)Tags.OrdType) == "2")
                        {
                            order.Price = Convert.ToDecimal(entity.GetFieldByTag((int)Tags.Price),
                                                            CultureInfo.InvariantCulture);
                        }

                        MyOrderEvent?.Invoke(order);

                        return;
                    }

                    if (type == "8")
                    {
                        try
                        {
                            order.NumberUser = Convert.ToInt32(numUser);
                        }
                        catch (Exception e)
                        {
                            return;
                        }

                        order.State = OrderStateType.Fail;

                        string rej = entity.GetFieldByTag((int)Tags.OrdRejReason);

                        SendLogMessage(
                            "Ошибка выставления ордера: " + _errorDictionary.OrdRejReason[rej] + "-" +
                            entity.GetFieldByTag((int)Tags.Text), LogMessageType.System);

                        MyOrderEvent?.Invoke(order);

                        return;
                    }

                    if (type == "4")
                    {
                        order.State      = OrderStateType.Cancel;
                        order.TimeCancel = order.TimeCallBack;
                        var oldNumUser = entity.GetFieldByTag((int)Tags.OrigClOrdID);

                        try
                        {
                            order.NumberUser = Convert.ToInt32(oldNumUser);
                        }
                        catch (Exception e)
                        {
                            return;
                        }

                        order.NumberMarket = entity.GetFieldByTag((int)Tags.OrderID);
                        order.Side         = entity.GetFieldByTag((int)Tags.Side) == "1" ? Side.Buy : Side.Sell;
                        order.Volume       = Convert.ToDecimal(entity.GetFieldByTag((int)Tags.OrderQty),
                                                               CultureInfo.InvariantCulture);

                        if (entity.GetFieldByTag((int)Tags.OrdType) == "2")
                        {
                            order.Price = Convert.ToDecimal(entity.GetFieldByTag((int)Tags.Price),
                                                            CultureInfo.InvariantCulture);
                        }

                        MyOrderEvent?.Invoke(order);
                    }
                    else if (type == "I")
                    {
                    }
                }
                else
                {
                    MyTrade trade = new MyTrade();
                    trade.Time = DateTime.ParseExact(entity.GetFieldByTag((int)Tags.TransactTime),
                                                     "yyyyMMdd-HH:mm:ss.fff", CultureInfo.CurrentCulture);
                    trade.NumberOrderParent = entity.GetFieldByTag((int)Tags.OrderID);
                    trade.NumberTrade       = entity.GetFieldByTag((int)Tags.ExecID);
                    trade.Volume            = Convert.ToDecimal(entity.GetFieldByTag((int)Tags.LastQty),
                                                                CultureInfo.InvariantCulture);
                    trade.Price = Convert.ToDecimal(entity.GetFieldByTag((int)Tags.LastPx),
                                                    CultureInfo.InvariantCulture);
                    trade.SecurityNameCode = entity.GetFieldByTag((int)Tags.SecurityID);

                    MyTradeEvent?.Invoke(trade);
                }
            }
            catch (ArgumentException e)
            {
                SendLogMessage(e.Message, LogMessageType.Error);
            }
            catch (Exception e)
            {
                SendLogMessage("ExecutionReportHandlerError " + e.Message, LogMessageType.Error);
            }
        }