Exemple #1
0
        private ExecutarOrdemResponse EnviarOrdemRoteador(OrdemInfo OrdemInfo)
        {
            try
            {
                // Instancia servico de ordens
                logger.Info("Invoca servico de roteamento de ordens");
                IRoteadorOrdens ServicoRoteador = Ativador.Get <IRoteadorOrdens>();

                OrdemInfo.TransactTime = DateTime.Now;

                // Envia a ordem para o reteador e aguarda o retorno
                logger.Info("Envia a ordem para o roteador");
                ExecutarOrdemResponse RespostaOrdem =
                    ServicoRoteador.ExecutarOrdem(new RoteadorOrdens.Lib.Mensagens.ExecutarOrdemRequest()
                {
                    info = OrdemInfo
                });

                return(RespostaOrdem);
            }
            catch (Exception ex)
            {
                logger.Info("Ocorreu um erro ao enviar a ordem para o roteador");
                logger.Info("Descrição     :" + ex.Message);

                throw (ex);
            }
        }
Exemple #2
0
        /// <summary>
        /// Envia um pedido de execucao de ordem para o canal correspondente
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ExecutarOrdemResponse ExecutarOrdem(ExecutarOrdemRequest request)
        {
            ExecutarOrdemResponse response = new ExecutarOrdemResponse();
            CanalInfo             _canal   = null;
            StatusRoteamentoEnum  status   = StatusRoteamentoEnum.Sucesso;
            string msg = "Ordem Enviada";

            logger.Debug("*** ExecutarOrdem()");

            TradutorFix.DumpOrdemInfo(request.info);

            try
            {
                _canal = (CanalInfo)_canais[request.info.Exchange + request.info.ChannelID];

                if (_canal == null)
                {
                    msg    = "Nao ha canal configurado para " + request.info.Exchange + "-" + request.info.ChannelID;
                    status = StatusRoteamentoEnum.Erro;
                    logger.Info(msg);
                    response.DadosRetorno = RoteadorOrdensUtil.FormatarRespostaEO(msg, status);
                }
                else
                {
                    if (_canal.roteador == null || _canal.Conectado == false)
                    {
                        status = StatusRoteamentoEnum.Erro;
                        msg    = "Nao ha canal ativo e conectado para " + request.info.Exchange + "-" + request.info.ChannelID;
                        logger.Info(msg);
                        response.DadosRetorno = RoteadorOrdensUtil.FormatarRespostaEO(msg, status);
                    }
                    else
                    {
                        _criaReportStore(request.info.ClOrdID);

                        _notificaEnvioParaCanal(request.info);

                        response = _canal.roteador.ExecutarOrdem(request);
                    }
                }
            }
            catch (Exception ex)
            {
                msg    = "Error ExecutarOrdem(): " + ex.Message;
                status = StatusRoteamentoEnum.Erro;
                logger.Error(msg + "-" + ex.StackTrace);
                response.DadosRetorno = RoteadorOrdensUtil.FormatarRespostaEO(msg, status);

                if (_canal != null)
                {
                    _resetCanal(_canal);
                }
            }

            logger.Debug("*** End of ExecutarOrdem()");

            return(response);
        }
        private OrdemInfo enviarNovaOrdem(ParametroTesteConfig parametro, string ativo, OrdemDirecaoEnum sentido)
        {
            OrdemInfo ordem = new OrdemInfo();

            ordem.ClOrdID      = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "-" + ativo + parametro.Porta + parametro.Account;
            ordem.Account      = Convert.ToInt32(parametro.Account);
            ordem.OrdType      = OrdemTipoEnum.Limitada;
            ordem.TimeInForce  = OrdemValidadeEnum.ValidaParaODia;
            ordem.Symbol       = ativo;
            ordem.SecurityID   = ativo;
            ordem.Price        = obterPrecoOrdem(ativo);
            ordem.Exchange     = parametro.Bolsa;
            ordem.ChannelID    = Convert.ToInt32(parametro.Porta);
            ordem.Side         = sentido;
            ordem.OrdStatus    = OrdemStatusEnum.ENVIADAPARAOROTEADORDEORDENS;
            ordem.OrderQty     = parametro.Qtde;
            ordem.RegisterTime = DateTime.Now;

            if (String.IsNullOrEmpty(parametro.EnteringTrader))
            {
                ordem.ExecBroker = "227";
            }
            else
            {
                ordem.ExecBroker = parametro.EnteringTrader;
            }

            lock (dctOrdens)
            {
                dctOrdens.Add(ordem.ClOrdID, ordem);
            }

            ExecutarOrdemRequest request = new ExecutarOrdemRequest();

            request.info = ordem;

            IRoteadorOrdens       roteador = Ativador.Get <IRoteadorOrdens>();
            ExecutarOrdemResponse response = roteador.ExecutarOrdem(request);

            if (response.DadosRetorno.StatusResposta != StatusRoteamentoEnum.Sucesso)
            {
                logger.Error("Erro ao enviar ordem [" + ordem.ClOrdID + "]");
                foreach (OcorrenciaRoteamentoOrdem ocorr in response.DadosRetorno.Ocorrencias)
                {
                    logger.Error("Erro: " + ocorr.Ocorrencia);
                }
            }

            return(ordem);
        }
Exemple #4
0
 private void testeToolStripMenuItem_Click(object sender, EventArgs e)
 {
     IServicoOrdens        servicoOrdens = Ativador.Get <IServicoOrdens>();
     ExecutarOrdemResponse response      =
         servicoOrdens.ExecutarOrdem(
             new ExecutarOrdemRequest()
     {
         Account        = "1",
         ClOrdID        = "o1",
         CodigoBolsa    = "BOVESPA",
         CodigoCliente  = "123",
         DataReferencia = DateTime.Now,
         OrderQty       = 100,
         OrdType        = OrdemTipoEnum.Limitada,
         Price          = 85,
         Side           = OrdemDirecaoEnum.Compra,
         Symbol         = "USIM5",
         TimeInForce    = OrdemValidadeEnum.ValidaParaODia
     });
 }
Exemple #5
0
        private ValidacaoRiscoResponse VenderCarteiraRecomendada(ValidacaoRiscoRequest pParametros, string CodigoCarteiraRecomendada)
        {
            ValidacaoRiscoResponse     PipeLineResponse      = new ValidacaoRiscoResponse();
            List <PipeLineCriticaInfo> CriticaInfoCollection = new List <PipeLineCriticaInfo>();
            PipeLineCriticaInfo        CriticaInfo           = null;


            logger.Info("Inicia Rotina de validação de compra de ações, cliente: " + pParametros.EnviarOrdemRequest.OrdemInfo.Account.ToString());

            logger.Info("Caracteristicas da ordem");
            logger.Info("Cliente             :" + pParametros.EnviarOrdemRequest.OrdemInfo.Account.ToString());
            logger.Info("Operação            : Compra");
            logger.Info("Instrumento         :" + pParametros.EnviarOrdemRequest.OrdemInfo.Symbol);
            logger.Info("Quantidade          :" + pParametros.EnviarOrdemRequest.OrdemInfo.OrderQty.ToString());
            logger.Info("Preco               : ORDEM A MERCADO ");
            logger.Info("DtVencimento        :" + pParametros.EnviarOrdemRequest.OrdemInfo.ExpireDate.ToString());
            logger.Info("ClasseCliente       : Institucional");


            CadastroPapeisRequest _CadastroPapeisRequest = new CadastroPapeisRequest();

            _CadastroPapeisRequest.Instrumento = pParametros.EnviarOrdemRequest.OrdemInfo.Symbol;

            CadastroPapeisResponse <CadastroPapelInfo> CadastroPapeis = new PersistenciaCarteiraRecomendada().ObterInformacoesPapeis(_CadastroPapeisRequest);


            int FatorCotacao = int.Parse(CadastroPapeis.Objeto.FatorCotacao);

            // TRATAMENTO [ FRACIONARIO / INTEGRAL ]
            int LoteNegociacao       = int.Parse(CadastroPapeis.Objeto.LoteNegociacao);
            int ModuloLoteNegociacao = pParametros.EnviarOrdemRequest.OrdemInfo.OrderQty % LoteNegociacao;

            if (pParametros.EnviarOrdemRequest.OrdemInfo.OrderQty >= LoteNegociacao)
            {
                // ENVIAR INTEGRAL
                pParametros.EnviarOrdemRequest.OrdemInfo.OrderQty -= ModuloLoteNegociacao;
                logger.Info("Inicia operação de compra de: " + pParametros.EnviarOrdemRequest.OrdemInfo.Symbol + " no mercado Integral");

                // Inseri a Ordem solicitada no banco de dados
                if (InserirOrdemCliente(pParametros.EnviarOrdemRequest))
                {
                    //TODO: COMPRA O PAPEL COM O SERVICO DE ORDENS
                    logger.Info("Compra de: " + pParametros.EnviarOrdemRequest.OrdemInfo.Symbol + " no mercado integral efetuada com sucesso.");

                    logger.Info("Envia a ordem para o roteador de ordens");

                    pParametros.EnviarOrdemRequest.OrdemInfo.Account = RetornaCodigoCliente(227, pParametros.EnviarOrdemRequest.OrdemInfo.Account);

                    ExecutarOrdemResponse RespostaRoteador = this.EnviarOrdemRoteador(pParametros.EnviarOrdemRequest.OrdemInfo);

                    pParametros.EnviarOrdemRequest.OrdemInfo.Account = int.Parse(pParametros.EnviarOrdemRequest.OrdemInfo.Account.ToString().Remove(pParametros.EnviarOrdemRequest.OrdemInfo.Account.ToString().Length - 1, 1));

                    // VERIFICA SE A ORDEM FOI ENVIADA COM SUCESSO PARA O ROTEADOR
                    if (RespostaRoteador.DadosRetorno.StatusResposta == StatusRoteamentoEnum.Sucesso)
                    {
                        logger.Info("Ordem institucional enviada com sucesso para o Roteador de Ordens");

                        PipeLineResponse.DataResposta      = DateTime.Now;
                        PipeLineResponse.DescricaoResposta = RespostaRoteador.DadosRetorno.Ocorrencias[0].Ocorrencia;
                        PipeLineResponse.StatusResposta    = OMS.Risco.Lib.Enum.CriticaRiscoEnum.Sucesso;
                    }
                    else
                    {
                        logger.Info("Ocorreu um erro ao enviar a ordem para o roteador de Ordens");

                        CriticaInfo                 = new PipeLineCriticaInfo();
                        CriticaInfo.Critica         = RespostaRoteador.DadosRetorno.Ocorrencias[0].Ocorrencia;
                        CriticaInfo.CriticaTipo     = OMS.Ordens.Lib.Enum.CriticaRiscoEnum.ErroRoteadorOrdem;
                        CriticaInfo.DataHoraCritica = DateTime.Now;

                        // Adiciona as criticas no pipeline de risco.
                        CriticaInfoCollection.Add(CriticaInfo);
                    }
                }

                if (ModuloLoteNegociacao > 0)
                {
                    // ENVIAR FRACIONARIO
                    logger.Info("Calcula restante a ser enviado para o mercado fracionário");

                    // ENVIAR FRACIONARIO
                    pParametros.EnviarOrdemRequest.OrdemInfo.OrderQty = ModuloLoteNegociacao;
                    pParametros.EnviarOrdemRequest.OrdemInfo.Symbol  += "F";
                    pParametros.EnviarOrdemRequest.OrdemInfo.ClOrdID  = this.CtrlNumber(CodigoCarteiraRecomendada);

                    logger.Info("Inicia compra de: " + pParametros.EnviarOrdemRequest.OrdemInfo.Symbol + " no mercado fracionário");

                    // Inseri a Ordem solicitada no banco de dados
                    if (InserirOrdemCliente(pParametros.EnviarOrdemRequest))
                    {
                        //TODO: COMPRA O PAPEL COM O SERVICO DE ORDENS
                        logger.Info("Compra de: " + pParametros.EnviarOrdemRequest.OrdemInfo.Symbol + " no mercado fracionario efetuada com sucesso.");

                        logger.Info("Envia a ordem para o roteador de ordens");

                        pParametros.EnviarOrdemRequest.OrdemInfo.Account = RetornaCodigoCliente(227, pParametros.EnviarOrdemRequest.OrdemInfo.Account);

                        ExecutarOrdemResponse RespostaRoteador = this.EnviarOrdemRoteador(pParametros.EnviarOrdemRequest.OrdemInfo);

                        pParametros.EnviarOrdemRequest.OrdemInfo.Account = int.Parse(pParametros.EnviarOrdemRequest.OrdemInfo.Account.ToString().Remove(pParametros.EnviarOrdemRequest.OrdemInfo.Account.ToString().Length - 1, 1));

                        // VERIFICA SE A ORDEM FOI ENVIADA COM SUCESSO PARA O ROTEADOR
                        if (RespostaRoteador.DadosRetorno.StatusResposta == StatusRoteamentoEnum.Sucesso)
                        {
                            logger.Info("Ordem enviada com sucesso para o Roteador de Ordens");

                            PipeLineResponse.DataResposta      = DateTime.Now;
                            PipeLineResponse.DescricaoResposta = RespostaRoteador.DadosRetorno.Ocorrencias[0].Ocorrencia;
                            PipeLineResponse.StatusResposta    = OMS.Risco.Lib.Enum.CriticaRiscoEnum.Sucesso;
                        }
                        else
                        {
                            logger.Info("Ocorreu um erro ao enviar a ordem para o roteador de Ordens");

                            CriticaInfo                 = new PipeLineCriticaInfo();
                            CriticaInfo.Critica         = RespostaRoteador.DadosRetorno.Ocorrencias[0].Ocorrencia;
                            CriticaInfo.CriticaTipo     = OMS.Ordens.Lib.Enum.CriticaRiscoEnum.ErroRoteadorOrdem;
                            CriticaInfo.DataHoraCritica = DateTime.Now;

                            // Adiciona as criticas no pipeline de risco.
                            CriticaInfoCollection.Add(CriticaInfo);
                        }
                    }
                }
            }
            else
            {
                //FRACIONARIO
                pParametros.EnviarOrdemRequest.OrdemInfo.Symbol += "F";

                logger.Info("Inicia compra de: " + pParametros.EnviarOrdemRequest.OrdemInfo.Symbol + " no mercado fracionário");

                // Inseri a Ordem solicitada no banco de dados
                if (InserirOrdemCliente(pParametros.EnviarOrdemRequest))
                {
                    //TODO: COMPRA O PAPEL COM O SERVICO DE ORDENS
                    logger.Info("Compra de: " + pParametros.EnviarOrdemRequest.OrdemInfo.Symbol + " no mercado fracionário efetuada com sucesso.");

                    //ENVIA ORDEM PARA O ROTEADOR
                    pParametros.EnviarOrdemRequest.OrdemInfo.Account = RetornaCodigoCliente(227, pParametros.EnviarOrdemRequest.OrdemInfo.Account);

                    logger.Info("Envia a ordem para o roteador de ordens");


                    var RespostaRoteador = this.EnviarOrdemRoteador(pParametros.EnviarOrdemRequest.OrdemInfo);

                    pParametros.EnviarOrdemRequest.OrdemInfo.Account = int.Parse(pParametros.EnviarOrdemRequest.OrdemInfo.Account.ToString().Remove(pParametros.EnviarOrdemRequest.OrdemInfo.Account.ToString().Length - 1, 1));

                    //// VERIFICA SE A ORDEM FOI ENVIADA COM SUCESSO PARA O ROTEADOR
                    if (RespostaRoteador.DadosRetorno.StatusResposta == StatusRoteamentoEnum.Sucesso)
                    {
                        logger.Info("Ordem enviada com sucesso para o Roteador de Ordens");

                        PipeLineResponse.DataResposta      = DateTime.Now;
                        PipeLineResponse.DescricaoResposta = RespostaRoteador.DadosRetorno.Ocorrencias[0].Ocorrencia;
                        PipeLineResponse.StatusResposta    = OMS.Risco.Lib.Enum.CriticaRiscoEnum.Sucesso;
                    }
                    else
                    {
                        logger.Info("Ocorreu um erro ao enviar a ordem para o roteador de Ordens");

                        CriticaInfo                 = new PipeLineCriticaInfo();
                        CriticaInfo.Critica         = RespostaRoteador.DadosRetorno.Ocorrencias[0].Ocorrencia;
                        CriticaInfo.CriticaTipo     = OMS.Ordens.Lib.Enum.CriticaRiscoEnum.ErroRoteadorOrdem;
                        CriticaInfo.DataHoraCritica = DateTime.Now;

                        // Adiciona as criticas no pipeline de risco.
                        CriticaInfoCollection.Add(CriticaInfo);
                    }
                }
            }

            return(PipeLineResponse);
        }
Exemple #6
0
        private void enviar_ordem(long last)
        {
            try
            {
                OrdemInfo ordem = new OrdemInfo();

                ordem.ClOrdID   = last.ToString();
                ordem.Account   = Convert.ToInt32(txtCodCliente.Text);
                ordem.ChannelID = Convert.ToInt32(txtOperador.Text);

                if (cmbBolsa.SelectedItem.Equals("BOVESPA"))
                {
                    ordem.Exchange = "BOVESPA";
                }
                else
                {
                    ordem.Exchange = "BMF";
                }

                //ordem.ExchangeNumberID = txtExchangeNumber.Text;
                ordem.Price        = Convert.ToDouble(txtPreco.Text);
                ordem.OrderQty     = Convert.ToInt32(txtQtde.Text);
                ordem.MinQty       = Convert.ToInt32(txtQtdeMin.Text);
                ordem.MaxFloor     = Convert.ToInt32(txtQtdeAparente.Text);
                ordem.Symbol       = txtPapel.Text;
                ordem.SecurityID   = txtSecurityId.Text;
                ordem.RegisterTime = DateTime.Now;
                ordem.TransactTime = DateTime.Now;
                ordem.ExecBroker   = txtTraderID.Text;


                if (rdCompra.Checked)
                {
                    ordem.Side = OrdemDirecaoEnum.Compra;
                }
                else
                {
                    ordem.Side = OrdemDirecaoEnum.Venda;
                }


                switch (cmbOrderType.SelectedIndex)
                {
                case 0: ordem.OrdType = OrdemTipoEnum.Limitada; break;

                case 1: ordem.OrdType = OrdemTipoEnum.StopLimitada; break;

                case 2: ordem.OrdType = OrdemTipoEnum.MarketWithLeftOverLimit; break;

                case 3: ordem.OrdType = OrdemTipoEnum.OnClose; break;

                case 4: ordem.OrdType = OrdemTipoEnum.StopStart; break;

                case 5: ordem.OrdType = OrdemTipoEnum.Mercado; break;

                case 6: ordem.OrdType = OrdemTipoEnum.StopLoss; break;

                default:
                    ordem.OrdType = OrdemTipoEnum.OnClose; break;
                }


                switch (cmbTipoValidade.SelectedIndex)
                {
                case 0:
                    ordem.TimeInForce = OrdemValidadeEnum.ValidaParaODia;
                    ordem.ExpireDate  = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59);
                    break;

                case 1: ordem.TimeInForce = OrdemValidadeEnum.ExecutaIntegralParcialOuCancela; break;

                case 2: ordem.TimeInForce = OrdemValidadeEnum.ExecutaIntegralOuCancela; break;

                case 3: ordem.TimeInForce = OrdemValidadeEnum.ValidaAteSerCancelada; break;

                case 4:
                    ordem.TimeInForce = OrdemValidadeEnum.ValidoAteDeterminadaData;

                    ordem.ExpireDate = DateTime.ParseExact(txtDataValidade.Text + " 23:59:59", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
                    break;

                default:
                    ordem.TimeInForce = OrdemValidadeEnum.ValidaParaAberturaDoMercado;
                    break;
                }


                if (_roteador != null)
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(
                                                     delegate(object required)
                    {
                        ExecutarOrdemRequest request = new ExecutarOrdemRequest();

                        request.info = ordem;

                        ExecutarOrdemResponse resp = _roteador.ExecutarOrdem(request);

                        if (resp.DadosRetorno != null)
                        {
                            string msg = "";

                            foreach (OcorrenciaRoteamentoOrdem ocorr in resp.DadosRetorno.Ocorrencias)
                            {
                                msg += ocorr.Ocorrencia + "\r\n";
                            }
                            _addMsg(msg);
                        }
                    }));
                }
            }
            catch (Exception ex)
            {
                _addMsg(ex.Message);
                logger.Error("Erro: " + ex.Message, ex);
            }
        }
Exemple #7
0
        /// <summary>
        /// Envio de nova ordem
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btEnviarOrdem_Click(object sender, EventArgs e)
        {
            try
            {
                OrdemInfo ordem = new OrdemInfo();

                ordem.ClOrdID   = txtClOrdID.Text;
                ordem.Account   = Convert.ToInt32(txtCodCliente.Text);
                ordem.ChannelID = Convert.ToInt32(txtOperador.Text);

                if (cmbBolsa.SelectedItem.Equals("BOVESPA"))
                {
                    ordem.Exchange = "BOVESPA";
                }
                else
                {
                    ordem.Exchange = "BMF";
                }

                ordem.ExchangeNumberID = txtExchangeNumber.Text;
                ordem.Price            = Convert.ToDouble(txtPreco.Text);
                ordem.OrderQty         = Convert.ToInt32(txtQtde.Text);
                ordem.MinQty           = Convert.ToInt32(txtQtdeMin.Text);
                ordem.MaxFloor         = Convert.ToInt32(txtQtdeAparente.Text);
                ordem.Symbol           = txtPapel.Text;
                ordem.SecurityID       = txtSecurityId.Text;
                ordem.RegisterTime     = DateTime.Now;
                ordem.TransactTime     = DateTime.Now;
                ordem.ExecBroker       = txtTraderID.Text;
                ordem.Memo5149         = "Nova " + DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss.fff");

                if (txtSenderLocation.Text.Length > 0)
                {
                    ordem.SenderLocation = txtSenderLocation.Text;
                }

                if (chkAccountType.Checked)
                {
                    ordem.AcountType = ContaTipoEnum.GIVE_UP_LINK_IDENTIFIER;
                }

                if (rdCompra.Checked)
                {
                    ordem.Side = OrdemDirecaoEnum.Compra;
                }
                else
                {
                    ordem.Side = OrdemDirecaoEnum.Venda;
                }

                if (txtStopPX.Text.Length > 0 && Convert.ToDouble(txtStopPX.Text) > 0)
                {
                    ordem.StopPrice = Convert.ToDouble(txtStopPX.Text);
                }

                if (txtInvestorID.Text.Length > 0)
                {
                    ordem.InvestorID = txtInvestorID.Text;
                }

                if (txtExecTrader.Text.Length > 0)
                {
                    ordem.ExecutingTrader = txtExecTrader.Text;
                }

                switch (cmbOrderType.SelectedIndex)
                {
                case 0: ordem.OrdType = OrdemTipoEnum.Limitada; break;

                case 1: ordem.OrdType = OrdemTipoEnum.StopLimitada; break;

                case 2: ordem.OrdType = OrdemTipoEnum.MarketWithLeftOverLimit; break;

                case 3: ordem.OrdType = OrdemTipoEnum.OnClose; break;

                case 4: ordem.OrdType = OrdemTipoEnum.StopStart; break;

                case 5: ordem.OrdType = OrdemTipoEnum.Mercado; break;

                case 6: ordem.OrdType = OrdemTipoEnum.StopLoss; break;

                default:
                    ordem.OrdType = OrdemTipoEnum.OnClose; break;
                }

                //0- Para o dia");
                //1- Executa ou cancela");
                //2- Tudo ou Nada");
                //3- Ate cancelar");
                //4- Data especifica");
                //5- Abertura Mercado");
                //6- Fechamento Mercado");
                //7- Boa para Leilao");
                switch (cmbTipoValidade.SelectedIndex)
                {
                case 0:
                    ordem.TimeInForce = OrdemValidadeEnum.ValidaParaODia;
                    ordem.ExpireDate  = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59);
                    break;

                case 1: ordem.TimeInForce = OrdemValidadeEnum.ExecutaIntegralParcialOuCancela; break;

                case 2: ordem.TimeInForce = OrdemValidadeEnum.ExecutaIntegralOuCancela; break;

                case 3: ordem.TimeInForce = OrdemValidadeEnum.ValidaAteSerCancelada; break;

                case 4:
                    ordem.TimeInForce = OrdemValidadeEnum.ValidoAteDeterminadaData;

                    ordem.ExpireDate = DateTime.ParseExact(txtDataValidade.Text + " 23:59:59", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
                    break;

                case 5: ordem.TimeInForce = OrdemValidadeEnum.ValidaParaAberturaDoMercado; break;

                case 6: ordem.TimeInForce = OrdemValidadeEnum.FechamentoDoMercado; break;

                case 7: ordem.TimeInForce = OrdemValidadeEnum.BoaParaLeilao; break;

                default:
                    MessageBox.Show("Time in force invalido");
                    break;
                }

                IRoteadorOrdens roteador = Ativador.Get <IRoteadorOrdens>();

                if (roteador != null)
                {
                    ExecutarOrdemRequest request = new ExecutarOrdemRequest();

                    request.info = ordem;

                    ExecutarOrdemResponse resp = roteador.ExecutarOrdem(request);

                    if (resp.DadosRetorno != null)
                    {
                        string msg = "";

                        foreach (OcorrenciaRoteamentoOrdem ocorr in resp.DadosRetorno.Ocorrencias)
                        {
                            msg += ocorr.Ocorrencia + "\r\n";
                        }

                        if (resp.DadosRetorno.StatusResposta == StatusRoteamentoEnum.Erro)
                        {
                            MessageBox.Show(msg);
                        }
                        else
                        {
                            _addMsg(msg);

                            lock (ofertasenviadas)
                            {
                                ofertasenviadas.Add(ordem);

                                SerializadorOfertas.SaveOfertas(ofertasenviadas);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace);
                logger.Error("Erro: " + ex.Message, ex);
            }

            lastCLOrdID++;
            txtClOrdID.Text = lastCLOrdID.ToString();
        }