웹스쿨

OnReceiveChejanData 소스코드 본문

개인 프로젝트/C# 키움 주식 자동매매

OnReceiveChejanData 소스코드

마스터욱 2023. 3. 30. 01:51
반응형

OnReceiveChejanData 가 호출되는 시점은, 

매수/매도가 체결될때이다.

소켓으로 연결되어 있기 때문에 실시간으로 데이터를 던져준다.

로그를 찍어보면 바바바박~ 들어오는 것을 확인할 수 있습니다.

해당 함수안에서 뽑을수 있는 데이터는 꽤 많은데, 그 데이터는 GetChejanData 로 호출합니다.

파라메터로 int 숫자값을 넣어야 하는데, 각 숫자별로 리턴하는 값이 다 다릅니다.

예를 들어 902 는 미체결수량을 리턴하고, 913은 주문상태를 리턴합니다.

코아스튜디오의 "실시간목록" 을 참고하면 모든 값을 조회 가능합니다.

코아스튜디오가 좋긴한데 리턴하는 값이 무엇인지는 일일이 다 찍어봐야 하는게 무지 불편하다. 아니면 내가 모르는 다른 사용하는 법이 있는건가?

아래는 저의 더러운 소스코드입니다.

 

  1.         private void axKHOpenApi_OnReceiveChejanData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveChejanDataEvent e)
  2.         {
  3.             if (e.sGubun == "0") //체결구분 접수와 체결시
  4.             {
  5.                 string 미체결수량 = fparent.axKHOpenAPI1.GetChejanData(902).Trim();
  6.                 string 주문상태 = fparent.axKHOpenAPI1.GetChejanData(913).Trim();
  7.  
  8.  
  9.                 string 매도수구분 = fparent.axKHOpenAPI1.GetChejanData(907).Trim(); //180725 추가
  10.                 string 매도_매수구분 = fparent.axKHOpenAPI1.GetChejanData(946).Trim(); //180725 추가
  11.  
  12.                 string 종목명 = fparent.axKHOpenAPI1.GetChejanData(302).Trim(); //종목명
  13.                 종목명 = 종목명.Replace(Environment.NewLine"").Trim();
  14.  
  15.                 string 종목코드 = fparent.axKHOpenAPI1.GetChejanData(9001); //종목코드, 업종코드
  16.                 종목코드 = 종목코드.Replace("A","");
  17.  
  18.                 string 체결시간 = fparent.axKHOpenAPI1.GetChejanData(908); //체결시간
  19.                 string 체결가 = fparent.axKHOpenAPI1.GetChejanData(910); //체결가
  20.                 int 체결량 = 0;
  21.                 if (fparent.axKHOpenAPI1.GetChejanData(911).Length > 0)
  22.                 {
  23.                     체결량 = Int32.Parse(fparent.axKHOpenAPI1.GetChejanData(911).Trim()); //체결량
  24.                 }
  25.  
  26.                 int 단위체결량 = 0;
  27.                 if (fparent.axKHOpenAPI1.GetChejanData(915).Length > 0)
  28.                 {
  29.                     단위체결량 = Int32.Parse(fparent.axKHOpenAPI1.GetChejanData(915).Trim()); //단위체결량
  30.                 }
  31.  
  32.                 setLog("키움신호발생!종목명=" + 종목명 + ",체결량=" + 체결량 + ",미체결수량=" + 미체결수량 + ",주문상태=" + 주문상태 + ", 체결가:"+ 체결가+"/");
  33.                 setLog("매도수구분="+ 매도수구분+ ",매도_매수구분="+ 매도_매수구분);
  34.                 if (체결량 > 0)
  35.                 {
  36.                     Boolean 리로드 = false;
  37.                     if(매매임시데이터.ContainsKey(종목코드)) //아직 트레이딩중인 종목이라면
  38.                     {
  39.                         //체결완료 종목코드 = 111870, 종목명 = 삼본정밀전자
  40.                         Console.WriteLine("찬진 데이터 = " + 매매임시데이터.ToString());
  41.                         Console.WriteLine("체결완료 종목코드 = " + 종목코드 + ", 종목명 = " + 종목명);
  42.                         string 임시데이터 = 매매임시데이터[종목코드];
  43.                         string[] 데이터 = 임시데이터.Split(';');
  44.                         string 매매타입 = 데이터[0];
  45.  
  46.                         string 매수가 = 데이터[1];
  47.                         string 매도가 = 데이터[1];
  48.                         string 수량 = 데이터[2];
  49.  
  50.                         //setLog("매도가:" + 매도가 + "/");
  51.  
  52.                         //DB에 저장
  53.                         //setLog("매매타입:"+매매타입+",체결가:" + 체결가+",매도가:"+매도가);
  54.                         //Console.WriteLine("매매타입:" + 매매타입 + ",체결가:" + 체결가 + ",매도가:" + 매도가);
  55.                         //if (체결가 != 매도가 || 매매타입 == "매도") //체결가와 매수가가 다르면 키움에서 강제로 매도할 경우임
  56.                         if(매도_매수구분 == "매도") //180725 추가
  57.                         {
  58.                             Console.WriteLine("매도입성");
  59.                             if (매수중인데이터.ContainsKey(종목코드))
  60.                             {
  61.                                 Console.WriteLine("매도입성1");
  62.                                 //매수가 아직 덜됐는데, 매도 신호가 올경우에는 매수가 다 될때까지 기다리자...
  63.                                 //이런경우는 가격이 엄청 빠른 속도로 요동치고 있는 경우임.
  64.                             }
  65.                             else
  66.                             {
  67.                                 Console.WriteLine("매도입성2");
  68.                                 if (체결가 != 매도가)
  69.                                 {
  70.                                     string log_string = "영웅문 " + 종목명 + "(" + 종목코드 + ")를 강제 매도시작. 체결가 = " + 체결가;
  71.                                     setLog(log_string);
  72.                                     Console.WriteLine(log_string);
  73.                                 }
  74.  
  75.                                 //DB에 저장
  76.                                 JObject json = fparent.get_json_obj();
  77.                                 json["type"] = "set_sell";
  78.                                 json["stock_code"] = 종목코드;
  79.                                 json["sell_price"] = 체결가.ToString(); //영웅문 강제매도도 있기 때문에, 이건 체결가로 해야됨
  80.                                 json["stock_count_row"] = 단위체결량; //이게 맞는지 확인해봐야함
  81.                                 string jstring = json.ToString();
  82.                                 jstring = jstring.Replace(Environment.NewLine"");
  83.                                 string post_data = string.Format("sdata={0}", jstring);
  84.                                 dynamic api_result = fparent.HttpCall(post_data);
  85.                                 if (api_result == null)
  86.                                 {
  87.                                     //호출실패
  88.                                     setLog("(" + 종목명 + ") 데이터베이스 저장실패!");
  89.                                     Console.WriteLine("(" + 종목명 + ") 데이터베이스 저장실패!");
  90.                                 }
  91.                                 else
  92.                                 {
  93.                                     //MessageBox.Show("저장되었습니다.");
  94.                                     setLog("(" + 종목명 + ") 매도 데이터베이스 처리완료! 체결량 = " + 체결량 + ", 단위체결량 = " + 단위체결량);
  95.                                     Console.WriteLine("(" + 종목명 + ") 매도 데이터베이스 처리완료! 체결량 = " + 체결량 + ", 단위체결량 = " + 단위체결량);
  96.  
  97.                                     //if (체결량.ToString().Equals(수량))
  98.                                     if (미체결수량 == "0")
  99.                                     {
  100.                                         //set_sell_end
  101.                                         JObject json2 = fparent.get_json_obj();
  102.                                         json2["type"] = "set_sell_end";
  103.                                         json2["stock_code"] = 종목코드;
  104.                                         json2["sell_price"] = 매도가.ToString();
  105.                                         string jstring2 = json2.ToString();
  106.                                         jstring2 = jstring2.Replace(Environment.NewLine"");
  107.                                         string post_data2 = string.Format("sdata={0}", jstring2);
  108.                                         dynamic api_result2 = fparent.HttpCall(post_data2);
  109.                                         if (api_result2 == null)
  110.                                         {
  111.                                             //호출실패
  112.                                             setLog("매도완료처리 (" + 종목명 + ") 데이터베이스 저장실패!");
  113.                                             Console.WriteLine("매도완료처리 (" + 종목명 + ") 데이터베이스 저장실패!");
  114.                                         }
  115.                                         else
  116.                                         {
  117.                                             //구매리스트[종목코드].Clear(); //매수 상황 보도판에서 제거
  118.                                             setLog("(" + 종목명 + ") 매도모두완료!!!!!");
  119.  
  120.                                             기준금액.Remove(종목코드);
  121.                                             매도중인데이터.Remove(종목코드); //다시 매도가능하게 제거
  122.                                             구매리스트.Remove(종목코드);
  123.                                             최저가데이터.Remove(종목코드);//최저가삭제(혹시나 또 매수할수도 있으니깐)
  124.  
  125.                                             리로드 = true;
  126.                                         }
  127.                                     }
  128.  
  129.                                     //수정요망, 여기 아래 3개의 코드들은 매도수량이 모두 완료되고 나서 실행되도록 수정되어야 함.(적용완료 180703 21:59)
  130.                                     /*
  131.                                     if(api_result.data.all_sell.Equals("OK"))
  132.                                     {
  133.                                         //구매리스트[종목코드].Clear(); //매수 상황 보도판에서 제거
  134.                                         setLog("(" + 종목명 + ") 매도모두완료!!!!!");
  135.  
  136.                                         기준금액.Remove(종목코드);
  137.                                         매도중인데이터.Remove(종목코드); //다시 매도가능하게 제거
  138.                                         구매리스트.Remove(종목코드);
  139.                                         최저가데이터.Remove(종목코드);//최저가삭제(혹시나 또 매수할수도 있으니깐)
  140.  
  141.                                         리로드 = true;
  142.                                     }
  143.                                     */
  144.                                 }
  145.                             }
  146.                         }
  147.                         //else if (매매타입 == "매수")
  148.                         else if(매도_매수구분 == "매수")
  149.                         {
  150.                             Console.WriteLine("매수입성1");
  151.                             if (매도중인데이터.ContainsKey(종목코드))
  152.                             {
  153.                                 Console.WriteLine("매수입성2");
  154.                                 //이런경우는 없을거 같은데 혹시나 싶어서 if절을 걸어둔다.
  155.                                 //매도를 걸어뒀는데, 갑자기 순식간에 가격이 폭락해서 매수시그널이 발생하는 경우임...
  156.                                 //매도취소루틴을 넣어줄까 고민은 나중에 하자...
  157.                             }
  158.                             else
  159.                             {
  160.                                 Console.WriteLine("매수입성3");
  161.                                 string 조건식이름 = 데이터[3];
  162.  
  163.                                 JObject json = fparent.get_json_obj();
  164.                                 json["type"] = "set_buy_list_add";
  165.                                 json["stock_name"] = conver_utf8(종목명);
  166.                                 json["stock_code"] = 종목코드;
  167.  
  168.                                 //json["stock_price"] = 매수가;
  169.                                 json["stock_price"] = 체결가.ToString(); //180725 추가, 보니깐 내가 베팅한 금액이 곧이곧대로 체결안된다. api 에서 던져주는대로 넣자
  170.  
  171.                                 json["stock_count"] = 수량;
  172.                                 json["stock_count_row"] = 단위체결량; //이게 맞는지 확인해봐야함
  173.                                 json["stock_time"] = getCurrentTime2().ToString();
  174.                                 json["stock_condition_name"] = conver_utf8(조건식이름);
  175.                                 //json["stock_condition_index"] = 조건명인덱스;
  176.                                 string jstring = json.ToString();
  177.                                 jstring = jstring.Replace(Environment.NewLine"");
  178.                                 string post_data = string.Format("sdata={0}", jstring);
  179.                                 dynamic api_result = fparent.HttpCall(post_data);
  180.                                 if (api_result == null)
  181.                                 {
  182.                                     //호출실패
  183.                                     setLog("(" + 종목명 + ") 데이터베이스 저장실패!");
  184.                                     Console.WriteLine("(" + 종목코드 + ") 데이터베이스 저장실패!");
  185.                                 }
  186.                                 else
  187.                                 {
  188.                                     //MessageBox.Show("저장되었습니다.");
  189.                                     setLog("(" + 종목명 + ") DB SAVE OK! 전체수량:"+수량+",지금까지 체결량 = " + 체결량 + ", 방금체결량 = " + 단위체결량);
  190.                                     Console.WriteLine("(" + 종목명 + ") DB SAVE OK! 전체수량:" + 수량 + ",지금까지 체결량 = " + 체결량 + ", 방금체결량 = " + 단위체결량);
  191.  
  192.                                     //if (체결량.ToString().Equals(수량))
  193.                                     if(미체결수량 == "0")
  194.                                     {
  195.                                         매수중인데이터.Remove(종목코드);
  196.                                         setLog("(" + 종목명 + ") 매수모두완료!!!!!");
  197.  
  198.                                         리로드 = true;
  199.                                     }
  200.                                 }
  201.                             }
  202.                         }
  203.                     }
  204.                     /*
  205.                     else if(기준금액.ContainsKey(종목코드)) //영웅문에서 강제로 매도를 할 경우, 디비 업데이트 처리 해주자.
  206.                     {
  207.                         리로드 = true;
  208.  
  209.                         //set_buy_list_power_remove 에서 알아서 처리할거임, 그래서 아래코드 주석처리함
  210.                         //string 종목명_임시 = fparent.axKHOpenAPI1.GetMasterCodeName(종목코드);
  211.                         //구매리스트[종목코드].Clear(); //매수 상황 보도판에서 제거
  212.  
  213.                         string log_string = "영웅문에서 " + 종목명 + "(" + 종목코드 + ")를 강제로 매도했습니다. 단위체결량 = " + 단위체결량;
  214.                         setLog(log_string);
  215.                         Console.WriteLine(log_string);
  216.  
  217.                         log_string = "매수수량합계 = " + 매수수량합계[종목코드] + ", 체결량 = " + 체결량 + ", 미체결수량 = " + 미체결수량 + ", 주문상태 = " + 주문상태;
  218.                         setLog(log_string);
  219.                         Console.WriteLine(log_string);
  220.  
  221.                         //if (매수수량합계[종목코드] >= 체결량)
  222.                         //if(미체결수량.Equals("0"))
  223.                         if (미체결수량 == "0")
  224.                         {
  225.                             log_string = "영웅문 강제매각 완료!";
  226.                             setLog(log_string);
  227.                             Console.WriteLine(log_string);
  228.  
  229.                             JObject json2 = fparent.get_json_obj();
  230.                             json2["type"] = "set_sell_end";
  231.                             json2["stock_code"] = 종목코드;
  232.                             json2["sell_price"] = 체결가.ToString();
  233.                             string jstring2 = json2.ToString();
  234.                             jstring2 = jstring2.Replace(Environment.NewLine"");
  235.                             string post_data2 = string.Format("sdata={0}", jstring2);
  236.                             dynamic api_result2 = fparent.HttpCall(post_data2);
  237.                             if (api_result2 == null)
  238.                             {
  239.                                 log_string = "영웅문에서 " + 종목명 + "(" + 종목코드 + ")를 강제로 모두매도완료 디비저장실패~";
  240.                                 setLog(log_string);
  241.                                 Console.WriteLine(log_string);
  242.                             }
  243.                             else
  244.                             {
  245.                                 기준금액.Remove(종목코드);
  246.                                 매도중인데이터.Remove(종목코드); //다시 매도가능하게 제거
  247.                                 구매리스트.Remove(종목코드);
  248.                                 최저가데이터.Remove(종목코드);//최저가삭제(혹시나 또 매수할수도 있으니깐)
  249.  
  250.                                 log_string = "영웅문에서 " + 종목명 + "(" + 종목코드 + ")를 강제로 모두매도완료 디비저장성공!!!!!";
  251.                                 setLog(log_string);
  252.                                 Console.WriteLine(log_string);
  253.                             }
  254.                         }
  255.                     }
  256.                     */
  257.  
  258.                     if(리로드)
  259.                     {
  260.                         refresh_buylist();
  261.                         requestProfitInfo();
  262.                         requestAccountInfo();
  263.                     }
  264.                 }
  265.             }
  266.         }

이 게시글은
https://webschool.kr/?v=board_view&board_key=34&idx=571
에서 작성한 글입니다. 소스코드의 경우 해당 블로그에서 이뿌게 노출이 되지 않을 수 있사오니, 위 링크로 들어오셔서 보시길 바랍니다.

반응형