public MsgEventHandler(MainForm mainForm) { this.mainForm = mainForm; taskOption = new ParallelOptions(); taskOption.MaxDegreeOfParallelism = Environment.ProcessorCount; STRUCT_0374 init1 = new STRUCT_0374(); STRUCT_0374_REPLY init2 = new STRUCT_0374_REPLY(); STRUCT_0393 init3 = new STRUCT_0393(); STRUCT_0393_CANCEL init4 = new STRUCT_0393_CANCEL(); STRUCT_0419 init5 = new STRUCT_0419(); }
public void listener(string socketID, TCPListenerSet listenerSet) { TcpClient client = null; StreamReader sr; string getData = ""; string header = ""; try { listenerSet.listener.Start(); while (true) { socketLogger.Info(string.Format("socket id {0} listen... socket {1}", socketID, listenerSet.listener.LocalEndpoint)); client = listenerSet.listener.AcceptTcpClient(); socketLogger.Info(string.Format("socket id {0} accept socket {1}", socketID, client.Client.RemoteEndPoint)); listenerSet.ns = client.GetStream(); sr = new StreamReader(client.GetStream()); while (client.Connected) { int size = 0; if (socketID.Equals("OMS")) { size = listenerSet.ns.Read(listenerSet.readBuffer, 0, listenerSet.readBuffer.Length); getData = System.Text.Encoding.ASCII.GetString(listenerSet.readBuffer); } else { getData = sr.ReadLine(); } if (getData != null) { header = getData.Substring(0, 4); //lock (MainForm.lockObj) { switch (header) { case "0374": if (socketID.Equals("OMS")) { STRUCT_0374_REPLY msg_oms = new STRUCT_0374_REPLY(socketID, getData); Task FilledThread = new Task(() => msgHandler.FilledMessageProc(msg_oms)); Task positionCalcThread = new Task(() => msgHandler.PositionCalcFilled(msg_oms)); FilledThread.Start(); positionCalcThread.Start(); } else { STRUCT_0374 msg_ticket = new STRUCT_0374(socketID, getData); Task CancelCheckThread = new Task(() => msgHandler.CancelCheck(msg_ticket)); Task positionCalcThread = new Task(() => msgHandler.PositionCalcTicket(msg_ticket)); CancelCheckThread.Start(); positionCalcThread.Start(); } break; case "0393": messageQueue_0393.Enqueue(new STRUCT_0393(socketID, getData)); break; case "0419": STRUCT_0419 msg_confirm = new STRUCT_0419(socketID, getData); Task ConfirmThread = new Task(() => msgHandler.ReceiveConfirm(msg_confirm)); ConfirmThread.Start(); break; default: break; } } } else { if (listenerSet.ns != null) { listenerSet.ns.Close(); } if (client != null) { client.Close(); } if (client.GetStream() != null) { client.GetStream().Close(); } } } } } catch (Exception error) { logger.Error(error.ToString()); } finally { if (listenerSet.ns != null) { listenerSet.ns.Close(); } if (client.Connected == true) { if (client?.GetStream() != null) { client.GetStream().Close(); } } if (client != null) { client.Close(); } } }
public void ReceiveConfirm(STRUCT_0419 message) { string OrgOrderNumber = message.ORIGINAL_ORDER_IDENTIFICATION; string OrderNumber = message.ORDER_IDENTIFICATION; int cancelQty = Int32.Parse(message.REAL_MODIFY_OR_CANCEL_ORDER_QUANTITY); int orderQty = Int32.Parse(message.ORDER_QUANTITY); int rejectQty = orderQty - cancelQty; IEnumerable <신규주문> query = System.Linq.Enumerable.Where <신규주문>(신규주문테이블, n => n.주문번호 == OrgOrderNumber); IEnumerable <취소주문> query2 = System.Linq.Enumerable.Where <취소주문>(취소주문테이블, n => n.주문번호 == OrderNumber); int ticketSeq = 0; if (query2.Any <취소주문>()) { foreach (취소주문 find in query2) { lock (MainForm.lockObj) { find.취소거부 = rejectQty; find.취소확인 = cancelQty; ticketSeq = find.시퀀스1; } } } if (message.ORDER_REJECTED_REASON_CODE.Equals("0803") || message.ORDER_REJECTED_REASON_CODE.Equals("0804")) { if (query.Any <신규주문>()) { STRUCT_0393 order = null; foreach (신규주문 find in query) { find.취소확인 = 0; if (find.매매구분.Equals("1")) { //매수 주문하기 order = new STRUCT_0393(find.토픽, ticketSeq, find.종목, MainForm.orderNumber.ToString("0000000000"), "0000000000", "2", OrderParam.NewOrder, rejectQty.ToString("0000000000"), find.가격); } else { //매도 주문하기 order = new STRUCT_0393(find.토픽, ticketSeq, find.종목, MainForm.orderNumber.ToString("0000000000"), "0000000000", "1", OrderParam.NewOrder, rejectQty.ToString("0000000000"), find.가격); } } if (order != null) { Task NewOrderThread = new Task(() => this.NewOrder(order)); NewOrderThread.Start(); } } } else { if (query.Any <신규주문>()) { STRUCT_0393 order = null; foreach (신규주문 find in query) { find.취소확인 = find.취소확인 + cancelQty; if (cancelQty < orderQty) { if (find.매매구분.Equals("1")) { //매수 주문하기 order = new STRUCT_0393(find.토픽, find.시퀀스1, find.종목, MainForm.orderNumber.ToString("0000000000"), "0000000000", "2", OrderParam.NewOrder, rejectQty.ToString("0000000000"), find.가격); } else { //매도 주문하기 order = new STRUCT_0393(find.토픽, find.시퀀스1, find.종목, MainForm.orderNumber.ToString("0000000000"), "0000000000", "1", OrderParam.NewOrder, rejectQty.ToString("0000000000"), find.가격); } } else { logger.Equals("NEVER canceled qty bigger then cancel qty"); } } if (order != null && cancelQty != orderQty) // 실제 취소된 수량과 취소요청 수량이 같을 경우 전량 취소 성공이라 주문을 안낸다 { Task NewOrderThread = new Task(() => this.NewOrder(order)); NewOrderThread.Start(); } } } GETDATA(); }