📘 영웅문4 OpenAPI + C# 완전 정복 - 2단계: 실시간 시세 수신 + 이벤트 처리 구조 만들기

반응형

OpenAPI + C# 완전 정복 - 2단계: 실시간 시세 수신 + 이벤트 처리 구조 만들기

✅ 왜 실시간 시세 수신이 중요한가요?

  • 자동매매 시스템에서 실시간 체결가/호가 정보를 수신하지 못하면
    전략 실행의 정확도와 타이밍이 무너집니다.
  • 키움 OpenAPI는 이벤트 기반 비동기 구조이므로
    반드시 이벤트 핸들러 구현이 필요합니다.

🧩 STEP 1. 실시간 시세 등록 (SetRealReg)

🔹 실시간 등록 함수

C#

axKHOpenAPI1.SetRealReg("1000", "005930", "10;11;12;13;15", "0");
인자 설명
"1000" 화면번호 (임의의 문자열)
"005930" 종목코드 (삼성전자)
"10;11;12..." 실시간 필드 (현재가, 전일대비, 등락률 등)
"0" 기존 등록 여부 (0: 추가 등록, 1: 기존 화면번호 대체)

🔔 STEP 2. 실시간 데이터 수신 이벤트 구현

🔹 이벤트 핸들러 등록

C#

private void axKHOpenAPI1_OnReceiveRealData(object sender, _DKHOpenAPIEvents_OnReceiveRealDataEvent e)
{
    if (e.sRealType == "주식체결")
    {
        string currentPrice = axKHOpenAPI1.GetCommRealData(e.sRealKey, 10).Trim();
        string volume = axKHOpenAPI1.GetCommRealData(e.sRealKey, 15).Trim();
        listBox1.Items.Add($"[실시간 체결] 현재가: {currentPrice} / 체결량: {volume}");
    }
}

💬 주요 실시간 필드 코드 (일부)

코드 설명
10 현재가
11 전일대비
12 등락률
13 누적거래량
15 체결량

전체 필드는 키움 OpenAPI 실시간 필드표에서 확인 가능


🧠 STEP 3. 실시간 등록 해제 및 변경

  • 다른 종목으로 실시간 추적 전환 시 SetRealRemove() 또는 SetRealReg() 사용
C#

axKHOpenAPI1.SetRealRemove("ALL", "ALL");  // 전체 해제

📦 실전 예제: 버튼 하나로 실시간 시작하기

C#

private void btnWatch_Click(object sender, EventArgs e)
{
    string code = txtCode.Text.Trim(); // 종목코드 입력
    axKHOpenAPI1.SetRealReg("1001", code, "10;11;12;13;15", "0");
    listBox1.Items.Add($"▶ 실시간 등록: {code}");
}

🔁 고급 구조: 다중 종목 실시간 감시

  • ;로 종목코드를 나열할 수 없음
    여러 번 SetRealReg() 호출해야 다중 종목 감시 가능
C#

string[] codes = { "005930", "000660", "035420" };
int screenNo = 1000;
foreach (var code in codes)
{
    axKHOpenAPI1.SetRealReg(screenNo.ToString(), code, "10;11;12", "0");
    screenNo++;
}

🧪 실시간 체결 출력 예시 (ListBox 출력)

[실시간 체결] 현재가: 78,400 / 체결량: 1,200
[실시간 체결] 현재가: 78,500 / 체결량: 800

📷 실시간 시세 흐름도

버튼 클릭 → SetRealReg → 서버로부터 실시간 데이터 → 이벤트 핸들러(OnReceiveRealData) → 화면 출력
반응형