Example #1
0
        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();
        }
Example #2
0
        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();
                }
            }
        }
Example #3
0
        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();
        }