public string GetCurrentStock(String 종목코드 = "035420") { //035420 <--네이버종목번호\ this.axKHOpenAPI.SetInputValue("종목코드", 종목코드); int nRet = axKHOpenAPI.CommRqData("주식기본정보", "OPT10001", 0, ScreenNumber.getClass1Instance().GetEosScrNum()); return("sdfsdf:"); }
/// <summary> /// [5]설명 주식 주문을 서버로 전송한다. ///입력값 ///sRQName - 사용자 구분 요청 명 ///sScreenNo - 화면번호[4] ///sAccNo - 계좌번호[10] ///nOrderType - 주문유형(1:신규매수, 2:신규매도, 3:매수취소, 4:매도취소, 5:매수정정, 6:매도정정) ///sCode, - 주식종목코드 ///nQty – 주문수량 ///nPrice – 주문단가 ///sHogaGb - 거래구분 ///sOrgOrderNo – 원주문번호 ///반환값 에러코드[4.에러코드표 참고] ///비고 ///sHogaGb – 00:지정가, 03:시장가, 05:조건부지정가, 06:최유리지정가, 07:최우선지정가, 10: ///지정가IOC, 13:시장가IOC, 16:최유리IOC, 20:지정가FOK, 23:시장가FOK, 26:최유리FOK, 61:시간외단일가매매, 81:시간외종가 ///ex) ///지정가 매수 - openApi.SendOrder(“RQ_1”, “0101”, “5015123410”, 1, “000660”, 10, 48500,“0”, “”); ///시장가 매수 - openApi.SendOrder(“RQ_1”, “0101”, “5015123410”, 1, “000660”, 10, 0, “3”,“”); ///매수 정정 - openApi.SendOrder(“RQ_1”,“0101”, “5015123410”, 5, “000660”, 10, 49500,“0”, “1”); ///매수 취소 - openApi.SendOrder(“RQ_1”, “0101”, “5015123410”, 3, “000660”, 10, “0”, “2”); /// </summary> /// public int SendOrder(String rq_name, String acct_num, int order_type, String stock_cd, int qty, int amt, String hoga_gubun, String orgn_order_no) { String sScreenNo = ScreenNumber.getClass1Instance().GetAnyTimeScrNum(); int ret = axKHOpenAPI.SendOrder(rq_name, sScreenNo, acct_num, order_type, stock_cd, qty, amt, hoga_gubun, orgn_order_no); FileLog.PrintF("SendOrder(" + rq_name + "," + sScreenNo + "," + acct_num + "," + order_type + "," + stock_cd + "," + qty + "," + amt + "," + hoga_gubun + "," + orgn_order_no + "):" + ret); return(ret); }
/// <summary> ///[102] 설명 추정자산조회요청 ///입력값 ///accountNum : 계좌번호10자리 ///password : 계좌비밀번호 4 자리모의투자는 0000 ////반환값 /// 성공유무 데이터는 onReceived쪽에서 soap로 쏴줌 /// </summary> public String GetOpw00003(String accountNum, String password) { String sRQName = "추정자산조회요청WCF"; String sTrCode = "OPW00003"; FileLog.PrintF("WCF GetOpt00003 accountNum=" + accountNum); FileLog.PrintF("WCF GetOpt00003 password="******"sRQName:{0}|sTrCode:{1}|sScreenNo:{2}"; String keyStockCode = String.Format(keyStockCodeLayout , sRQName , sTrCode , sScrNo ); String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|accountNum:{3}"; String key = String.Format(keyLayout , sRQName , sTrCode , sScrNo , accountNum ); spellOpw00003.sScreenNo = sScrNo; FileLog.PrintF("keyStockCode ==" + keyStockCode); AppLib.getClass1Instance().AddSpellDictionary(key, spellOpw00003); AppLib.getClass1Instance().AddStockCodeDictionary(keyStockCode, accountNum); //QUEUE를 따지 않고 바로 실행되어야 한다. ReceiveTrDataFactory rtf = ReceiveTrDataFactory.getClass1Instance(); ReceiveTrData rt = rtf.getReceiveTrData(spellOpw00003.sTrCode); int nRet = rt.Run(axKHOpenAPI, spellOpw00003); spellOpw00003.startRunTime = DateTime.Now; if (Error.IsError(nRet)) { return("[WCF GetOpw00003][OK]:" + Error.GetErrorMessage()); } else { return("[WCF GetOpw00003][NOK]:" + Error.GetErrorMessage()); } }
public override void ReceivedData(AxKHOpenAPILib.AxKHOpenAPI axKHOpenAPI, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e) { FileLog.PrintF("ReceivedData OPW00003"); try { StringBuilder sbAll = new StringBuilder(); StringBuilder sb = new StringBuilder(); String 조회일자 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); /*추정예탁자산*/ sb.Append("{0}|{1}|{2}"); String tmp = sb.ToString(); String 계좌번호 = "XXXXXXXXXX"; //int nCnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName); String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}"; String keyStockCode = String.Format(keyStockCodeLayout , e.sRQName , e.sTrCode , e.sScrNo ); 계좌번호 = AppLib.getClass1Instance().getStockCode(keyStockCode); String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|accountNum:{3}"; String key = String.Format(keyLayout , e.sRQName , e.sTrCode , e.sScrNo , 계좌번호 ); // int nCnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName); 이거 무조건 0이다. String 추정예탁자산 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, 0, "추정예탁자산").Trim();//[0] String tmp1 = String.Format(tmp , 조회일자 , 계좌번호 , 추정예탁자산 ); sbAll.AppendLine(tmp1); String ret = sbAll.ToString(); FileLog.PrintF("ReceivedData OPW00003 ret=>" + ret); ScreenNumber.getClass1Instance().DisconnectRealData(e.sScrNo); //this.SetRealRemove(axKHOpenAPI, "ALL", "ALL"); AppLib.getClass1Instance().removeStockCodeDictionary(keyStockCode); AppLib.getClass1Instance().removeSpellDictionary(key); Send(key, ret, "OPW00003"); } catch (Exception ex) { FileLog.PrintF("[ALERT-ReceivedData-OPW00003]Exception ex=" + ex.Message); } }
public override void ReceivedData(AxKHOpenAPILib.AxKHOpenAPI axKHOpenAPI, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e) { FileLog.PrintF("ReceivedData OPT10059"); try { /* * sScrNo – 화면번호 * sRQName – 사용자구분 명 * sTrCode – Tran 명 * sRecordName – Record 명 * sPreNext – 연속조회 유무 */ StringBuilder sbAll = new StringBuilder(); StringBuilder sb = new StringBuilder(); //sb.Append("일자:{0}|종목코드:{1}|현재가:{2}|거래량:{3}|거래대금:{4}|시가:{5}|고가:{6}|저가:{7}"); //sb.Append("stock_date:{0}|current_price:{1}|current_price:{2}|trade_quantity:{3}|trade_price:{4}|start_price:{5}|high_price:{6}|low_price:{7}"); /*일자 ,현재가,대비기호,전일대비,등락율,누적거래대금,개인투자자,외국인투자자,기관계,금융투자,보험,투신,기타금융,은행,연기금등,사모펀드,국가,기타법인,내외국인,종목코드,매매구분,금액수량구분*/ sb.Append("{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}|{8}|{9}|{10}|{11}|{12}|{13}|{14}|{15}|{16}|{17}|{18}|{19}|{20}|{21}"); String tmp = sb.ToString(); String 종목코드 = "XXXX"; int nCnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName); String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}"; String keyStockCode = String.Format(keyStockCodeLayout , e.sRQName , e.sTrCode , e.sScrNo ); 종목코드 = AppLib.getClass1Instance().getStockCode(keyStockCode); String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}"; String key = String.Format(keyLayout , e.sRQName , e.sTrCode , e.sScrNo , 종목코드 ); spell = AppLib.getClass1Instance().getSpell(key); String startDate = spell.startDate; String lastStockDate = ""; int startDate일자 = 0; if (!int.TryParse(startDate, out startDate일자)) { startDate일자 = 0; } if (nCnt > 0) { for (int i = 0; i < nCnt; i++) { int 일자 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "일자").Trim()); //[0] int 현재가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "현재가").Trim()); //[1] float 대비기호 = 0; //[2] if (!float.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "대비기호").Trim(), out 대비기호)) { } int 전일대비 = 0;//[3] if (!Int32.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일대비").Trim(), out 전일대비)) { 전일대비 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일대비").Trim().Replace("--", "-")); } float 등락율 = 0;//[4] if (!float.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "등락율").Trim(), out 등락율)) { 등락율 = float.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "등락율").Trim()); } int 누적거래대금 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "누적거래대금").Trim()); //[5 int 개인투자자 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "개인투자자").Trim()); //[6] int 외국인투자자 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "외국인투자자").Trim()); //[7] int 기관계 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "기관계").Trim()); //[8] int 금융투자 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "금융투자").Trim()); //[9] int 보험 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "보험").Trim()); //[10] int 투신 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "투신").Trim()); //[11] int 기타금융 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "기타금융").Trim()); //[12] int 은행 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "은행").Trim()); //[13] int 연기금등 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "연기금등").Trim()); //[14] int 사모펀드 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "사모펀드").Trim()); //[15] int 국가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "국가").Trim()); //[16] int 기타법인 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "기타법인").Trim()); //[17] int 내외국인 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "내외국인").Trim()); //[18] String tmp1 = String.Format(tmp, 일자, 현재가, 대비기호, 전일대비, 등락율, 누적거래대금, 개인투자자, 외국인투자자, 기관계, 금융투자, 보험, 투신, 기타금융, 은행, 연기금등, 사모펀드, 국가, 기타법인, 내외국인, 종목코드, spell.buyOrSell, spell.priceOrAmount ); lastStockDate = 일자.ToString(); if (startDate != null) { if (startDate.Equals("ZERO") || startDate.Equals("TWO")) { sbAll.AppendLine(tmp1); } else { if (일자 >= startDate일자) { sbAll.AppendLine(tmp1); } else { break; } } } else { sbAll.AppendLine(tmp1); } } } else { 종목코드 = "00000"; } int prevNext = 0; if (!int.TryParse(e.sPrevNext, out prevNext)) { prevNext = 0; } ScreenNumber.getClass1Instance().DisconnectRealData(e.sScrNo); ScreenNumber.getClass1Instance().SetRealRemove("ALL", "ALL"); putReceivedQueueAndsetNextSpell(key, sbAll.ToString(), prevNext, lastStockDate); } catch (Exception ex) { FileLog.PrintF("[ALERT-ReceivedData-OPT10059]Exception ex=" + ex.Message); } }
public override void ReceivedData(AxKHOpenAPILib.AxKHOpenAPI axKHOpenAPI, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e) { FileLog.PrintF("ReceivedData OPT10014"); try { /* * sScrNo – 화면번호 * sRQName – 사용자구분 명 * sTrCode – Tran 명 * sRecordName – Record 명 * sPreNext – 연속조회 유무 */ StringBuilder sbAll = new StringBuilder(); StringBuilder sb = new StringBuilder(); /*일자,종목코드 ,종가,전일대비기호,전일대비,등락율,거래량,공매도량,매매비중,공매도거래대금,공매도평균가*/ sb.Append("{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}|{8}|{9}|{10}"); String tmp = sb.ToString(); String 종목코드 = "XXXX"; int nCnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName); String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}"; String keyStockCode = String.Format(keyStockCodeLayout , e.sRQName , e.sTrCode , e.sScrNo ); 종목코드 = AppLib.getClass1Instance().getStockCode(keyStockCode); String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}"; String key = String.Format(keyLayout , e.sRQName , e.sTrCode , e.sScrNo , 종목코드 ); spell = AppLib.getClass1Instance().getSpell(key).ShallowCopy(); String startDate = spell.startDate; String lastStockDate = ""; int startDate일자 = 0; if (!int.TryParse(startDate, out startDate일자)) { startDate일자 = 0; } if (nCnt > 0) { for (int i = 0; i < nCnt; i++) { int 일자 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "일자").Trim()); //[0] int 종가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종가").Trim()); //[1] int 전일대비기호 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일대비기호").Trim()); //[2] int 전일대비 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일대비").Trim()); //[3] float 등락율 = float.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "등락율").Trim()); //[4] int 거래량 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "거래량").Trim()); //[5] int 공매도량 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "공매도량").Trim()); //[6] float 매매비중 = float.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매매비중").Trim()); //[7] int 공매도거래대금 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "공매도거래대금").Trim()); //[8] int 공매도평균가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "공매도평균가").Trim()); //[9] String tmp1 = String.Format(tmp, 일자, 종목코드, 종가, 전일대비기호, 전일대비, 등락율, 거래량, 공매도량, 매매비중, 공매도거래대금, 공매도평균가 ); lastStockDate = 일자.ToString(); if (startDate != null) { if (startDate.Equals("ZERO") || startDate.Equals("TWO")) { sbAll.AppendLine(tmp1); } else { if (일자 >= startDate일자) { sbAll.AppendLine(tmp1); } else { break; } } } else { sbAll.AppendLine(tmp1); } } } else { 종목코드 = "00000"; } int prevNext = 0; if (!int.TryParse(e.sPrevNext, out prevNext)) { prevNext = 0; } ScreenNumber.getClass1Instance().DisconnectRealData(e.sScrNo); ScreenNumber.getClass1Instance().SetRealRemove("ALL", "ALL"); putReceivedQueueAndsetNextSpell(key, sbAll.ToString(), prevNext, lastStockDate); } catch (Exception ex) { FileLog.PrintF("[ALERT-ReceivedData-OPT10014]Exception ex=" + ex.Message); } }
public override void ReceivedData(AxKHOpenAPILib.AxKHOpenAPI axKHOpenAPI, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e) { /* * sScrNo – 화면번호 * sRQName – 사용자구분 명 * sTrCode – Tran 명 * sRecordName – Record 명 * sPreNext – 연속조회 유무 */ FileLog.PrintF("ReceivedData OPT10080"); try { StringBuilder sbAll = new StringBuilder(); StringBuilder sb = new StringBuilder(); //sb.Append("일자:{0}|종목코드:{1}|현재가:{2}|거래량:{3}|거래대금:{4}|시가:{5}|고가:{6}|저가:{7}"); //sb.Append("stock_date:{0}|stock_code:{1}|current_price:{2}|trade_quantity:{3}|trade_price:{4}|start_price:{5}|high_price:{6}|low_price:{7}"); sb.Append("{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}|{8}|{9}|{10}|{11}|{12}|{13}"); String tmp = sb.ToString(); String 종목코드 = "XXXX"; int nCnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName); String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}"; String keyStockCode = String.Format(keyStockCodeLayout , e.sRQName , e.sTrCode , e.sScrNo ); 종목코드 = AppLib.getClass1Instance().getStockCode(keyStockCode); String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}"; String key = String.Format(keyLayout , e.sRQName , e.sTrCode , e.sScrNo , 종목코드 ); spell = AppLib.getClass1Instance().getSpell(key).ShallowCopy(); String startDate = spell.startDate; String lastStockDate = ""; long startDate일자 = 0; //시분초를 더함 if (!long.TryParse(startDate + "000000", out startDate일자)) { startDate일자 = 0; } if (nCnt > 0) { String 종목코드1 = ""; for (int i = 0; i < nCnt; i++) { if (i == 0) { 종목코드1 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목코드").Trim(); //[0] 싱글 -첫번째에만 나타남 } int 현재가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "현재가").Trim()); //[1] int 거래량 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "거래량").Trim()); //[2] String 체결시간 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결시간").Trim(); //[3] int 시가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "시가").Trim()); //[4] int 고가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "고가").Trim()); //[5] int 저가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "저가").Trim()); //[6] int 수정주가구분 = 0; if (axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "수정주가구분") != null && !axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "수정주가구분").ToString().Trim().Equals("")) { 수정주가구분 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "수정주가구분").Trim()); //[7] } float 수정비율 = 0; if (axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "수정비율") != null && !axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "수정비율").ToString().Trim().Equals("")) { 수정비율 = float.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "수정비율").Trim()); //[8] } int 대업종구분 = 0; if (axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "대업종구분") != null && !axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "대업종구분").ToString().Trim().Equals("")) { 대업종구분 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "대업종구분").Trim()); //[9] } int 소업종구분 = 0; if (axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "소업종구분") != null && !axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "소업종구분").ToString().Trim().Equals("")) { 소업종구분 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "소업종구분").Trim()); //[10] } int 종목정보 = 0; if (axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목정보") != null && !axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목정보").ToString().Trim().Equals("")) { 종목정보 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목정보").Trim()); //[11] } int 수정주가이벤트 = 0; if (axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "수정주가이벤트") != null && !axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "수정주가이벤트").ToString().Trim().Equals("")) { 수정주가이벤트 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "수정주가이벤트").Trim());//[12] } int 전일종가 = 0; if (axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일종가") != null && !axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일종가").ToString().Trim().Equals("")) { 전일종가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일종가").Trim()); //[13] } String tmp1 = String.Format(tmp , 종목코드1 , 현재가 , 거래량 , 체결시간 , 시가 , 고가 , 저가 , 수정주가구분 , 수정비율 , 대업종구분 , 소업종구분 , 종목정보 , 수정주가이벤트 , 전일종가 ); //String str일자 = 체결시간.Substring(0, 8); long 일자 = long.Parse(체결시간); lastStockDate = 체결시간; if (startDate != null) { if (startDate.Equals("ZERO") || startDate.Equals("TWO")) { sbAll.AppendLine(tmp1); } else { if (일자 >= startDate일자) { sbAll.AppendLine(tmp1); } else { break; } } } else { sbAll.AppendLine(tmp1); } } } else { 종목코드 = "00000"; } int prevNext = 0; if (!int.TryParse(e.sPrevNext, out prevNext)) { prevNext = 0; } ScreenNumber.getClass1Instance().DisconnectRealData(e.sScrNo); ScreenNumber.getClass1Instance().SetRealRemove("ALL", "ALL"); putReceivedQueueAndsetNextSpell(key, prevNext, lastStockDate); } catch (Exception ex) { FileLog.PrintF("[ALERT-ReceivedData-OPT10080]Exception ex=" + ex.Message); } }
public override void ReceivedData(AxKHOpenAPILib.AxKHOpenAPI axKHOpenAPI, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e) { /* * sScrNo – 화면번호 * sRQName – 사용자구분 명 * sTrCode – Tran 명 * sRecordName – Record 명 * sPreNext – 연속조회 유무 */ FileLog.PrintF("ReceivedData OPT10081"); try { StringBuilder sbAll = new StringBuilder(); StringBuilder sb = new StringBuilder(); //sb.Append("일자:{0}|종목코드:{1}|현재가:{2}|거래량:{3}|거래대금:{4}|시가:{5}|고가:{6}|저가:{7}"); //sb.Append("stock_date:{0}|stock_code:{1}|current_price:{2}|trade_quantity:{3}|trade_price:{4}|start_price:{5}|high_price:{6}|low_price:{7}"); sb.Append("{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}"); String tmp = sb.ToString(); String 종목코드 = "XXXX"; int nCnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName); String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}"; String keyStockCode = String.Format(keyStockCodeLayout , e.sRQName , e.sTrCode , e.sScrNo ); 종목코드 = AppLib.getClass1Instance().getStockCode(keyStockCode); String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}"; String key = String.Format(keyLayout , e.sRQName , e.sTrCode , e.sScrNo , 종목코드 ); FileLog.PrintF("keyStockCode1 ==" + keyStockCode); FileLog.PrintF("key1 ==" + key); spell = AppLib.getClass1Instance().getSpell(key).ShallowCopy(); String startDate = spell.startDate; FileLog.PrintF("startDate ==" + startDate); String lastStockDate = ""; int startDate일자 = 0; if (!int.TryParse(startDate, out startDate일자)) { startDate일자 = 0; } if (nCnt > 0) { for (int i = 0; i < nCnt; i++) { /* * if (i == 0) { * 종목코드1 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목코드").Trim(); * } */ String 종목코드1 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목코드").Trim(); if (종목코드1 == null || 종목코드1.Trim().Equals("")) { 종목코드1 = 종목코드; } // FileLog.PrintF("거래대금 ==" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "거래대금").Trim()); int 현재가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "현재가").Trim()); int 거래량 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "거래량").Trim()); int 거래대금 = 0; //이게 INF 로 나올때가 있다.. 주식코드는 013900 두원중공업 if (!Int32.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "거래대금").Trim(), out 거래대금)) { 거래대금 = 0; } int 일자 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "일자").Trim()); int 시가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "시가").Trim()); int 고가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "고가").Trim()); int 저가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "저가").Trim()); // int 수정주가구분 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "수정주가구분").Trim()); // int 수정비율 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "수정비율").Trim()); // int 대업종구분 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "대업종구분").Trim()); // int 소업종구분 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "소업종구분").Trim()); // int 종목정보 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목정보").Trim()); // int 수정주가이벤트 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "수정주가이벤트").Trim()); // int 전일종가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일종가").Trim()); String tmp1 = String.Format(tmp , 일자 , 종목코드 , 현재가 , 거래량 , 거래대금 , 시가 , 고가 , 저가 ); lastStockDate = 일자.ToString(); if (startDate != null) { if (startDate.Equals("ZERO") || startDate.Equals("TWO")) { sbAll.AppendLine(tmp1); } else { if (일자 >= startDate일자) { sbAll.AppendLine(tmp1); } else { break; } } } else { sbAll.AppendLine(tmp1); } } } else { 종목코드 = "00000"; } int prevNext = 0; if (!int.TryParse(e.sPrevNext, out prevNext)) { prevNext = 0; } ScreenNumber.getClass1Instance().DisconnectRealData(e.sScrNo); ScreenNumber.getClass1Instance().SetRealRemove("ALL", "ALL"); putReceivedQueueAndsetNextSpell(key, sbAll.ToString(), prevNext, lastStockDate); } catch (Exception ex) { FileLog.PrintF("[ALERT-ReceivedData-OPT10081]Exception ex=" + ex.Message); } }
public override void ReceivedData(AxKHOpenAPILib.AxKHOpenAPI axKHOpenAPI, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e) { FileLog.PrintF("ReceivedData OPT10001"); try { /* * sScrNo – 화면번호 * sRQName – 사용자구분 명 * sTrCode – Tran 명 * sRecordName – Record 명 * sPreNext – 연속조회 유무 */ StringBuilder sbAll = new StringBuilder(); StringBuilder sb = new StringBuilder(); /*일자,종목코드 ,종가,전일대비기호,전일대비,등락율,거래량,공매도량,매매비중,공매도거래대금,공매도평균가*/ sb.Append("{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}|{8}|{9}|{10}|{11}|{12}|{13}|{14}|{15}|{16}|{17}|{18}|{19}|{20}|{21}|{22}|{23}|{24}|{25}|{26}|{27}|{28}|{29}|{30}|{31}|{32}|{33}|{34}|{35}|{36}|{37}|{38}|{39}|{40}|{41}|{42}"); String tmp = sb.ToString(); String 종목코드 = "XXXX"; int nCnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName); String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}"; String keyStockCode = String.Format(keyStockCodeLayout , e.sRQName , e.sTrCode , e.sScrNo ); 종목코드 = AppLib.getClass1Instance().getStockCode(keyStockCode); String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}"; String key = String.Format(keyLayout , e.sRQName , e.sTrCode , e.sScrNo , 종목코드 ); String 일자 = DateTime.Now.ToString("yyyyMMdd"); spell = AppLib.getClass1Instance().getSpell(key).ShallowCopy(); //Array arr =(Array)axKHOpenAPI.GetCommDataEx(e.sTrCode, e.sRQName); if (nCnt > 0) { for (int i = 0; i < nCnt; i++) { String 종목코드1 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목코드").Trim();//[0] if (종목코드1.Equals("")) { 종목코드1 = 종목코드; //일부 종목코드들은 아래 데이터가 아예 안나온다. ///51A077 } String 종목명 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목명").Trim(); //[1] int 결산월 = 0; String str결산월 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "결산월"); if (isNotNull(str결산월) == true) { 결산월 = Int32.Parse(str결산월.Trim());//[2] } String str액면가 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "액면가"); float 액면가 = 0; if (isNotNull(str액면가) == true) { 액면가 = float.Parse(str액면가.Trim());//[3] } String str자본금 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "자본금"); int 자본금 = 0; if (isNotNull(str자본금) == true) { 자본금 = Int32.Parse(str자본금.Trim());//[4] } String str상장주식 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "상장주식"); int 상장주식 = 0; if (isNotNull(str상장주식) == true) { 상장주식 = Int32.Parse(str상장주식.Trim());//[5] } String str신용비율 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "신용비율"); float 신용비율 = 0; if (isNotNull(str신용비율) == true) { 신용비율 = float.Parse(str신용비율.Trim());//[6] } String str연중최고 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "연중최고"); int 연중최고 = 0; if (isNotNull(str연중최고) == true) { 연중최고 = int.Parse(str연중최고.Trim());//[7] } String str연중최저 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "연중최저"); int 연중최저 = 0; if (isNotNull(str연중최저) == true) { 연중최저 = int.Parse(str연중최저.Trim());//[8] } String str시가총액 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "시가총액"); int 시가총액 = 0; if (isNotNull(str시가총액) == true) { 시가총액 = int.Parse(str시가총액.Trim());//[9] } String str시가총액비중 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "시가총액비중"); int 시가총액비중 = 0; if (isNotNull(str시가총액비중) == true) { 시가총액비중 = Int32.Parse(str시가총액비중.Trim());//[10] } String str외인소진률 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "외인소진률"); float 외인소진률 = 0; if (isNotNull(str외인소진률) == true) { 외인소진률 = float.Parse(str외인소진률.Trim());//[11] } String str대용가 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "대용가"); int 대용가 = 0; if (isNotNull(str대용가) == true) { 대용가 = int.Parse(str대용가.Trim());//[12] } String strPER = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "PER"); float PER = 0; if (isNotNull(strPER) == true) { PER = float.Parse(strPER.Trim());//[13] } String strEPS = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "EPS"); int EPS = 0; if (isNotNull(strEPS) == true) { EPS = int.Parse(strEPS.Trim());//[14] } String strROE = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "ROE"); float ROE = 0; if (isNotNull(strROE) == true) { ROE = float.Parse(strROE.Trim());//[15] } String strPBR = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "PBR"); float PBR = 0; if (isNotNull(strPBR) == true) { PBR = float.Parse(strPBR.Trim());//[16] } String strEV = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "EV"); float EV = 0; if (isNotNull(strEV) == true) { EV = float.Parse(strEV.Trim());//[17] } String strBPS = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "BPS"); int BPS = 0; if (isNotNull(strBPS) == true) { BPS = int.Parse(strBPS.Trim());//[18] } String str매출액 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매출액"); int 매출액 = 0; if (isNotNull(str매출액) == true) { 매출액 = Int32.Parse(str매출액.Trim());//[19] } String str영업이익 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "영업이익"); int 영업이익 = 0; if (isNotNull(str영업이익) == true) { 영업이익 = Int32.Parse(str영업이익.Trim());//[20] } String strD250최고 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "250최고"); int D250최고 = 0; if (isNotNull(strD250최고) == true) { D250최고 = Int32.Parse(strD250최고.Trim());//[21] } String strD250최저 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "250최저"); int D250최저 = 0; if (isNotNull(strD250최저) == true) { D250최저 = Int32.Parse(strD250최저.Trim());//[22] } int 시가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "시가").Trim()); //[23] int 고가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "고가").Trim()); //[24] int 저가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "저가").Trim()); //[25] int 상한가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "상한가").Trim()); //[26] int 하한가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "하한가").Trim()); //[27] int 기준가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "기준가").Trim()); //[28] String str예상체결가 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "예상체결가"); int 예상체결가 = 0; if (isNotNull(str예상체결가) == true) { 예상체결가 = Int32.Parse(str예상체결가.Trim());//[29] } String str예상체결수량 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "예상체결수량"); int 예상체결수량 = 0; if (isNotNull(str예상체결수량) == true) { 예상체결수량 = Int32.Parse(str예상체결수량.Trim()); //[30] } String D250최고가일 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "250최고가일").Trim(); //[31] float D250최고가대비율 = float.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "250최고가대비율").Trim()); //[32] String D250최저가일 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "250최저가일").Trim(); //[33] float D250최저가대비율 = float.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "250최저가대비율").Trim()); //[34] int 현재가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "현재가").Trim()); //[35] int 대비기호 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "대비기호").Trim()); //[36] int 전일대비 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일대비").Trim()); //[37] float 등락율 = float.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "등락율").Trim()); //[38] int 거래량 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "거래량").Trim()); //[39] float 거래대비 = float.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "거래대비").Trim()); //[40] String 액면가단위 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "액면가단위").Trim(); //[41] String tmp1 = String.Format(tmp, 일자, 종목코드1, 종목명, 결산월, 액면가, 자본금, 상장주식, 신용비율, 연중최고, 연중최저, 시가총액, 시가총액비중, 외인소진률, 대용가, PER, EPS, ROE, PBR, EV, BPS, 매출액, 영업이익, D250최고, D250최저, 시가, 고가, 저가, 상한가, 하한가, 기준가, 예상체결가, 예상체결수량, D250최고가일, D250최고가대비율, D250최저가일, D250최저가대비율, 현재가, 대비기호, 전일대비, 등락율, 거래량, 거래대비, 액면가단위 ); sbAll.AppendLine(tmp1); } } else { 종목코드 = "00000"; } //이건 nPreNext가 항상 0이다. 당일 조회만 됨 int prevNext = 0; if (!int.TryParse(e.sPrevNext, out prevNext)) { prevNext = 0; } String lastStockDate = ""; ScreenNumber.getClass1Instance().DisconnectRealData(e.sScrNo); ScreenNumber.getClass1Instance().SetRealRemove("ALL", "ALL"); putReceivedQueueAndsetNextSpell(key, sbAll.ToString(), prevNext, lastStockDate); } catch (Exception ex) { FileLog.PrintF("[ALERT-ReceivedData-OPT10001]Exception ex=" + ex.Message); } }
/// <summary> ///[101] 설명 주식 일일 데이터를 주식이 생성된 일부터 받아온다. ///입력값 ///strCode : 종목코드 ///stockDate: YYYYMMDD 문자열 ex)20160122 ////반환값 /// 성공유무 데이터는 onReceived쪽에서 soap로 쏴줌 /// </summary> /// /// spell 은 내가 만든 속성 api가 너무 과거거 까지 다가져오므로 /// START_STOCK_DATE 로 넘어오면 START_STOCK_DATE 부터 stockDate 까지 가져오기 형식은 'YYYYMMDD' /// ZERO 으로 나오면 한번 받아올수있는 제한까지만 받아오기. /// TWO로 넘어오면 처음 부터 지정한 stockDate까지 nPreNext를 받는쪽에서 2로 지정해서 다받아올수있게 하기. public String GetOpt10081(String strCode, String startDate, String endDate) { //String stockDate = DateTime.Today.ToString("yyyyMMdd"); //음 nPreNext 를 처음 할때는 0으로 놓고 했는데.. // 그럼 과거 몇개랑 현재까지 보이고.. // 받아온것을 nPreNext 2로 하면 이어서 받아오게 되는데.. // qna 게시판 일어보니 1로 넣으면 그날만 가져온다는 것 같다. //해보자. /* * 1. 고객님께서 작성하신 로직상 CommRqData가 전송횟수제한 오류 발생없이 모두 전송되고 있다면 무리가 없습니다. * 2. 2값은 조회하신 기준으로 그 이전의 값을 의미하고, 1값은 조회하신 기준으로 그 이후 연속데이터를 의미합니다. 1 값은 현재 시점 기준이 아닌 특정 일자를 입력하여 조회하는 성격의 TR서비스에서 사용됩니다. */ //그런데 1로 해도 0이랑했을때랑 차이가 없다. ㅠㅠ //결국엔 당일것만 가져오고 싶으면 내가 적절히 짤라 줘야한다.. //그러기 위해서 명령어를 담아두었다가 receive가 되었을때 비교 해서 적절하게 짤라줄 명령어를 담는 저장공간이 필요하겠다. //HashTable이 괜찮겠네... //전역으로 읽을 수 있어야 하니까 공간은 Class1 //내가 마음대로 조절할수있는것은. sRQName, sScreenNo 두개네... /* * 이런 난 수정주가 구분이 1로 고정인지 알았는데 qna를 보니 그게 아닌것 같다.. * * 문의 내용중이런것이 있다));; * OPT10081 에서 * 수정주가구분 = 0 or 1 * 이것을 변경해도 동일한 값이 나옵니다. * * 테스트 조건 * SetInputValue("종목코드" , "002990"); * SetInputValue("기준일자" , "20121228"); * SetInputValue("수정주가구분" , "0"); * * SetInputValue("종목코드" , "002990"); * SetInputValue("기준일자" , "20121228"); * SetInputValue("수정주가구분" , "1"); * * 두개 모두 2012년 12월 28일 현재가가 1555원 표시됩니다. * * 해당 종목은 감자가 있었기 때문에 * 차트에서 * 수정주가 적용시 : 10892원 * 수정주가 미적용시 : 1555원 * 이렇게 표시됩니다. * * 기타 다른 답변으로는 * 차트조회시 수정주가 구분값(0:권리락 적용안됨.1:권리락 적용됨)을 넣어서 조회하시면 됩니다. * 권리락이라는게 뭘까?? * * 권리락 중 "권리" 에 의미는 유상증장 및 무상증자와 배당에 참여할 수 있는 자격 또는 권리를 의미하며, * 곧 주식 권리락이란 위에 해당하는 권리를 받을 수 있는 자격이 없어진다는 이야기입니다. * 다시 말하면 증자를 통하여 얻게 되는 이익에 비례하여 주가를 떨어뜨립니다. * * * 유상증자에서의 권리락 * 말그대로 기존 주주들에게 유상으로(돈을 지불하여) 현 시점의 주가보다 저렴하게 주식을 살 수 있게 권리를 주게 되며, * 이 때문에 생기는 시세차이로 인하여 권리락이 발생하게 됩니다. * 무상증자 * 주주들이 지불 없이 더 많은 주식을 받게 됩니다. 회사 입장에서는 주주들에게 지불받는 금액이 없으나 주식수는 늘어나게 됩니다. * 무상증자가 일어나면 주주는 더 많은 주식을 갖게 되지만 주가는 그에 비례하여 하락을 하게 되기 때문에 * 결론적으로는 값이 동일해집니다. * 하지만, 대부분 무상증자 시 주가는 기존 값으로 회귀를 하는 경우가 많고, 시장에서 호재로 여겨지는 부분임. * 그냥 1로 표시하자... 골치 아프다.. */ /* * 큐를 받아두었다가 처리하는건.. 약간 위험한듯.. * 그것보다 여기에서 지연이 생길수있도록 하는게 맞는것같다. * 시스템 성능 만큼 여기서 지연이 일어나야한다.. * 이미 HashTable를 사용해서 여기 넣은 명령어가 received이벤트가 발생할 때 읽을 수있도록 했다.. * 그리고 그걸 큐에 담아서 soap으로 전송할때 사용했었다.. * 큐하고 hashtable 두개를 쓰던걸 hashtable 하나로 바꾸고 * 실제로 soap 요청이 완료되면 hashtable에서 그 키값을 바꾸도록 해야겠다. * 그런데 soap 전송에서 key값을 어떻게 알수 있을까??? * 음 hashtable에 순서가 있어서 처음들어온것을 빠질수있게 하면 되겠다.. * 그런데 hashtable에는 순서가 없네... * 큐에 Dinary를 담자.. * ㅋㅋ 그러면 되겠다... * 아 dictionary를 담으려고 보니까.. 너무 낭비인것 같다. * 클래스를 하나만들자.. * 아 생각해보니까. 하나 만들어둔게 있었다.. * ReceiveTrData.class * 아 젠장 큐가 recevie에서 만드니까.. 여기 서 막을 방법이 없네.. * 여기서 막으면 행이 걸리는데.. 행이걸리는게 맞긴 한것 같은데.. * 행이 오래걸리면 타임아웃이 걸리텐데... * 그럼 다시 원점인데.. 여기다 가 큐를 만들어야하는데.. * * * 여기 쓰레드 큐가 하나 있어야 하고 * 그 쓰레드는 이벤트에 큐가 쌓였을때 * 하나씩 실행되어야 해.. 그래야 맞는것 같아.. * 하나는 신문을 넣고 하나는 출판을 하는 그 걸 써야 하는게 맞는것 같은데.. * https://msdn.microsoft.com/ko-kr/library/yy12yx1f%28v=vs.90%29.aspx * * 오호 이게 맞는것 같은데.. * http://www.csharpstudy.com//Threads/autoresetevent.aspx * 이아저씨는 천제인가.. * 그런데 이건 한번 다 돌고 그다음 다른거 돌고 그런식이네... * 이렇게 구현하면 명령어가 행이 걸릴수도 있겠는데.. * 한쪽에서 계속 받아서 쌓이면... * 그리고 나중에 실행되고 그런식 아닐까... * * 음 입력이 불특정으로 일어나니까 쌓이는것도 불특정으로 쌓여서 흐름이 되겠다. * 나쁘지 않다... * 쓰레드 돌리는걸 생각해보았는데.. 생각보다 위험하다.. * kiwoom api가 객체를 여러개 생성하는게 아니라 하나로 쓰는거랑 * 변수가 바뀌지 않을꺼라는 보장이 없다.. * * 델레케이트 풀이 가능 할까??? * * * * * 이게 맞는것 같은데 이해를 못하고 있으니... * 음 이건 큐가 하나네.. 그런데 내꺼는 큐하나로 못하는데.. * 쓰레드 큐가 있어야 하네... * 큐를 넣으면 반환값이 없어지네.. 큐하면 안되겠다 앞에 링크중 * 앞에 그냥 1초 걸자.. 아 일이 진행이 안되네... * * 그래서 멈추는걸 로 해서 아래처럼 했느데.. 쓸데없이 뒤에서 보내고 다시 조회하고 그러는데 시간이 딜레이가 걸린다... * 큐에서 3개정도 있고 recevie가 동작을 했으면 좋겠다... * 그렇게 하려면 * 큐 크기를 조사해서 3보다 작으면 웨이트가 걸리고 3보다 크면 웹이트가 풀리고.. OK?? * */ //Class1.getClass1Instance().waitOneOpt10081();// 멈추기.. String sScreenNo = ScreenNumber.getClass1Instance().GetEosScrNum(); String sRQName = "주식일봉차트조회"; String sTrCode = "OPT10081"; int nPrevNext = 0; String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}"; String keyStockCode = String.Format(keyStockCodeLayout , sRQName , sTrCode , sScreenNo ); String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}"; String key = String.Format(keyLayout , sRQName , sTrCode , sScreenNo , strCode ); FileLog.PrintF("keyStockCode ==" + keyStockCode); FileLog.PrintF("key ==" + key); OpenApi.Spell.SpellOpt spellOpt10081 = new OpenApi.Spell.SpellOpt(); spellOpt10081.sRQNAME = sRQName; spellOpt10081.sTrCode = sTrCode; spellOpt10081.stockCode = strCode; spellOpt10081.startDate = startDate; spellOpt10081.endDate = endDate; spellOpt10081.nPrevNext = nPrevNext; spellOpt10081.sScreenNo = sScreenNo; //음 받는쪽에서 일자하고 nPrevNext를 알수가 없어서..키로 쓸수가 없다... //종목코드로도 찾을 수가 없네 종목코드도 지우자. //spell="" AppLib.getClass1Instance().AddStockCodeDictionary(keyStockCode, strCode); AppLib.getClass1Instance().AddSpellDictionary(key, spellOpt10081); axKHOpenAPI.SetInputValue("종목코드", strCode); axKHOpenAPI.SetInputValue("기준일자", endDate); axKHOpenAPI.SetInputValue("수정주가구분", "1"); int nRet = axKHOpenAPI.CommRqData(sRQName, sTrCode, nPrevNext, sScreenNo); if (Error.IsError(nRet)) { return("[OPT10081][OK]:" + Error.GetErrorMessage()); } else { return("[OPT10081][NOK]:" + Error.GetErrorMessage()); } }