Exemplo n.º 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();
        }
Exemplo n.º 2
0
        public void insertLogicTable(STRUCT_0374 message)
        {
            DataTable dt  = mainForm.dataTableMap["로직테이블"];
            DataRow   row = dt.NewRow();

            row[0] = message.seq;
            row[1] = message.topic;
            row[2] = message.formatDateTime;
            row[3] = message.TRADING_PRICE;
            row[4] = message.TRADING_VOLUMN;
            row[5] = message.POSITION;
            row[6] = message.netfillCashByPointValue_commision;
            row[7] = "";
            dt.Rows.Add(row);
        }
Exemplo n.º 3
0
        public void NewOrder(STRUCT_0374 message, int orderQty)
        {
            STRUCT_0393 order = new STRUCT_0393(message.topic, message.seq, message.ISSUE_CODE, MainForm.orderNumber.ToString("0000000000"), "0000000000", message.ASK_BID_TYPE_CODE,
                                                OrderParam.NewOrder, orderQty.ToString("0000000000"), message.TRADING_PRICE);

            StreamWriter sw = SocketManager.getInstance().clientSocketMap[SocketManager.iptable["SOCKET3"]].sw;

            if (sw != null)
            {
                sw.WriteLine(order.toKRXFORMAT());
                sw.Flush();
                insert신규주문(order);
                GETDATA();
            }
            orderLogger.Info(string.Format("NewOrder     : {0}", JsonConvert.SerializeObject(order)));
        }
Exemplo n.º 4
0
        public void insertClientTable(STRUCT_0374 message)
        {
            DataTable dt  = mainForm.dataTableMap["클라이언트"];
            DataRow   row = dt.NewRow();

            row[0] = message.seq;
            row[1] = message.topic;
            row[2] = message.formatDateTime;
            row[3] = message.ORDER_IDENTIFICATION;
            row[4] = message.ISSUE_CODE;
            row[5] = message.ASK_BID_TYPE_CODE;
            row[6] = message.TRADING_PRICE;
            row[7] = message.TRADING_VOLUMN;
            row[8] = message.formatLocalTime;
            dt.Rows.Add(row);
        }
Exemplo n.º 5
0
        public void insert로직(STRUCT_0374 message)
        {
            로직 data = new 로직();

            data.시퀀스  = message.seq;
            data.토픽   = message.topic;
            data.시간   = message.formatDateTime;
            data.매수매도 = message.ASK_BID_TYPE_CODE;
            data.가격   = message.TRADING_PRICE;
            data.수량   = Int32.Parse(message.TRADING_VOLUMN);
            data.포지션  = Int32.Parse(message.POSITION);
            data.순손익  = Double.Parse(message.netfillCashByPointValue_commision);
            lock (MainForm.lockObj)
            {
                로직테이블.Add(data);
            }
        }
Exemplo n.º 6
0
        public void insert클라이언트(STRUCT_0374 message)
        {
            클라이언트 data = new 클라이언트();

            data.시퀀스  = message.seq;
            data.토픽   = message.topic;
            data.시간   = message.formatDateTime;
            data.주문번호 = message.ORDER_IDENTIFICATION;
            data.종목   = message.ISSUE_CODE;
            data.매매구분 = message.ASK_BID_TYPE_CODE;
            data.가격   = message.TRADING_PRICE;
            data.체결   = Int32.Parse(message.TRADING_VOLUMN);
            data.시간1  = message.formatLocalTime;
            lock (MainForm.lockObj)
            {
                클라이언트테이블.Add(data);
            }
        }
Exemplo n.º 7
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();
                }
            }
        }
Exemplo n.º 8
0
        public void PositionCalcTicket(STRUCT_0374 data)
        {
            double askFillCash     = 0;
            double avgAskFillPrice = 0;
            int    askQty          = 0;

            double bidFillCash     = 0;
            double avgBidFillPrice = 0;
            int    bidQty          = 0;
            int    netQty          = 0;

            double fillCash                          = 0;
            double netfillCash                       = 0;
            string dateTime                          = "";
            double netfillCashByPointValue           = 0;
            double netfillCashByPointValue_commision = 0;
            double totalCommision                    = 0;
            double openProfit                        = 0;

            if (calcMap.ContainsKey(data.topic))
            {
                Dictionary <string, string> subCalcMap = calcMap[data.topic];
                double filledPrice = double.Parse(data.TRADING_PRICE);
                int    filledCount = int.Parse(data.TRADING_VOLUMN);
                int    side        = int.Parse(data.ASK_BID_TYPE_CODE);
                dateTime = data.dateTime.ToString("HH:mm:ss.fff");
                string topic = data.topic;

                askFillCash                       = Double.Parse(subCalcMap["askFillCash"]);
                bidFillCash                       = Double.Parse(subCalcMap["bidFillCash"]);
                avgAskFillPrice                   = Double.Parse(subCalcMap["avgAskFillPrice"]);
                avgBidFillPrice                   = Double.Parse(subCalcMap["avgBidFillPrice"]);
                askQty                            = Int32.Parse(subCalcMap["askQty"]);
                bidQty                            = Int32.Parse(subCalcMap["bidQty"]);
                netQty                            = Int32.Parse(subCalcMap["netQty"]);
                fillCash                          = Double.Parse(subCalcMap["fillCash"]);
                netfillCash                       = Double.Parse(subCalcMap["netfillCash"]);
                totalCommision                    = Double.Parse(subCalcMap["totalCommision"]);
                netfillCashByPointValue           = Double.Parse(subCalcMap["netfillCashByPointValue"]);
                netfillCashByPointValue_commision = Double.Parse(subCalcMap["netfillCashByPointValue_commision"]);

                if ((SIDE)side == SIDE.ASK)
                {
                    askFillCash    += filledPrice * filledCount;
                    askQty         += filledCount;
                    fillCash       += filledPrice * filledCount;
                    avgAskFillPrice = askFillCash / askQty;
                }
                else
                {
                    bidFillCash    += filledPrice * filledCount;
                    bidQty         += filledCount;
                    fillCash       -= filledPrice * filledCount;
                    avgBidFillPrice = bidFillCash / bidQty;
                }

                netQty = bidQty - askQty;
                if (netQty > 0)
                {
                    netfillCash = netQty * avgBidFillPrice + fillCash;
                    openProfit  = netQty * (filledPrice - avgBidFillPrice);
                }
                else if (netQty < 0)
                {
                    netfillCash = netQty * avgAskFillPrice + fillCash;
                    openProfit  = netQty * (avgAskFillPrice - filledPrice);
                }
                else
                {
                    netfillCash = fillCash;
                }
                totalCommision                   += commission * filledCount;
                netfillCashByPointValue           = netfillCash * pointValue + openProfit;
                netfillCashByPointValue_commision = netfillCash * pointValue - totalCommision + openProfit;

                subCalcMap.Clear();
                subCalcMap.Add("topic", data.topic.ToString());
                subCalcMap.Add("dateTime", dateTime.ToString());
                subCalcMap.Add("askFillCash", askFillCash.ToString());
                subCalcMap.Add("bidFillCash", bidFillCash.ToString());
                subCalcMap.Add("avgAskFillPrice", avgAskFillPrice.ToString());
                subCalcMap.Add("avgBidFillPrice", avgBidFillPrice.ToString());
                subCalcMap.Add("askQty", askQty.ToString());
                subCalcMap.Add("bidQty", bidQty.ToString());
                subCalcMap.Add("netQty", netQty.ToString());
                subCalcMap.Add("fillCash", fillCash.ToString());
                subCalcMap.Add("netfillCash", netfillCash.ToString());
                subCalcMap.Add("netfillCashByPointValue", netfillCashByPointValue.ToString());
                subCalcMap.Add("netfillCashByPointValue_commision", netfillCashByPointValue_commision.ToString());
                subCalcMap.Add("totalCommision", totalCommision.ToString());

                if (netQty > 0)
                {
                    data.POSITION = "+" + netQty.ToString();
                }
                else
                {
                    data.POSITION = netQty.ToString();
                }
                data.netPROFIT = netfillCashByPointValue_commision.ToString();
                data.netfillCashByPointValue_commision = netfillCashByPointValue_commision.ToString();
            }
            else
            {
                Dictionary <string, string> subCalcMap = new Dictionary <string, string>();
                double filledPrice = double.Parse(data.TRADING_PRICE);
                int    filledCount = int.Parse(data.TRADING_VOLUMN);
                int    side        = int.Parse(data.ASK_BID_TYPE_CODE);
                string topic       = data.topic;
                if ((SIDE)side == SIDE.ASK)
                {
                    askFillCash    += filledPrice * filledCount;
                    askQty         += filledCount;
                    fillCash       += filledPrice * filledCount;
                    avgAskFillPrice = askFillCash / askQty;
                }
                else
                {
                    bidFillCash    += filledPrice * filledCount;
                    bidQty         += filledCount;
                    fillCash       -= filledPrice * filledCount;
                    avgBidFillPrice = bidFillCash / bidQty;
                }
                netQty = bidQty - askQty;
                if (netQty > 0)
                {
                    netfillCash = netQty * avgBidFillPrice + fillCash;
                }
                else if (netQty < 0)
                {
                    netfillCash = netQty * avgAskFillPrice + fillCash;
                }
                else
                {
                    netfillCash = fillCash;
                }

                totalCommision += commission * filledCount;

                netfillCashByPointValue           = netfillCash * pointValue + openProfit;
                netfillCashByPointValue_commision = netfillCash * pointValue - totalCommision + openProfit;

                subCalcMap.Add("topic", data.topic.ToString());
                subCalcMap.Add("dateTime", dateTime.ToString());
                subCalcMap.Add("askFillCash", askFillCash.ToString());
                subCalcMap.Add("bidFillCash", bidFillCash.ToString());
                subCalcMap.Add("avgAskFillPrice", avgAskFillPrice.ToString());
                subCalcMap.Add("avgBidFillPrice", avgBidFillPrice.ToString());
                subCalcMap.Add("askQty", askQty.ToString());
                subCalcMap.Add("bidQty", bidQty.ToString());
                subCalcMap.Add("netQty", netQty.ToString());
                subCalcMap.Add("fillCash", fillCash.ToString());
                subCalcMap.Add("netfillCash", netfillCash.ToString());
                subCalcMap.Add("netfillCashByPointValue", netfillCashByPointValue.ToString());
                subCalcMap.Add("netfillCashByPointValue_commision", netfillCashByPointValue_commision.ToString());
                subCalcMap.Add("totalCommision", totalCommision.ToString());

                calcMap.Add(data.topic, subCalcMap);
                if (netQty > 0)
                {
                    data.POSITION = "+" + netQty.ToString();
                }
                else
                {
                    data.POSITION = netQty.ToString();
                }
                data.netPROFIT = netfillCashByPointValue_commision.ToString();
                data.netfillCashByPointValue_commision = netfillCashByPointValue_commision.ToString();
            }
            insert로직(data);
            insert클라이언트(data);
            GETDATA();
        }
Exemplo n.º 9
0
        public void CancelCheck(STRUCT_0374 message)
        {
            int         ticketOrderQty = Int32.Parse(message.TRADING_VOLUMN);
            List <신규주문> query          = null;

            if (message.ASK_BID_TYPE_CODE.Equals("1"))
            {
                query = 신규주문테이블.Where(n => n.수량 > n.체결 + n.취소요청 && n.매매구분 == "2" /*&& n.취소요청 == 0*/).ToList <신규주문>();
            }
            else
            {
                query = 신규주문테이블.Where(n => n.수량 > n.체결 + n.취소요청 && n.매매구분 == "1" /* && n.취소요청 == 0*/).ToList <신규주문>();
            }

            if (query.Any <신규주문>())
            {
                foreach (신규주문 find in query)
                {
                    int remainQty = find.수량 - find.체결 - find.취소요청;
                    if (remainQty > 0)
                    {
                        if (ticketOrderQty >= remainQty)
                        {
                            //전량취소
                            STRUCT_0393_CANCEL order = new STRUCT_0393_CANCEL(find.토픽, message.seq, find.종목,
                                                                              MainForm.orderNumber.ToString("0000000000"), find.주문번호, find.매매구분, OrderParam.CancelOrder,
                                                                              remainQty.ToString("0000000000"), find.가격);
                            lock (MainForm.lockObj)
                            {
                                find.취소요청 += remainQty;
                            }
                            Task CancelOrderThread = new Task(() => this.CancelOrder(order));
                            CancelOrderThread.Start();
                            ticketOrderQty -= remainQty;
                        }
                        else if (ticketOrderQty < remainQty)
                        {
                            if (ticketOrderQty > 0)
                            {
                                //부분취소
                                STRUCT_0393_CANCEL order = new STRUCT_0393_CANCEL(find.토픽, message.seq, find.종목,
                                                                                  MainForm.orderNumber.ToString("0000000000"), find.주문번호, find.매매구분, OrderParam.CancelOrder,
                                                                                  ticketOrderQty.ToString("0000000000"), find.가격);
                                lock (MainForm.lockObj)
                                {
                                    find.취소요청 += ticketOrderQty;
                                }
                                Task CancelOrderThread = new Task(() => this.CancelOrder(order));
                                CancelOrderThread.Start();
                                ticketOrderQty = 0;
                            }
                            break;
                        }
                    }
                    else
                    {
                        logger.Error(string.Format("never remainQty < 0 : {0}", message.ORDER_IDENTIFICATION));
                    }
                }
            }

            if (ticketOrderQty > 0)
            {
                Task NewOrderThread = new Task(() => this.NewOrder(message, ticketOrderQty), TaskCreationOptions.PreferFairness);
                NewOrderThread.Start();
            }
        }