public virtual void EnqueueCotacao(CotacaoInfo cotacao) { try { queueCotacaoInbound.Enqueue(cotacao); } catch (Exception ex) { logger.Error("EnqueueCotacao():" + ex.Message, ex); } }
/// <summary> /// /// </summary> /// <param name="instrumento"></param> /// <param name="topbPrice"></param> /// <param name="qtde"></param> public virtual void Calculate(CotacaoInfo info) { if (dctInstrumentos1.ContainsKey(info.Instrumento)) { HashSet <string> algos = null; if (dctInstrumentos1.TryGetValue(info.Instrumento, out algos)) { foreach (string algoID in algos) { AlgoStruct registro; bool bFound = false; lock (dctRegistros) { registro = dctRegistros[algoID]; bFound = true; } if (bFound) { registro = DoAlgoritmo(registro, info); qStreamerOutbound.Enqueue(registro); } } } } if (dctInstrumentos2.ContainsKey(info.Instrumento)) { HashSet <string> algos = null; if (dctInstrumentos2.TryGetValue(info.Instrumento, out algos)) { foreach (string algoID in algos) { AlgoStruct registro; bool bFound = false; lock (dctRegistros) { registro = dctRegistros[algoID]; bFound = true; } if (bFound) { registro = DoAlgoritmo(registro, info); qStreamerOutbound.Enqueue(registro); } } } } }
/// <summary> /// /// </summary> /// <param name="cotacao"></param> private void enqueueToThreads(CotacaoInfo cotacao) { foreach (ThreadWorkerBase worker in poolThreadDiferencial) { worker.EnqueueCotacao(cotacao); } foreach (ThreadWorkerBase worker in poolThreadSpread) { worker.EnqueueCotacao(cotacao); } foreach (ThreadWorkerBase worker in poolThreadFinanceiro) { worker.EnqueueCotacao(cotacao); } }
private void MessageBroker(string Instrumento, string Mensagem) { try { int headerLen = Marshal.SizeOf(new Header_MDS()); int agregadoLen = Marshal.SizeOf(new MSG_LivroOfertaAgregado_MDS()); logger.Debug("[" + Instrumento + "] [" + Mensagem + "]"); switch (Mensagem.ToString().Substring(0, 2)) { case ConstantesMDS.Negocio: break; case ConstantesMDS.LivroOferta: break; case ConstantesMDS.Destaques: break; case ConstantesMDS.RankCorretora: break; case ConstantesMDS.Sonda: logger.Info("Recebeu Sonda: [" + Mensagem + "]"); break; case ConstantesMDS.LIVRO_AGREGADO: Header_MDS headerMds = Utilities.MarshalFromStringBlock <Header_MDS>(Mensagem.Substring(0, headerLen)); MSG_LivroOfertaAgregado_MDS agregadoCompra = Utilities.MarshalFromStringBlock <MSG_LivroOfertaAgregado_MDS>(Mensagem.Substring(headerLen, agregadoLen)); int qtdeEntradas = (Mensagem.Length - headerLen) / agregadoLen; int indexVenda = headerLen + (qtdeEntradas / 2 * agregadoLen); MSG_LivroOfertaAgregado_MDS agregadoVenda = Utilities.MarshalFromStringBlock <MSG_LivroOfertaAgregado_MDS>(Mensagem.Substring(indexVenda, agregadoLen)); CotacaoInfo cotacao = new CotacaoInfo(); cotacao.Instrumento = headerMds.Instrumento.ByteArrayToString(); cotacao.QuantidadeBid = Convert.ToInt64(agregadoCompra.Quantidade.ByteArrayToString()); cotacao.TopbPriceBid = agregadoCompra.Preco.ByteArrayToDecimal(3); cotacao.QuantidadeAsk = Convert.ToInt64(agregadoVenda.Quantidade.ByteArrayToString()); cotacao.TopbPriceAsk = agregadoVenda.Preco.ByteArrayToDecimal(3); logger.DebugFormat("{0} BidQty={1} BidPrice={2} AskQty={3} Ask=Price={4}", cotacao.Instrumento, cotacao.QuantidadeBid, cotacao.TopbPriceBid, cotacao.QuantidadeAsk, cotacao.TopbPriceAsk); enqueueToThreads(cotacao); break; } } catch (Exception ex) { logger.Error("MessageBroker(): " + ex.Message, ex); if (!String.IsNullOrEmpty(Instrumento)) { logger.Error("Instrumento [" + Instrumento + "]"); } if (!String.IsNullOrEmpty(Mensagem)) { logger.Error("Mensagem [" + Mensagem + "]"); } } }
public abstract AlgoStruct DoAlgoritmo(AlgoStruct algo, CotacaoInfo cotacao);