본문 바로가기
자동매매 강의

3강 C# WinForms로 키움증권 OpenAPI 연결하기

by 투자실험실 2025. 3. 10.

이 강의에서는 C# 기반의 WinForms 또는 WPF를 사용하여 키움증권의 OpenAPI를 활용한 자동매매 프로그램을 만드는 방법을 단계별로 상세히 설명합니다.

 

1. 프로젝트 생성

먼저 Visual Studio에서 새로운 C# 프로젝트를 생성합니다. Windows Forms 앱(.NET Framework)를 선택합니다.

새 프로젝트 만들기에서 윈폼 선택

프로젝트 이름(KiwoomExample)과 솔루션 이름을 기입하고 프레임워크는 .NET Framework 4.7.2를 선택하고, 만들기를 클릭합니다.

 

2. COM 추가하기

도구 - 도구 상자 항목 선택을 클릭합니다.

도구 상자 항목 선택

COM 구성 요소 탭으로 넘어가서 이전에 설치한 키움API(KHOpenAPI Control)를 선택 후 확인을 누릅니다.

- 만약 존재하지 않는 경우 [찾아보기] 버튼을 클릭하여 C:\OpenAPI\khopenapi.ocx를 등록합니다.

COM 구성요소 추가

 

3. Form(Control)과 이벤트 바인딩

도구 상자 탭에서 KHOpenAPI Control을 드래그 앤 드롭하여 Control에 추가합니다.

윈폼에 키움API 넣기

이벤트 바인딩

주요 이벤트는 다음과 같습니다.

  • OnEventConnect
    • 로그인 처리 이벤트
    • 인자형식: AxKHOpenAPILib._DKHOpenAPIEvents_OnEventConnectEvent
  • OnReceiveTrData
    • TR 요청 데이터 수신 이벤트
    • 인자형식: AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent
  • OnReceiveRealData
    • 실시간 데이터 수신 이벤트
    • 인자형식: AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveRealDataEvent
  • OnReceiveChejanData
    • 주문처리 실시간 수신 이벤트
    • 인자형식: AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveChejanDataEvent
  • OnReceiveMsg
    • 서버 메시지 수신 이벤트
    • 인자형식: AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveMsgEvent

각각의 이벤트에 이벤트 핸들러를 연결해주고, 그에 적합한 인자들을 설정해줍니다.

 

예시코드

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // 이벤트 바인딩
            axKHOpenAPI1.OnEventConnect += AxKHOpenAPI1_OnEventConnect;
            axKHOpenAPI1.OnReceiveTrData += AxKHOpenAPI1_OnReceiveTrData;
            axKHOpenAPI1.OnReceiveRealData += AxKHOpenAPI1_OnReceiveRealData;
            axKHOpenAPI1.OnReceiveChejanData += AxKHOpenAPI1_OnReceiveChejanData;
            axKHOpenAPI1.OnReceiveMsg += AxKHOpenAPI1_OnReceiveMsg;

            int loginResult = axKHOpenAPI1.CommConnect();            
        }

        private void AxKHOpenAPI1_OnEventConnect(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnEventConnectEvent e)
        {
            // 로그인 처리 이벤트
        }

        private void AxKHOpenAPI1_OnReceiveTrData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e)
        {
            // TR 요청 데이터 수신 이벤트
        }

        private void AxKHOpenAPI1_OnReceiveRealData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveRealDataEvent e)
        {
            // 실시간 데이터 수신 이벤트
        }

        private void AxKHOpenAPI1_OnReceiveChejanData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveChejanDataEvent e)
        {
            // 주문처리 실시간 수신 이벤트
        }

        private void AxKHOpenAPI1_OnReceiveMsg(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveMsgEvent e)
        {
            // 계좌관련 조회요청에 대한 서버 메시지 수신 이벤트
        }
    }

 

4. 로그인 및 연결 테스트

키움 OpenAPI에 로그인하고 연결을 테스트하는 방법입니다.

로그인 요청

로그인 요청은 CommConnect() 메소드를 호출하여 진행합니다.

// 로그인 요청
int loginResult = axKHOpenAPI1.CommConnect();

 

연결 상태 확인

로그인 상태를 확인하려면 GetConnectState()를 사용합니다.

// 연결 상태 확인
if (axKHOpenAPI1.GetConnectState() == 1)
{
    MessageBox.Show("연결 성공!");
}
else
{
    MessageBox.Show("연결 실패!");
}

 

로그인 성공 이벤트 처리

로그인 결과는 OnEventConnect 이벤트를 통해 전달됩니다.

private void AxKHOpenAPI1_OnEventConnect(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnEventConnectEvent e)
{
    if (e.nErrCode == 0)
    {
    	MessageBox.Show("로그인 성공!");
    }
    else
    {
        MessageBox.Show("로그인 실패: " + e.nErrCode);
    }
}

 

이 코드를 통해 로그인 성공 여부를 확인할 수 있습니다.

 

5. 예제 프로그램 코드

지금까지 설정한 내용을 테스트하여 키움증권 서버와 연결이 잘 되는지 확인해보세요. 연결이 정상적으로 이루어지면 자동매매 로직을 구현할 수 있는 환경이 준비된 것입니다.

아래는 지금까지 작성한 예시 소스코드 입니다.

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // 이벤트 바인딩
            axKHOpenAPI1.OnEventConnect += AxKHOpenAPI1_OnEventConnect;
            axKHOpenAPI1.OnReceiveTrData += AxKHOpenAPI1_OnReceiveTrData;
            axKHOpenAPI1.OnReceiveRealData += AxKHOpenAPI1_OnReceiveRealData;
            axKHOpenAPI1.OnReceiveChejanData += AxKHOpenAPI1_OnReceiveChejanData;
            axKHOpenAPI1.OnReceiveMsg += AxKHOpenAPI1_OnReceiveMsg;

            int loginResult = axKHOpenAPI1.CommConnect();            
        }

        private void AxKHOpenAPI1_OnEventConnect(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnEventConnectEvent e)
        {
            // 로그인 처리 이벤트
            if (e.nErrCode == 0)
            {
                MessageBox.Show("로그인 성공!");
            }
            else
            {
                MessageBox.Show("로그인 실패: " + e.nErrCode);
            }


            if (axKHOpenAPI1.GetConnectState() == 1)
            {
                MessageBox.Show("연결 성공!");
            }
            else
            {
                MessageBox.Show("연결 실패!");
            }
        }

        private void AxKHOpenAPI1_OnReceiveTrData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e)
        {
            // TR 요청 데이터 수신 이벤트
        }

        private void AxKHOpenAPI1_OnReceiveRealData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveRealDataEvent e)
        {
            // 실시간 데이터 수신 이벤트
        }

        private void AxKHOpenAPI1_OnReceiveChejanData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveChejanDataEvent e)
        {
            // 주문처리 실시간 수신 이벤트
        }

        private void AxKHOpenAPI1_OnReceiveMsg(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveMsgEvent e)
        {
            // 계좌관련 조회요청에 대한 서버 메시지 수신 이벤트
        }
    }

 

읽어볼만한 글