/// <summary> /// Manipulacao do dicionario em situacoes /// (Mensagens de Order Cancel Reject - OCR) /// </summary> /// <param name="ss"></param> /// <param name="dic"></param> /// <param name="strChave"></param> //public void VerifyOrderSituationOCR(SessionID ss, Dictionary<string, TOOrderSession> dic, string strChave) // OBS :strChave sempre ClOrdID até momento public void VerifyOrderSituationOCR(OrderCancelReject msg, SessionID ss, OrderSessionManager dic, string strChave, string strChaveExch) { try { if (null != ss) // Registry found { TOOrderSession aux = null; dic.GetOrder(strChave, out aux); if (null != aux && msg.IsSetField(Tags.OrderID) && msg.OrderID.getValue() != "NONE") { if (msg.IsSetField(Tags.Account)) { aux.ExchangeNumberID = msg.OrderID.getValue() + "-" + msg.Account.getValue() + "-" + msg.Symbol.getValue(); } } // Se houve rejeicao de cancelamento, entao somente excluir do dicionario lock (dic) { TOOrderSession toOS = null; int ret = dic.GetOrder(strChave, out toOS, strChaveExch); if (null != toOS) { if (ret == FindType.EXCHANGE_NUMBER) { dic.RemoveOrder(toOS.ChaveDicionario); } else { dic.RemoveOrder(strChave); } } toOS = null; } } } catch (Exception ex) { logger.Error("VerifyOrderSituationOCR(): " + ex.Message, ex); } }
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); } }