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 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); }
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))); }
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); }
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); } }
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); } }
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 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(); }
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(); } }