예제 #1
0
        public OrderDbInfo BuscarOrdemPorClOrdEOrigClOrd(string clordid, string origclord, string symbol)
        {
            try
            {
                OrderDbInfo    ret = new OrderDbInfo();
                SqlDataAdapter lAdapter;
                AbrirConexao(_strConnectionStringDefault);
                DataSet lDataSet = new DataSet();
                _sqlCommand = new SqlCommand("prc_fix_buscar_ordem_clordid_origcld", _sqlConn);

                _sqlCommand.CommandType = System.Data.CommandType.StoredProcedure;
                _sqlCommand.Parameters.Add(new SqlParameter("@ClOrdId", clordid));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrigClOrdId", origclord));
                _sqlCommand.Parameters.Add(new SqlParameter("@Symbol", symbol));
                lAdapter = new SqlDataAdapter(_sqlCommand);
                lAdapter.Fill(lDataSet);
                foreach (DataRow lRow in lDataSet.Tables[0].Rows)
                {
                    ret.OrderID            = lRow["OrderID"].DBToInt32();
                    ret.OrigClOrdID        = lRow["OrigClOrdID"].DBToString();
                    ret.ExchangeNumberID   = lRow["ExchangeNumberID"].DBToString();
                    ret.ClOrdID            = lRow["ClOrdID"].DBToString();
                    ret.Account            = lRow["Account"].DBToInt32();
                    ret.Symbol             = lRow["Symbol"].DBToString();
                    ret.SecurityExchangeID = lRow["SecurityExchangeID"].DBToString();
                    ret.StopStartID        = lRow["StopStartID"].DBToInt32();
                    ret.OrdTypeID          = lRow["OrdTypeID"].DBToString();
                    ret.OrdStatus          = lRow["OrdStatusID"].DBToInt32();
                    ret.RegisterTime       = lRow["RegisterTime"].DBToDateTime();
                    ret.TransactTime       = lRow["TransactTime"].DBToDateTime();

                    ret.ExpireDate        = lRow["ExpireDate"].DBToDateTime();
                    ret.TimeInForce       = lRow["TimeInForce"].DBToString();
                    ret.ChannelID         = lRow["ChannelID"].DBToInt32();
                    ret.ExecBroker        = lRow["ExecBroker"].DBToString();
                    ret.Side              = lRow["Side"].DBToInt32();
                    ret.OrderQty          = lRow["OrderQty"].DBToInt32();
                    ret.OrderQtyRemaining = lRow["OrderQtyRemaining"].DBToInt32();
                    ret.OrderQtyMin       = lRow["MinQty"].DBToDecimal();
                    ret.OrderQtyApar      = lRow["MaxFloor"].DBToDecimal();
                    ret.Price             = lRow["Price"].DBToDecimal();
                    ret.CumQty            = lRow["CumQty"].DBToInt32();
                    ret.FixMsgSeqNum      = lRow["FixMsgSeqNum"].DBToInt32();
                    ret.SystemID          = lRow["SystemID"].DBToString();
                    ret.Memo              = lRow["Memo"].DBToString();
                    ret.FixMsgSeqNum      = lRow["FixMsgSeqNum"].DBToInt32();
                    ret.SessionID         = lRow["SessionID"].DBToString();
                    ret.SessionIDOriginal = lRow["SessionIDOrigin"].DBToString();
                    ret.IdFix             = lRow["IDSession"].DBToInt32();
                }
                FecharConexao();
                return(ret);
            }
            catch (Exception ex)
            {
                FecharConexao();
                logger.Error("BuscarOrdem(): " + ex.Message, ex);
                return(null);
            }
        }
예제 #2
0
        public bool AtualizarOrdem(OrderDbInfo order)
        {
            try
            {
                AbrirConexao(_strConnectionStringDefault);
                _sqlCommand             = new SqlCommand("prc_fix_atualizar_ordem", _sqlConn);
                _sqlCommand.CommandType = System.Data.CommandType.StoredProcedure;
                _sqlCommand.Parameters.Add(new SqlParameter("@OrderID", order.OrderID));
                _sqlCommand.Parameters.Add(new SqlParameter("@ClOrdID", order.ClOrdID));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrigClOrdID", order.OrigClOrdID));
                _sqlCommand.Parameters.Add(new SqlParameter("@ExchangeNumberID", order.ExchangeNumberID));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrdStatusID", order.OrdStatus));
                _sqlCommand.Parameters.Add(new SqlParameter("@TransactTime", order.TransactTime));
                if (DateTime.MinValue != order.ExpireDate)
                {
                    _sqlCommand.Parameters.Add(new SqlParameter("@ExpireDate", order.ExpireDate));
                }
                else
                {
                    _sqlCommand.Parameters.Add(new SqlParameter("@ExpireDate", DBNull.Value));
                }
                _sqlCommand.Parameters.Add(new SqlParameter("@TimeInForce", order.TimeInForce));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrderQty", order.OrderQty));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrderQtyMin", order.OrderQtyMin));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrderQtyApar", order.OrderQtyApar));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrderQtyRemaining", order.OrderQtyRemaining));
                _sqlCommand.Parameters.Add(new SqlParameter("@CumQty", order.CumQty));
                _sqlCommand.Parameters.Add(new SqlParameter("@Price", order.Price));
                _sqlCommand.Parameters.Add(new SqlParameter("@FixMsgSeqNum", order.FixMsgSeqNum));
                _sqlCommand.Parameters.Add(new SqlParameter("@Memo", order.Memo));
                if (string.IsNullOrEmpty(order.HandlInst))
                {
                    _sqlCommand.Parameters.Add(new SqlParameter("@HandlInst", DBNull.Value));
                }
                else
                {
                    _sqlCommand.Parameters.Add(new SqlParameter("@HandlInst", order.HandlInst));
                }

                if (string.IsNullOrEmpty(order.MsgFix))
                {
                    _sqlCommand.Parameters.Add(new SqlParameter("@MsgFix", DBNull.Value));
                }
                else
                {
                    _sqlCommand.Parameters.Add(new SqlParameter("@MsgFix", order.MsgFix));
                }
                int rows = _sqlCommand.ExecuteNonQuery();
                FecharConexao();
                return(true);
            }
            catch (Exception ex)
            {
                _dbArq.AtualizarOrdem(order);
                FecharConexao();
                logger.Error("AtualizarOrdem(): " + ex.Message, ex);
                return(false);
            }
        }
예제 #3
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="info"></param>
 public void EnqueueCallback(OrderDbInfo info)
 {
     try
     {
         lock (qDBOrdemInfoConvert)
         {
             this.qDBOrdemInfoConvert.Enqueue(info);
         }
     }
     catch (Exception ex)
     {
         logger.Error("EnqueueCallback: " + ex.Message, ex);
     }
 }
예제 #4
0
파일: DbArquivo.cs 프로젝트: radtek/Gradual
 public void AtualizarOrdem(OrderDbInfo order)
 {
     try
     {
         loggerCliente.InfoFormat(_sb_prc_fix_atualizar_ordem.ToString(),
                                  order.OrderID, order.ClOrdID, order.OrigClOrdID, order.ExchangeNumberID, order.OrdStatus,
                                  DateTime.MinValue == order.TransactTime ? "NULL" : "'" + order.TransactTime.ToString("yyyy-MM-dd HH:mm:sss.fff") + "'",
                                  DateTime.MinValue == order.ExpireDate ? "NULL" : "'" + order.ExpireDate.ToString("yyyy-MM-dd HH:mm:sss.fff") + "'",
                                  order.TimeInForce, order.OrderQty, order.OrderQtyMin,
                                  order.OrderQtyApar, order.OrderQtyRemaining, order.CumQty, order.Price, order.FixMsgSeqNum,
                                  order.Memo);
     }
     catch (Exception ex)
     {
         logger.Error("Problemas na escrita do arquivo AtualizarOrdem: " + ex.Message, ex);
     }
 }
예제 #5
0
파일: DbArquivo.cs 프로젝트: radtek/Gradual
 public void InserirOrdem(OrderDbInfo order)
 {
     try
     {
         loggerCliente.InfoFormat(_sb_prc_fix_inserir_ordem.ToString(),
                                  order.OrderID, order.ClOrdID, order.StopStartID, order.OrigClOrdID, order.ExchangeNumberID,
                                  order.Account, order.Symbol, order.SecurityExchangeID, order.OrdTypeID, order.OrdStatus,
                                  DateTime.MinValue == order.TransactTime ? "NULL" : "'" + order.TransactTime.ToString("yyyy-MM-dd HH:mm:sss.fff") + "'",
                                  DateTime.MinValue == order.ExpireDate ? "NULL" : "'" + order.ExpireDate.ToString("yyyy-MM-dd HH:mm:sss.fff") + "'",
                                  order.TimeInForce, order.ChannelID, order.ExecBroker,
                                  order.Side, order.OrderQty, order.OrderQtyMin, order.OrderQtyApar, order.OrderQtyRemaining,
                                  order.Price, order.CumQty, order.Description, order.FixMsgSeqNum, order.SystemID, order.Memo,
                                  order.SessionID);
     }
     catch (Exception ex)
     {
         logger.Error("Problemas na escrita do arquivo InserirOrdem: " + ex.Message, ex);
     }
 }
예제 #6
0
        /// <summary>
        ///
        /// </summary>
        public void dbOrdemInfoConverter()
        {
            while (_bKeepRunning)
            {
                try
                {
                    if (qDBOrdemInfoConvert.Count > 0)
                    {
                        OrderDbInfo dbInfo = null;
                        lock (qDBOrdemInfoConvert)
                        {
                            dbInfo = qDBOrdemInfoConvert.Dequeue();
                        }

                        if (dbInfo != null)
                        {
                            OrdemInfo converted = Conversions.OrderDBInfo2OrdemInfo(dbInfo);

                            lock (qOrdemInfo)
                            {
                                qOrdemInfo.Enqueue(converted);
                            }
                        }
                    }
                    else
                    {
                        Thread.Sleep(100);
                    }
                }
                catch (Exception ex)
                {
                    logger.Error("dbOrdemInfoConverter:" + ex.Message, ex);
                    Thread.Sleep(100);
                }
            }
        }
예제 #7
0
        private bool _er_Update(ExecutionReport er, FixOrderStatus ordS, string desc, string bolsa)
        {
            try
            {
                int account;
                if (bolsa.Equals(ExchangePrefixes.BOVESPA, StringComparison.InvariantCultureIgnoreCase))
                {
                    string acc = er.Account.getValue();
                    acc     = (acc.Remove(acc.Length - 1));
                    account = Convert.ToInt32(acc);
                }
                else
                {
                    account = Convert.ToInt32(er.Account.getValue());
                }

                // Buscar Ordem Original, de algum jeito!!!
                // 1a. tentativa: Tentar via ExchangeNumber
                // 2a. tentativa: Tentar via ClOrdID e OrigClOrdID
                // 3a. tentativa: Tentar via ClOrdID no tb_fix_order_update e buscar a ordem pelo OrderID
                // 4a. tentativa: ahhh foda-se, nao achou mesmo

                OrderDbInfo orderOrig = null;

                // 1a. tentativa
                if (er.IsSetOrderID() && !er.OrderID.getValue().Equals("NONE"))
                {
                    orderOrig = _db.BuscarOrdemPorExchangeNumber(er.OrderID.getValue());
                }
                // 2a. Tentativa
                if (null == orderOrig || orderOrig.OrderID == 0)
                {
                    orderOrig = _db.BuscarOrdem(er.ClOrdID.getValue(), account, er.Symbol.getValue());
                    if (orderOrig.OrderID == 0)
                    {
                        // Se ordem nao encontrada, entao procurar pelo OrigClOrdID
                        if (er.IsSetOrigClOrdID())
                        {
                            orderOrig = _db.BuscarOrdem(er.OrigClOrdID.getValue(), account, er.Symbol.getValue());
                            if (orderOrig.OrderID == 0)
                            {
                                orderOrig = _db.BuscarOrdem(er.OrigClOrdID.getValue(), account, er.Symbol.getValue(), true);
                                //if (orderOrig.OrderID == 0)
                                //{
                                //    logger.Info("01 ER - Nao achou a ordem em questao!!!: " + er.OrigClOrdID.getValue() + " Status: " + ordS.ToString() + " Desc: " + desc);
                                //    return false;
                                //}
                            }
                            else
                            {
                                orderOrig = _db.BuscarOrdem(er.OrigClOrdID.getValue(), account, er.Symbol.getValue());
                            }
                        }
                        else
                        {
                            orderOrig = _db.BuscarOrdem(er.ClOrdID.getValue(), account, er.Symbol.getValue(), true);
                            //if (orderOrig.OrderID == 0)
                            //{
                            //    logger.Info("02 ER - Nao achou a ordem em questao!!!: " + er.ClOrdID.getValue() + " Status: " + ordS.ToString() + " Desc: " + desc);
                            //    return false;
                            //}
                        }
                    }
                }

                // 3a. Tentativa
                if (null == orderOrig || orderOrig.OrderID == 0)
                {
                    // Buscar a partir de tb_fix_order_update
                    OrderDbUpdateInfo orderUpdate = _db.BuscarOrdemUpdate(er.ClOrdID.getValue());
                    // Buscar ordem original a partir do order ID
                    if (orderUpdate.OrderID != 0)
                    {
                        orderOrig = _db.BuscarOrdemPorOrderID(orderUpdate.OrderID);
                    }
                    else
                    {
                        logger.Info("01 ER - Nao achou a ordem em questao!!!: " + er.ClOrdID.getValue() + " Status: " + ordS.ToString() + " Desc: " + desc);
                        return(false);
                    }
                }
                if (null == orderOrig || orderOrig.OrderID == 0)
                {
                    logger.Info("02 ER - Nao achou a ordem em questao!!!: " + er.ClOrdID.getValue() + " Status: " + ordS.ToString() + " Desc: " + desc);
                    return(false);
                }
                //}
                //else
                //{
                //    orderOrig = _db.BuscarOrdemPorExchangeNumber(er.OrderID.getValue());
                //    if (orderOrig.OrderID == 0)
                //    {
                //        logger.Info("ER - Nao achou a ordem em questao via exchange number (OrderID ER)!!!: " + er.OrderID.getValue() + " Status: " + ordS.ToString() + " Desc: " + desc);
                //        return false;
                //    }
                // }
                // Adicionar OrdemDetalhe
                OrderDbDetalheInfo detail = new OrderDbDetalheInfo();
                detail.OrderID       = orderOrig.OrderID;
                detail.TransactID    = er.ExecID.getValue();
                detail.OrderQty      = Convert.ToInt32(er.OrderQty.getValue());
                detail.Price         = er.IsSetField(Tags.Price) ? er.Price.getValue() : Decimal.Zero;
                detail.OrderStatusID = (int)ordS;
                detail.TransactTime  = er.TransactTime.getValue();
                if (er.IsSetField(Tags.Text))
                {
                    detail.Description = desc + " - " + er.Text.getValue();
                }
                else
                {
                    detail.Description = desc;
                }

                detail.TradeQty     = er.IsSetField(Tags.LastQty) ? Convert.ToInt32(er.LastQty.getValue()) : 0;
                detail.CumQty       = er.IsSetField(Tags.CumQty) ? Convert.ToInt32(er.CumQty.getValue()) : 0;
                detail.FixMsgSeqNum = Convert.ToInt32(er.Header.GetField(Tags.MsgSeqNum));
                if (!_db.InserirOrdemDetalhe(detail, orderOrig.ClOrdID))
                {
                    logger.Info("Erro ao inserir o registro na tabela tb_fix_order_update");
                    return(false);
                }

                // Atualizar Ordem
                orderOrig.ExchangeNumberID = er.OrderID.getValue();
                orderOrig.OrdStatus        = (int)ordS;
                orderOrig.TransactTime     = er.TransactTime.getValue();
                // orderOrig.ClOrdID = er.ClOrdID.getValue();
                // if (er.IsSetOrigClOrdID())
                //    orderOrig.OrigClOrdID = er.OrigClOrdID.getValue();
                if (er.IsSetField(Tags.LeavesQty))
                {
                    orderOrig.OrderQtyRemaining = Convert.ToInt32(er.LeavesQty.getValue());
                }
                if (er.IsSetField(Tags.CumQty))
                {
                    orderOrig.CumQty = Convert.ToInt32(er.CumQty.getValue());
                }
                orderOrig.Memo = er.IsSetField(Tags.Memo) ? er.GetField(Tags.Memo): string.Empty;
                if (!_db.AtualizarOrdem(orderOrig))
                {
                    logger.Info("Problemas na atualizacao da ordem. ClOrdID: " + orderOrig.ClOrdID);
                    return(false);
                }

                DropCopyCallbackManager.Instance.EnqueueCallback(orderOrig);

                return(true);
            }
            catch (Exception ex)
            {
                logger.Error("_er_Update: Erro na atualizacao dos status da ordem: " + ex.Message, ex);
                return(false);
            }
        }
예제 #8
0
        public void ProcessOrderCancelReject(QuickFix.Message msg, string bolsa)
        {
            try
            {
                OrderCancelReject ocr = (OrderCancelReject)msg;
                // Buscar a ordem original a partir do OrigClOrdID
                string clordid = ocr.ClOrdID.getValue();
                int    account;
                if (bolsa.Equals(ExchangePrefixes.BOVESPA, StringComparison.InvariantCultureIgnoreCase))
                {
                    string acc = ocr.IsSetAccount()? ocr.Account.getValue(): string.Empty;
                    if (!string.IsNullOrEmpty(acc))
                    {
                        acc     = (acc.Remove(acc.Length - 1));
                        account = 0;
                    }
                    else
                    {
                        account = 0;
                    }
                }
                else
                {
                    account = ocr.IsSetAccount()? Convert.ToInt32(ocr.Account.getValue()): 0;
                }



                OrderDbInfo orderOrig = null;
                if (account != 0)
                {
                    orderOrig = _db.BuscarOrdem(clordid, account, ocr.Symbol.getValue());
                }
                else
                {
                    orderOrig = _db.BuscarOrdemPorClOrdEOrigClOrd(clordid, ocr.OrigClOrdID.getValue(), ocr.Symbol.getValue());
                }


                if (orderOrig.ClOrdID.Equals(string.Empty))
                {
                    logger.Info("Problema ao consultar informacoes da ordem original");
                    return;
                }

                // Preencher informacoes de tb_fix_order_detail (rejection)
                OrderDbDetalheInfo detail = new OrderDbDetalheInfo();
                detail.OrderID = orderOrig.OrderID;
                //detail.OrderQty = orderOrig.OrderQty;
                //detail.OrderQtyRemaining = orderOrig.OrderQtyRemaining;
                //detail.Price = orderOrig.Price;
                detail.OrderStatusID    = (int)FixOrderStatus.REJEITADA;
                detail.TransactTime     = ocr.IsSetField(Tags.TransactTime)? ocr.TransactTime.getValue(): DateTime.MinValue;
                detail.Description      = ocr.IsSetField(Tags.Text) ? ocr.Text.getValue() : string.Empty;
                detail.CxlRejResponseTo = ocr.IsSetField(Tags.CxlRejResponseTo) ? ocr.CxlRejResponseTo.getValue().ToString() : string.Empty;
                detail.CxlRejReason     = ocr.IsSetField(Tags.CxlRejReason)? ocr.CxlRejReason.getValue(): 0;
                detail.FixMsgSeqNum     = Convert.ToInt32(ocr.Header.GetField(Tags.MsgSeqNum));

                if (!_db.InserirOrdemDetalhe(detail, clordid))
                {
                    logger.Info("Problemas na inserção da ordem detalhe");
                    return;
                }
                // Buscar as informacoes da tabela update, utilizando o OrigClOrdID da ordem original
                OrderDbUpdateInfo orderUpdate = _db.BuscarOrdemUpdate(orderOrig.OrigClOrdID);

                // Atribuir as informacoes do update no order original
                orderOrig.ClOrdID      = orderUpdate.ClOrdID;
                orderOrig.OrdStatus    = orderUpdate.OrdStatusID;
                orderOrig.Price        = orderUpdate.Price;
                orderOrig.OrderQty     = orderUpdate.Quantidade;
                orderOrig.OrderQtyApar = orderUpdate.Quantidade_Aparente;
                orderOrig.OrderQtyMin  = orderUpdate.Quantidade_Minima;
                //orderOrig.OrderQtyRemaining = orderUpdate.Quantidade_Exec;
                orderOrig.ExpireDate  = orderUpdate.Dt_Validade;
                orderOrig.OrigClOrdID = string.Empty;
                orderOrig.MsgFix      = ocr.ToString().Replace('\x01', '|');
                // Atualizar as informacoes do update na tabela da ordem original
                if (!_db.AtualizarOrdem(orderOrig))
                {
                    logger.Info("Problemas na atualizacao da ordem (mensagem ordercancelreject). ClOrdID: " + orderOrig.ClOrdID);
                    return;
                }

                DropCopyCallbackManager.Instance.EnqueueCallback(orderOrig);
            }
            catch (Exception ex)
            {
                logger.Error("Problemas no processamento da mensagem OrderCancelReject: " + ex.Message, ex);
            }
        }
예제 #9
0
        public void ProcessNewOrderSingle(QuickFix.Message msg, string bolsa, int operador)
        {
            try
            {
                NewOrderSingle nos = (NewOrderSingle)msg;
                // OBS1: Campos nao atribuidos, nao vem na mensagem;
                // OBS2: Esta seguindo a ordem dos campos da tabela
                OrderDbInfo order = new OrderDbInfo();
                order.ClOrdID = nos.ClOrdID.getValue();
                if (bolsa.Equals(ExchangePrefixes.BOVESPA, StringComparison.InvariantCultureIgnoreCase))
                {
                    string acc = nos.Account.getValue();
                    order.Account = Convert.ToInt32(acc.Remove(acc.Length - 1));
                }
                else
                {
                    order.Account = Convert.ToInt32(nos.Account.getValue());
                }
                order.Symbol             = nos.Symbol.getValue();
                order.SecurityExchangeID = nos.IsSetField(Tags.SecurityID)? nos.SecurityID.getValue(): string.Empty; //Para BMF
                order.OrdTypeID          = Conversions.Parse2FixOrderType(nos.OrdType.getValue());
                order.OrdStatus          = (int)FixOrderStatus.NOVA_ORDEM_SOLICITADA;                                // (nova ordem)
                order.TransactTime       = nos.TransactTime.getValue();
                if (nos.IsSetField(Tags.ExpireDate))
                {
                    order.ExpireDate = DateTime.ParseExact(nos.ExpireDate.getValue() + "235959", "yyyyMMddHHmmss", CultureInfo.InvariantCulture);
                }
                else
                {
                    order.ExpireDate = DateTime.MinValue;
                }
                order.TimeInForce = nos.IsSetField(Tags.TimeInForce) ? nos.TimeInForce.getValue().ToString() : "0";
                order.ChannelID   = operador;
                int len = nos.NoPartyIDs.getValue();
                for (int i = 0; i < len; i++)
                {
                    Group grp = nos.GetGroup(i + 1, Tags.NoPartyIDs);
                    if (null != grp)
                    {
                        string enteringTrader = grp.GetField(Tags.PartyRole);
                        if (enteringTrader.Equals(PartyRole.ENTERING_TRADER.ToString()))
                        {
                            order.ExecBroker = grp.GetField(Tags.PartyID);
                            break;
                        }
                    }
                }
                order.Side              = Convert.ToInt32(nos.Side.getValue().ToString());
                order.OrderQty          = Convert.ToInt32(nos.OrderQty.getValue());
                order.OrderQtyRemaining = order.OrderQty; // (new order, entao nada foi executado)
                order.OrderQtyMin       = nos.IsSetField(Tags.MinQty) ? nos.MinQty.getValue() : Decimal.Zero;
                order.OrderQtyApar      = nos.IsSetField(Tags.MaxFloor) ? nos.MaxFloor.getValue() : Decimal.Zero;
                order.Price             = nos.IsSetField(Tags.Price) ? nos.Price.getValue() : Decimal.Zero;
                order.SystemID          = "FixServer";
                order.Memo              = nos.IsSetField(Tags.Memo) ? nos.GetField(Tags.Memo): string.Empty;
                order.FixMsgSeqNum      = Convert.ToInt32(nos.Header.GetField(Tags.MsgSeqNum));
                order.SessionID         = nos.GetSessionID(msg).ToString();
                order.SessionIDOriginal = nos.GetString(CustomTags.ORIG_SESSION);
                order.IdFix             = nos.GetInt(CustomTags.FIXID);
                order.MsgFix            = nos.ToString().Replace('\x01', '|');
                // Para order_detail
                order.Description = DescMsg.NOS_OPEN;
                order.HandlInst   = nos.IsSetField(Tags.HandlInst) ? nos.GetField(Tags.HandlInst) : string.Empty;
                if (!_db.InserirOrdem(order))
                {
                    logger.Info("Problemas na insercao da ordem. ClOrdId: " + order.ClOrdID);
                }

                DropCopyCallbackManager.Instance.EnqueueCallback(order);
            }
            catch (Exception ex)
            {
                logger.Error("Problemas no processamento da mensagem NewOrderSingle: " + ex.Message, ex);
            }
        }
예제 #10
0
        public void ProcessOrderCancelReplaceRequest(QuickFix.Message msg, string bolsa)
        {
            try
            {
                OrderCancelReplaceRequest ocrr = (OrderCancelReplaceRequest)msg;
                string origclordid             = ocrr.OrigClOrdID.getValue();
                int    account;
                if (bolsa.Equals(ExchangePrefixes.BOVESPA, StringComparison.InvariantCultureIgnoreCase))
                {
                    string acc = ocrr.Account.getValue();
                    acc     = (acc.Remove(acc.Length - 1));
                    account = Convert.ToInt32(acc);
                }
                else
                {
                    account = Convert.ToInt32(ocrr.Account.getValue());
                }
                // Buscar ordem original
                OrderDbInfo orderOrig = _db.BuscarOrdem(origclordid, account, ocrr.Symbol.getValue());
                // Adicionar as informacoes da ordem original na tabela de upodate
                if (orderOrig.OrderID == 0)
                {
                    logger.Info("OCRR - Nao achou a ordem em questao!!!: " + origclordid);
                    return;
                }
                // Adicionar informacoes originais na tabela update
                OrderDbUpdateInfo updt = new OrderDbUpdateInfo();
                updt.Account             = orderOrig.Account;
                updt.Instrumento         = orderOrig.Symbol;
                updt.OrderID             = orderOrig.OrderID;
                updt.ClOrdID             = orderOrig.ClOrdID;
                updt.OrdStatusID         = orderOrig.OrdStatus;
                updt.Price               = orderOrig.Price;
                updt.Quantidade          = orderOrig.OrderQty;
                updt.Quantidade_Exec     = orderOrig.CumQty;
                updt.Quantidade_Aparente = Convert.ToInt32(orderOrig.OrderQtyApar);
                updt.Quantidade_Minima   = Convert.ToInt32(orderOrig.OrderQtyMin);
                updt.Dt_Validade         = orderOrig.ExpireDate;
                updt.Dt_Atualizacao      = orderOrig.TransactTime;
                updt.TimeInForce         = orderOrig.TimeInForce;
                if (!_db.InserirOrdermUpdate(updt))
                {
                    logger.Error("Erro ao inserir o registro na tabela tb_fix_order_update");
                    return;
                }

                // Adicionar as novas informacoes pertinentes na tabela detail
                OrderDbDetalheInfo detail = new OrderDbDetalheInfo();
                detail.OrderID       = orderOrig.OrderID;
                detail.TransactID    = "";
                detail.OrderQty      = Convert.ToInt32(ocrr.OrderQty.getValue());
                detail.Price         = ocrr.IsSetField(Tags.Price)? ocrr.Price.getValue(): Decimal.Zero;
                detail.OrderStatusID = (int)FixOrderStatus.SUBSTITUICAO_SOLICITADA;
                detail.TransactTime  = ocrr.TransactTime.getValue();
                detail.Description   = DescMsg.OCRR_PENDING_MODIFICATION;
                detail.FixMsgSeqNum  = Convert.ToInt32(ocrr.Header.GetField(Tags.MsgSeqNum));
                if (!_db.InserirOrdemDetalhe(detail, orderOrig.ClOrdID))
                {
                    logger.Error("Erro ao inserir o registro na tabela tb_fix_order_update - msg de modificacao");
                    return;
                }

                // Atualizar a informacao original na tabela tb_fix_order
                // Atualiza os campos gravados na tabela tb_fix_order_update
                // Ordem original já se encontra em orderOrig
                orderOrig.OrigClOrdID  = ocrr.OrigClOrdID.getValue();
                orderOrig.ClOrdID      = ocrr.ClOrdID.getValue();
                orderOrig.OrdStatus    = (int)FixOrderStatus.SUBSTITUICAO_SOLICITADA;
                orderOrig.TransactTime = ocrr.TransactTime.getValue();
                if (ocrr.IsSetField(Tags.ExpireDate))
                {
                    orderOrig.ExpireDate = DateTime.ParseExact(ocrr.ExpireDate.getValue() + "235959", "yyyyMMddHHmmss", CultureInfo.InvariantCulture);
                }
                else
                {
                    orderOrig.ExpireDate = DateTime.MinValue;
                }
                orderOrig.TimeInForce  = ocrr.IsSetField(Tags.TimeInForce) ? ocrr.TimeInForce.getValue().ToString() : "0";
                orderOrig.OrderQty     = Convert.ToInt32(ocrr.OrderQty.getValue());
                orderOrig.OrderQtyMin  = ocrr.IsSetField(Tags.MinQty) ? ocrr.MinQty.getValue() : 0;
                orderOrig.OrderQtyApar = ocrr.IsSetField(Tags.MaxFloor) ? ocrr.MaxFloor.getValue() : 0;
                orderOrig.Price        = ocrr.IsSetField(Tags.Price)? ocrr.Price.getValue(): Decimal.Zero;
                orderOrig.Memo         = ocrr.IsSetField(Tags.Memo) ? ocrr.GetField(Tags.Memo): string.Empty;
                orderOrig.FixMsgSeqNum = Convert.ToInt32(ocrr.Header.GetField(Tags.MsgSeqNum));
                orderOrig.MsgFix       = ocrr.ToString().Replace('\x01', '|');
                orderOrig.HandlInst    = ocrr.IsSetField(Tags.HandlInst) ? ocrr.HandlInst.getValue().ToString() : string.Empty;
                if (!_db.AtualizarOrdem(orderOrig))
                {
                    logger.Info("Problemas na atualizacao da ordem (mensagem de modificacao). ClOrdID: " + orderOrig.ClOrdID);
                    return;
                }

                DropCopyCallbackManager.Instance.EnqueueCallback(orderOrig);
            }
            catch (Exception ex)
            {
                logger.Error("Problemas no processamento da mensagem OrderCancelReplaceRequest: " + ex.Message, ex);
            }
        }
예제 #11
0
        // 1: return by chave
        // 2: return by chaveExchNumber
        public int GetOrder(string chave, out TOOrderSession to, string chaveExchNumber = "", int keyType = 1, string exchange = "")
        {
            try
            {
                //TOOrderSession ord = null;
                lock (_dicMsgsCl)
                {
                    if (_dicMsgsCl.TryGetValue(chave, out to))
                    {
                        return(FindType.CLORDID);
                    }
                    else
                    {
                        //if (string.IsNullOrEmpty(chaveExchNumber))
                        //    return FindType.CLORDID;

                        {
                            //KeyValuePair<string, TOOrderSession> item = new KeyValuePair<string, TOOrderSession>();
                            List <TOOrderSession> lst = _dicMsgsCl.Select(x => x.Value).Where(x => x.ExchangeNumberID == chaveExchNumber).ToList();

                            TOOrderSession item = null;
                            if (KeyType.CLORDID == keyType)
                            {
                                item = lst.OrderByDescending(x => x.ExchangeSeqNum).FirstOrDefault();
                            }
                            else
                            {
                                item = lst.OrderByDescending(x => x.ExchangeSeqNum).LastOrDefault();
                            }

                            to = item;
                            if (null != to)
                            {
                                return(FindType.EXCHANGE_NUMBER);
                            }
                            // Nao achou a ordem. Tentará busca a partir do banco de dados. //TODO[FF]: Fazer a busca e remontar o TO com as informacoes existentes
                            else
                            {
                                string[] arr = chave.Split('-');
                                string   clord;
                                string   strAcc = string.Empty;
                                int      account;
                                string   symbol;
                                if (arr.Length != 3)
                                {
                                    return(FindType.UNDEFINED);
                                }
                                clord = arr[0];
                                if (exchange.Equals(ExchangePrefixes.BOVESPA, StringComparison.InvariantCultureIgnoreCase))
                                {
                                    strAcc = arr[1].Substring(0, arr[1].Length - 1);
                                }
                                else
                                {
                                    strAcc = arr[1];
                                }
                                account = Convert.ToInt32(strAcc);
                                symbol  = arr[2];
                                DbFix       db     = new DbFix();
                                OrderDbInfo retOrd = db.BuscarOrdem(clord, account, symbol);
                                if (0 == retOrd.OrderID)
                                {
                                    to = null;
                                    return(FindType.UNDEFINED);
                                }
                                else
                                {
                                    TOOrderSession toAux = this.OrderDbInfo2OrderSession(retOrd, chave);
                                    to = toAux;
                                    return(FindType.DB);
                                }
                            }
                        }
                    }
                }
                to = null;
                return(FindType.UNDEFINED);
            }
            catch (Exception ex)
            {
                logger.Error("Erro ao buscar o TOOrderSession: " + ex.Message, ex);
                to = null;
                return(FindType.UNDEFINED);
            }
        }
예제 #12
0
        private TOOrderSession OrderDbInfo2OrderSession(OrderDbInfo ord, string chave)
        {
            try
            {
                TOOrderSession ret = new TOOrderSession();
                string         ss  = ord.SessionIDOriginal;
                string []      aux = ss.Split(new string[] { ":", "/", "->" }, StringSplitOptions.RemoveEmptyEntries);

                string beginstr;
                string sender;
                string sendersub = string.Empty;
                string target;
                string targetsub = string.Empty;
                // Se tiver '/', existe sender sub e targetsub
                bool isSub = false;
                if (ss.IndexOf("/") > 0)
                {
                    beginstr  = aux[0];
                    sender    = aux[1];
                    sendersub = aux[2];
                    target    = aux[3];
                    targetsub = aux[4];
                    isSub     = true;
                }
                else
                {
                    beginstr = aux[0];
                    sender   = aux[1];
                    target   = aux[2];
                }
                if (isSub)
                {
                    ret.Sessao = new QuickFix.SessionID(beginstr, sender, sendersub, target, targetsub);
                }
                else
                {
                    ret.Sessao = new QuickFix.SessionID(beginstr, sender, target);
                }
                ret.TipoExpiracao    = ord.TimeInForce;
                ret.DataExpiracao    = ord.ExpireDate == DateTime.MinValue? "" : ord.ExpireDate.ToString("yyyyMMdd");
                ret.DataEnvio        = ord.RegisterTime.ToString("yyyyMMdd-HH:mm:ss.fff");
                ret.MsgSeqNum        = ord.FixMsgSeqNum;
                ret.OrigClOrdID      = ord.OrigClOrdID;
                ret.ClOrdID          = ord.ClOrdID;
                ret.Account          = ord.Account;
                ret.ExchangeNumberID = ord.ExchangeNumberID;
                ret.ExchangeSeqNum   = 1;
                ret.ChaveDicionario  = chave;

                // Remontar a mensagem fix
                string msg = ord.MsgFix.Replace('|', '\x01');

                ret.MensagemQF = new QuickFix.Message(msg, this.Dict, true);
                // Remontar party id a partir da mensagem fix
                int lenPID = ret.MensagemQF.IsSetField(Tags.NoPartyIDs) ? ret.MensagemQF.GetInt(Tags.NoPartyIDs) : 0;
                for (int x = 1; x <= lenPID; x += 1)
                {
                    Group noPartyIds = new Group(ret.MensagemQF.GetGroup(x, Tags.NoPartyIDs));
                    ret.PartyIDs.Add(noPartyIds);
                }
                return(ret);
            }
            catch (Exception ex)
            {
                logger.Error("OrderDbInfo2OrderSession(): " + ex.Message, ex);
                return(null);
            }
        }
예제 #13
0
        public bool InserirOrdem(OrderDbInfo order)
        {
            try
            {
                AbrirConexao(_strConnectionStringDefault);
                _sqlCommand             = new SqlCommand("prc_fix_inserir_ordem", _sqlConn);
                _sqlCommand.CommandType = System.Data.CommandType.StoredProcedure;
                _sqlCommand.Parameters.Add(new SqlParameter("@OrderID", order.OrderID));
                _sqlCommand.Parameters.Add(new SqlParameter("@ClOrdID", order.ClOrdID));
                _sqlCommand.Parameters.Add(new SqlParameter("@StopStartID", order.StopStartID));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrigClOrdID", order.OrigClOrdID));
                _sqlCommand.Parameters.Add(new SqlParameter("@ExchangeNumberID", order.ExchangeNumberID));
                _sqlCommand.Parameters.Add(new SqlParameter("@Account", order.Account));
                _sqlCommand.Parameters.Add(new SqlParameter("@Symbol", order.Symbol));
                _sqlCommand.Parameters.Add(new SqlParameter("@SecurityExchangeID", order.SecurityExchangeID));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrdTypeID", order.OrdTypeID));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrdStatusID", order.OrdStatus));
                _sqlCommand.Parameters.Add(new SqlParameter("@TransactTime", order.TransactTime));
                if (DateTime.MinValue != order.ExpireDate)
                {
                    _sqlCommand.Parameters.Add(new SqlParameter("@ExpireDate", order.ExpireDate));
                }
                else
                {
                    _sqlCommand.Parameters.Add(new SqlParameter("@ExpireDate", DBNull.Value));
                }
                _sqlCommand.Parameters.Add(new SqlParameter("@TimeInForce", order.TimeInForce));
                _sqlCommand.Parameters.Add(new SqlParameter("@ChannelID", order.ChannelID));
                _sqlCommand.Parameters.Add(new SqlParameter("@ExecBroker", order.ExecBroker));
                _sqlCommand.Parameters.Add(new SqlParameter("@Side", order.Side));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrderQty", order.OrderQty));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrderQtyMin", order.OrderQtyMin));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrderQtyApar", order.OrderQtyApar));
                _sqlCommand.Parameters.Add(new SqlParameter("@OrderQtyRemaining", order.OrderQtyRemaining));
                _sqlCommand.Parameters.Add(new SqlParameter("@Price", order.Price));
                _sqlCommand.Parameters.Add(new SqlParameter("@CumQty", order.CumQty));
                _sqlCommand.Parameters.Add(new SqlParameter("@description", order.Description));
                _sqlCommand.Parameters.Add(new SqlParameter("@FixMsgSeqNum", order.FixMsgSeqNum));
                _sqlCommand.Parameters.Add(new SqlParameter("@systemID", order.SystemID));
                _sqlCommand.Parameters.Add(new SqlParameter("@Memo", order.Memo));
                _sqlCommand.Parameters.Add(new SqlParameter("@SessionID", order.SessionID));
                _sqlCommand.Parameters.Add(new SqlParameter("@OriginalSessionID", order.SessionIDOriginal));
                _sqlCommand.Parameters.Add(new SqlParameter("@IdFix", order.IdFix));
                _sqlCommand.Parameters.Add(new SqlParameter("@MsgFix", order.MsgFix));

                if (!string.IsNullOrEmpty(order.HandlInst))
                {
                    _sqlCommand.Parameters.Add(new SqlParameter("@HandlInst", order.HandlInst));
                }

                int rows = _sqlCommand.ExecuteNonQuery();
                FecharConexao();
                return(true);
            }
            catch (Exception ex)
            {
                _dbArq.InserirOrdem(order);
                FecharConexao();
                logger.Error("InserirOrdem(): " + ex.Message, ex);
                return(false);
            }
        }