private void kiwoomApi_OnReceiveRealCondition(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveRealConditionEvent e) { // 실시간 조건검색 요청으로 종목 편입 확인 (type - I : 종목편입, D : 종목이탈) if (e.strType.Equals("I")) { Console.WriteLine("조건검색 실시간 편입 [" + e.sTrCode + "]"); ConditionStock conditionStock = conditionStocks.SingleOrDefault(item => item.StockNo.Equals(e.sTrCode)); if (conditionStock != null) { conditionStock.Status = "편입"; conditionStock.upTransferCnt(); } else { conditionStocks.Add(new ConditionStock(e.sTrCode, kiwoomApi.GetMasterCodeName(e.sTrCode))); requestRealtimeQuote(SCREEN_NO_CONDITION, e.sTrCode, conditionStocks.Count > 0 ? REALTIME_ADD : REALTIME_NEW); } // 실시간으로 여러 종목을 가져올 경우는 없는가? 확인이 필요할듯.. } else if (e.strType.Equals("D")) { Console.WriteLine("조건검색 실시간 이탈 [" + e.sTrCode + "]"); ConditionStock conditionStock = conditionStocks.SingleOrDefault(item => item.StockNo.Equals(e.sTrCode)); if (conditionStock != null) { conditionStock.Status = "이탈"; //removeRealtimeQuote(SCREEN_NO_CONDITION, e.sTrCode); } } }
private void OnReceiveRealDataEventHandler(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveRealDataEvent e) { //Console.WriteLine("[DEBUG] OnReceiveRealData - e.sRealKey : " + e.sRealKey + ", e.sRealType : " + e.sRealType + ", e.sRealData : " + e.sRealData); // 보유 종목에 있을 경우 값 업데이트 string market = openApi.GetCommRealData(e.sRealKey, 290).Trim(); if (market.Equals("2")) // 장 중 { Holding holding = holdings.SingleOrDefault(item => item.StockNo.Contains(e.sRealKey)); if (holding != null) { long currentPrice = long.Parse(Regex.Replace(openApi.GetCommRealData(e.sRealKey, 10).Trim(), @"[^0-9]", "")); holding.CurrentPrice = String.Format("{0:#,###0}", currentPrice); } ConditionStock conditionStock = conditionStocks.SingleOrDefault(item => item.StockNo.Contains(e.sRealKey)); if (conditionStock != null) { long currentPrice = long.Parse(Regex.Replace(openApi.GetCommRealData(e.sRealKey, 10).Trim(), @"[^0-9]", "")); conditionStock.CurrentPrice = String.Format("{0:#,###0}", currentPrice); float fluctuationRate = float.Parse(openApi.GetCommRealData(e.sRealKey, 12).Trim()); conditionStock.FluctuationRate = String.Format("{0:f2}", fluctuationRate); // 주문 목록에 없고, 보유종목에 없으면 매수 // 주문이 들어가기 전에 한번 더 요청이 오면? 안되겠군.. // 조건 검색에 편입되는 순간 확인하고..큐에 넣고 큐를 뒤져야하나? // 편입, 이탈이 반복되는 경우는 어떻게 하지? if (holding != null) { } } } }
private void kiwoomApi_OnReceiveRealData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveRealDataEvent e) { //Console.WriteLine("[DEBUG] OnReceiveRealData - e.sRealKey : " + e.sRealKey + ", e.sRealType : " + e.sRealType + ", e.sRealData : " + e.sRealData); // 보유 종목에 있을 경우 값 업데이트 string market = kiwoomApi.GetCommRealData(e.sRealKey, 290).Trim(); if (market.Equals("2")) { Holding holding = holdings.SingleOrDefault(item => item.StockNo.Contains(e.sRealKey)); if (holding != null) { long currentPrice = long.Parse(Regex.Replace(kiwoomApi.GetCommRealData(e.sRealKey, 10).Trim(), @"[^0-9]", "")); holding.CurrentPrice = String.Format("{0:#,###0}", currentPrice); if (float.Parse(holding.ProfitRate) < -1) { Console.WriteLine("손절 " + holding.StockName + " " + holding.ProfitRate); order(ORDER_TYPE_SELL, holding.StockNo, int.Parse(holding.Qty, System.Globalization.NumberStyles.AllowThousands), 0, ORDER_HOGA_MARKET); // 시장가 손절 } else if (float.Parse(holding.ProfitRate) > 1) { Console.WriteLine("익절 " + holding.StockName + " " + holding.ProfitRate); order(ORDER_TYPE_SELL, holding.StockNo, int.Parse(holding.Qty, System.Globalization.NumberStyles.AllowThousands), int.Parse(currentPrice.ToString()), ORDER_HOGA_LIIMIT); // 시장가 손절 } } ConditionStock conditionStock = conditionStocks.SingleOrDefault(item => item.StockNo.Contains(e.sRealKey)); if (conditionStock != null) { long currentPrice = long.Parse(Regex.Replace(kiwoomApi.GetCommRealData(e.sRealKey, 10).Trim(), @"[^0-9]", "")); conditionStock.CurrentPrice = String.Format("{0:#,###0}", currentPrice); if (string.IsNullOrEmpty(conditionStock.TransferPrice) || long.Parse(conditionStock.TransferPrice, System.Globalization.NumberStyles.AllowThousands) < 1) { conditionStock.TransferPrice = conditionStock.CurrentPrice; } float fluctuationRate = float.Parse(kiwoomApi.GetCommRealData(e.sRealKey, 12).Trim()); conditionStock.FluctuationRate = String.Format("{0:f2}", fluctuationRate); // 주문 목록에 없고, 보유종목에 없으면 매수 // 주문이 들어가기 전에 한번 더 요청이 오면? 안되겠군.. // 조건 검색에 편입되는 순간 확인하고..큐에 넣고 큐를 뒤져야하나? // 편입, 이탈이 반복되는 경우는 어떻게 하지? if (conditionStock.Status.Equals("편입") && !conditionStock.Ordered.Equals("주문") && long.Parse(conditionStock.TransferPrice, System.Globalization.NumberStyles.AllowThousands) < currentPrice) { conditionStock.Ordered = "주문"; order(ORDER_TYPE_BUY, conditionStock.StockNo, 1, int.Parse(currentPrice.ToString()), ORDER_HOGA_LIIMIT); } } } }