OnReceiveChejanData 소스코드
마스터욱
0
95
0
0
2018-07-25 20:15:09
OnReceiveChejanData 가 호출되는 시점은,
매수/매도가 체결될때이다.
소켓으로 연결되어 있기 때문에 실시간으로 데이터를 던져준다.
로그를 찍어보면 바바바박~ 들어오는 것을 확인할 수 있습니다.
해당 함수안에서 뽑을수 있는 데이터는 꽤 많은데, 그 데이터는 GetChejanData 로 호출합니다.
파라메터로 int 숫자값을 넣어야 하는데, 각 숫자별로 리턴하는 값이 다 다릅니다.
예를 들어 902 는 미체결수량을 리턴하고, 913은 주문상태를 리턴합니다.
코아스튜디오의 "실시간목록" 을 참고하면 모든 값을 조회 가능합니다.
코아스튜디오가 좋긴한데 리턴하는 값이 무엇인지는 일일이 다 찍어봐야 하는게 무지 불편하다. 아니면 내가 모르는 다른 사용하는 법이 있는건가?
아래는 저의 더러운 소스코드입니다.
- private void axKHOpenApi_OnReceiveChejanData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveChejanDataEvent e)
- {
- if (e.sGubun == "0") //체결구분 접수와 체결시
- {
- string 미체결수량 = fparent.axKHOpenAPI1.GetChejanData(902).Trim();
- string 주문상태 = fparent.axKHOpenAPI1.GetChejanData(913).Trim();
- string 매도수구분 = fparent.axKHOpenAPI1.GetChejanData(907).Trim(); //180725 추가
- string 매도_매수구분 = fparent.axKHOpenAPI1.GetChejanData(946).Trim(); //180725 추가
- string 종목명 = fparent.axKHOpenAPI1.GetChejanData(302).Trim(); //종목명
- 종목명 = 종목명.Replace(Environment.NewLine, "").Trim();
- string 종목코드 = fparent.axKHOpenAPI1.GetChejanData(9001); //종목코드, 업종코드
- 종목코드 = 종목코드.Replace("A","");
- string 체결시간 = fparent.axKHOpenAPI1.GetChejanData(908); //체결시간
- string 체결가 = fparent.axKHOpenAPI1.GetChejanData(910); //체결가
- int 체결량 = 0;
- if (fparent.axKHOpenAPI1.GetChejanData(911).Length > 0)
- {
- 체결량 = Int32.Parse(fparent.axKHOpenAPI1.GetChejanData(911).Trim()); //체결량
- }
- int 단위체결량 = 0;
- if (fparent.axKHOpenAPI1.GetChejanData(915).Length > 0)
- {
- 단위체결량 = Int32.Parse(fparent.axKHOpenAPI1.GetChejanData(915).Trim()); //단위체결량
- }
- setLog("키움신호발생!종목명=" + 종목명 + ",체결량=" + 체결량 + ",미체결수량=" + 미체결수량 + ",주문상태=" + 주문상태 + ", 체결가:"+ 체결가+"/");
- setLog("매도수구분="+ 매도수구분+ ",매도_매수구분="+ 매도_매수구분);
- if (체결량 > 0)
- {
- Boolean 리로드 = false;
- if(매매임시데이터.ContainsKey(종목코드)) //아직 트레이딩중인 종목이라면
- {
- //체결완료 종목코드 = 111870, 종목명 = 삼본정밀전자
- Console.WriteLine("찬진 데이터 = " + 매매임시데이터.ToString());
- Console.WriteLine("체결완료 종목코드 = " + 종목코드 + ", 종목명 = " + 종목명);
- string 임시데이터 = 매매임시데이터[종목코드];
- string[] 데이터 = 임시데이터.Split(';');
- string 매매타입 = 데이터[0];
- string 매수가 = 데이터[1];
- string 매도가 = 데이터[1];
- string 수량 = 데이터[2];
- //setLog("매도가:" + 매도가 + "/");
- //DB에 저장
- //setLog("매매타입:"+매매타입+",체결가:" + 체결가+",매도가:"+매도가);
- //Console.WriteLine("매매타입:" + 매매타입 + ",체결가:" + 체결가 + ",매도가:" + 매도가);
- //if (체결가 != 매도가 || 매매타입 == "매도") //체결가와 매수가가 다르면 키움에서 강제로 매도할 경우임
- if(매도_매수구분 == "매도") //180725 추가
- {
- Console.WriteLine("매도입성");
- if (매수중인데이터.ContainsKey(종목코드))
- {
- Console.WriteLine("매도입성1");
- //매수가 아직 덜됐는데, 매도 신호가 올경우에는 매수가 다 될때까지 기다리자...
- //이런경우는 가격이 엄청 빠른 속도로 요동치고 있는 경우임.
- }
- else
- {
- Console.WriteLine("매도입성2");
- if (체결가 != 매도가)
- {
- string log_string = "영웅문 " + 종목명 + "(" + 종목코드 + ")를 강제 매도시작. 체결가 = " + 체결가;
- setLog(log_string);
- Console.WriteLine(log_string);
- }
- //DB에 저장
- JObject json = fparent.get_json_obj();
- json["type"] = "set_sell";
- json["stock_code"] = 종목코드;
- json["sell_price"] = 체결가.ToString(); //영웅문 강제매도도 있기 때문에, 이건 체결가로 해야됨
- json["stock_count_row"] = 단위체결량; //이게 맞는지 확인해봐야함
- string jstring = json.ToString();
- jstring = jstring.Replace(Environment.NewLine, "");
- string post_data = string.Format("sdata={0}", jstring);
- dynamic api_result = fparent.HttpCall(post_data);
- if (api_result == null)
- {
- //호출실패
- setLog("(" + 종목명 + ") 데이터베이스 저장실패!");
- Console.WriteLine("(" + 종목명 + ") 데이터베이스 저장실패!");
- }
- else
- {
- //MessageBox.Show("저장되었습니다.");
- setLog("(" + 종목명 + ") 매도 데이터베이스 처리완료! 체결량 = " + 체결량 + ", 단위체결량 = " + 단위체결량);
- Console.WriteLine("(" + 종목명 + ") 매도 데이터베이스 처리완료! 체결량 = " + 체결량 + ", 단위체결량 = " + 단위체결량);
- //if (체결량.ToString().Equals(수량))
- if (미체결수량 == "0")
- {
- //set_sell_end
- JObject json2 = fparent.get_json_obj();
- json2["type"] = "set_sell_end";
- json2["stock_code"] = 종목코드;
- json2["sell_price"] = 매도가.ToString();
- string jstring2 = json2.ToString();
- jstring2 = jstring2.Replace(Environment.NewLine, "");
- string post_data2 = string.Format("sdata={0}", jstring2);
- dynamic api_result2 = fparent.HttpCall(post_data2);
- if (api_result2 == null)
- {
- //호출실패
- setLog("매도완료처리 (" + 종목명 + ") 데이터베이스 저장실패!");
- Console.WriteLine("매도완료처리 (" + 종목명 + ") 데이터베이스 저장실패!");
- }
- else
- {
- //구매리스트[종목코드].Clear(); //매수 상황 보도판에서 제거
- setLog("(" + 종목명 + ") 매도모두완료!!!!!");
- 기준금액.Remove(종목코드);
- 매도중인데이터.Remove(종목코드); //다시 매도가능하게 제거
- 구매리스트.Remove(종목코드);
- 최저가데이터.Remove(종목코드);//최저가삭제(혹시나 또 매수할수도 있으니깐)
- 리로드 = true;
- }
- }
- //수정요망, 여기 아래 3개의 코드들은 매도수량이 모두 완료되고 나서 실행되도록 수정되어야 함.(적용완료 180703 21:59)
- /*
- if(api_result.data.all_sell.Equals("OK"))
- {
- //구매리스트[종목코드].Clear(); //매수 상황 보도판에서 제거
- setLog("(" + 종목명 + ") 매도모두완료!!!!!");
- 기준금액.Remove(종목코드);
- 매도중인데이터.Remove(종목코드); //다시 매도가능하게 제거
- 구매리스트.Remove(종목코드);
- 최저가데이터.Remove(종목코드);//최저가삭제(혹시나 또 매수할수도 있으니깐)
- 리로드 = true;
- }
- */
- }
- }
- }
- //else if (매매타입 == "매수")
- else if(매도_매수구분 == "매수")
- {
- Console.WriteLine("매수입성1");
- if (매도중인데이터.ContainsKey(종목코드))
- {
- Console.WriteLine("매수입성2");
- //이런경우는 없을거 같은데 혹시나 싶어서 if절을 걸어둔다.
- //매도를 걸어뒀는데, 갑자기 순식간에 가격이 폭락해서 매수시그널이 발생하는 경우임...
- //매도취소루틴을 넣어줄까 고민은 나중에 하자...
- }
- else
- {
- Console.WriteLine("매수입성3");
- string 조건식이름 = 데이터[3];
- JObject json = fparent.get_json_obj();
- json["type"] = "set_buy_list_add";
- json["stock_name"] = conver_utf8(종목명);
- json["stock_code"] = 종목코드;
- //json["stock_price"] = 매수가;
- json["stock_price"] = 체결가.ToString(); //180725 추가, 보니깐 내가 베팅한 금액이 곧이곧대로 체결안된다. api 에서 던져주는대로 넣자
- json["stock_count"] = 수량;
- json["stock_count_row"] = 단위체결량; //이게 맞는지 확인해봐야함
- json["stock_time"] = getCurrentTime2().ToString();
- json["stock_condition_name"] = conver_utf8(조건식이름);
- //json["stock_condition_index"] = 조건명인덱스;
- string jstring = json.ToString();
- jstring = jstring.Replace(Environment.NewLine, "");
- string post_data = string.Format("sdata={0}", jstring);
- dynamic api_result = fparent.HttpCall(post_data);
- if (api_result == null)
- {
- //호출실패
- setLog("(" + 종목명 + ") 데이터베이스 저장실패!");
- Console.WriteLine("(" + 종목코드 + ") 데이터베이스 저장실패!");
- }
- else
- {
- //MessageBox.Show("저장되었습니다.");
- setLog("(" + 종목명 + ") DB SAVE OK! 전체수량:"+수량+",지금까지 체결량 = " + 체결량 + ", 방금체결량 = " + 단위체결량);
- Console.WriteLine("(" + 종목명 + ") DB SAVE OK! 전체수량:" + 수량 + ",지금까지 체결량 = " + 체결량 + ", 방금체결량 = " + 단위체결량);
- //if (체결량.ToString().Equals(수량))
- if(미체결수량 == "0")
- {
- 매수중인데이터.Remove(종목코드);
- setLog("(" + 종목명 + ") 매수모두완료!!!!!");
- 리로드 = true;
- }
- }
- }
- }
- }
- /*
- else if(기준금액.ContainsKey(종목코드)) //영웅문에서 강제로 매도를 할 경우, 디비 업데이트 처리 해주자.
- {
- 리로드 = true;
- //set_buy_list_power_remove 에서 알아서 처리할거임, 그래서 아래코드 주석처리함
- //string 종목명_임시 = fparent.axKHOpenAPI1.GetMasterCodeName(종목코드);
- //구매리스트[종목코드].Clear(); //매수 상황 보도판에서 제거
- string log_string = "영웅문에서 " + 종목명 + "(" + 종목코드 + ")를 강제로 매도했습니다. 단위체결량 = " + 단위체결량;
- setLog(log_string);
- Console.WriteLine(log_string);
- log_string = "매수수량합계 = " + 매수수량합계[종목코드] + ", 체결량 = " + 체결량 + ", 미체결수량 = " + 미체결수량 + ", 주문상태 = " + 주문상태;
- setLog(log_string);
- Console.WriteLine(log_string);
- //if (매수수량합계[종목코드] >= 체결량)
- //if(미체결수량.Equals("0"))
- if (미체결수량 == "0")
- {
- log_string = "영웅문 강제매각 완료!";
- setLog(log_string);
- Console.WriteLine(log_string);
- JObject json2 = fparent.get_json_obj();
- json2["type"] = "set_sell_end";
- json2["stock_code"] = 종목코드;
- json2["sell_price"] = 체결가.ToString();
- string jstring2 = json2.ToString();
- jstring2 = jstring2.Replace(Environment.NewLine, "");
- string post_data2 = string.Format("sdata={0}", jstring2);
- dynamic api_result2 = fparent.HttpCall(post_data2);
- if (api_result2 == null)
- {
- log_string = "영웅문에서 " + 종목명 + "(" + 종목코드 + ")를 강제로 모두매도완료 디비저장실패~";
- setLog(log_string);
- Console.WriteLine(log_string);
- }
- else
- {
- 기준금액.Remove(종목코드);
- 매도중인데이터.Remove(종목코드); //다시 매도가능하게 제거
- 구매리스트.Remove(종목코드);
- 최저가데이터.Remove(종목코드);//최저가삭제(혹시나 또 매수할수도 있으니깐)
- log_string = "영웅문에서 " + 종목명 + "(" + 종목코드 + ")를 강제로 모두매도완료 디비저장성공!!!!!";
- setLog(log_string);
- Console.WriteLine(log_string);
- }
- }
- }
- */
- if(리로드)
- {
- refresh_buylist();
- requestProfitInfo();
- requestAccountInfo();
- }
- }
- }
- }