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); } }
/// <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); }
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 }); }
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); }
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); } }
/// <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(); }