📘 프로젝트 명:Excel VBA + 11단계: 실거래 API 연동 또는 실전매매 테스트 모드 구축하기 – 조건매매 자동화를 실전에 연결하는 방법(OpenAPI)

반응형

🔍 개요

조건매매 전략을 Excel VBA로 자동화했다면,
마지막 단계는 실제 계좌와 연동된 API 시스템을 통해 전략을 자동 주문으로 전환하는 것입니다.

이 단계에서는 다음 2가지 방식 중 원하는 방식으로 확장할 수 있습니다:

  • 실거래 API 연동 (키움 OpenAPI 등)
  • 실전매매 테스트 모드 (가상 주문 시스템)

✅ 실거래 API vs 테스트 모드 차이

항목 실거래 API 연동 실전 테스트 모
실제 주문 체결 ✅ 예 (실제 계좌 사용) ❌ 아님 (가상으로 처리)
필요 조건 API 인증, 보안 설정, 계좌번호 내부 함수 + 조건 감지만 필요
위험성 실계좌 자산이 움직임 ⚠️ 테스트 전용, 안전함 ✅
활용 목적 실전 투자 자동화 전략 점검, 시뮬레이션 기록용

🧠 실거래 API 연동 (키움증권 OpenAPI+ 사용)

✅ 1. 준비 사항

  • 키움증권 HTS 설치 (영웅문4)
  • OpenAPI+ (32bit 전용) 설치
  • API 신청 승인 (계좌 인증 필요)
  • Visual Basic 또는 Python에서 연동 가능

✅ 2. 주문 실행 핵심 함수 (VBA 예시)

vba(OrderModule.bas) <== 신규모듈

Function 키움_주문_실행(종목코드 As String, 수량 As Long, 가격 As Long, 매수여부 As Boolean)
    Dim ocx As Object
    Set ocx = CreateObject("KHOpenAPI.KHOpenAPICtrl.1") ' 영웅문 API 컨트롤
    
    Dim 주문유형 As String
    If 매수여부 Then
        주문유형 = "2" ' 신규매수
    Else
        주문유형 = "1" ' 신규매도
    End If

    Dim result As Long
    result = ocx.SendOrder("VBA자동주문", "1000", "계좌번호", 주문유형, 종목코드, 수량, 가격, "00", "")
    
    If result = 0 Then
        MsgBox "✅ 주문 전송 성공!"
    Else
        MsgBox "❌ 주문 전송 실패: 코드 " & result
    End If
End Function

✅ 3. 조건매매 판단 후 주문 실행 연결

vba(OrderModule.bas)

If signalText Like "*매수 시그널*" Then
    키움_주문_실행 "005930", 10, 80000, True
ElseIf signalText Like "*매도 시그널*" Then
    키움_주문_실행 "005930", 10, 0, False ' 시장가 매도
End If

🧪 실전매매 테스트 모드 (주문 시뮬레이션)

실계좌가 없어도 다음처럼 가상 주문을 실행한 것처럼 기록만 남기는 테스트 모드도 가능합니다.

✅ 예시 코드 (테스트용 주문 기록)

vba(OrderModule.bas)

Sub 가상주문_기록(r As Long, 매수여부 As Boolean)
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
    
    If 매수여부 Then
        ws.Cells(r, 55).Value = "📥 가상매수"
        ws.Cells(r, 56).Value = ws.Cells(r, 5).Value ' 매수가
    Else
        ws.Cells(r, 55).Value = "📤 가상매도"
        ws.Cells(r, 56).Value = ws.Cells(r, 5).Value ' 매도가
    End If
End Sub

✅ 조건 발생 시 호출

vba(OrderModule.bas)

If signalText Like "*매수 시그널*" Then
    가상주문_기록 r, True
ElseIf signalText Like "*매도 시그널*" Then
    가상주문_기록 r, False
End If

✅ 실전 연동 시 주의사항

항목 설명
✅ 주문 제한시간 08:30~15:30 사이에만 주문 가능
✅ 서버 오류 대비 주문 응답 실패 시 재시도 로직 필요
✅ 자산 초과 방지 현재 보유 수량/금액 체크 후 실행 권장
✅ 모의투자 계좌 테스트 키움 모의투자 계좌를 통해 먼저 테스트 강력 권장

✅ 결론

조건매매 시스템의 마지막 단계는 실제 매매와의 연결입니다.
실거래 API와 직접 연동하거나,
보다 안전하게 시작하고 싶다면 가상 주문 테스트 모드로 전략 검증을 이어갈 수 있습니다.

Excel VBA에서도 매우 간단한 함수 호출 방식으로 자동주문을 구현할 수 있으며,
실시간 시그널 감지 시스템과 결합하면 완전한 실전 조건매매 자동화 시스템이 완성됩니다.

 


✅ 결론: 모듈 구조 분리 기준

모듈이름 역할 이 단계 포함 여부
Module1 실시간 기록, 조건매매 시그널 감지, 매매 판단 및 실행 ✔️ 실전 주문 함수는 여기 포함 가능
RiskModule 손실 제한, 횟수 제한, 시간 제한 등 ❌ 포함하지 말 것
ReportModule 전략 리포트 생성, 수익률 통계
BacktestModule 리플레이, 기간별 백테스트
(선택) OrderModule 주문 실행 함수만 별도로 분리하고 싶을 때 깔끔한 구조를 원한다면 추천

📌 실전 적용에 따라 선택 기준

🅰 간단히 하고 싶다면:

  • Module1 에 아래 함수들을 그대로 추가해도 충분합니다:
    • 키움_주문_실행()
    • 가상주문_기록()
    • 조건 감지 시 주문 연결 로직

✅ 예:

vba(OrderModule.bas)

If signalText Like "*매수 시그널*" Then
    키움_주문_실행 "005930", 10, 80000, True

 


🅱 기능별로 철저히 모듈을 분리하고 싶다면:

  • OrderModule.bas 이라는 새 모듈을 만들고, 아래 항목들을 넣으세요:

✅ 넣는 함수 예시:

함수명설명
키움_주문_실행() 실전 주문 실행 (API 호출)
가상주문_기록() 테스트 모드 주문 기록
실전_매매_조건검사() 자산/시간 등 추가 체크가 필요한 경우

🔁 조건매매_매수매도판단(r) 내 사용 예시

이 함수는 여전히 Module1에 있고, 그 안에서 주문 함수만 호출하는 구조가 가장 일반적입니다:

vba(OrderModule.bas)

Sub 조건매매_매수매도판단(r As Long)
    ...
    If signalText Like "*매수 시그널*" Then
        Call 키움_주문_실행("005930", 10, 0, True) ' 실전
        ' 또는
        Call 가상주문_기록(r, True) ' 테스트 모드
    End If
End Sub

✅ 정리

케이스권장 모듈 위치
실시간 로직과 같이 쓰고 싶을 때 ✅ Module1
주문 관련 기능만 따로 모으고 싶을 때 ✅ OrderModule

✅ 키움 OpenAPI+에서 선물/옵션 주문용 함수

vba(OrderModule.bas)

SendOrderFO(
    sRQName As String,        ' 사용자 구분명
    sScreenNo As String,      ' 화면번호
    sAccNo As String,         ' 계좌번호
    sCode As String,          ' 종목코드 (예: 101W6000)
    lOrdKind As Long,         ' 주문종류 (1:신규매수, 2:신규매도, 3:매도청산, 4:매수청산)
    lQty As Long,             ' 주문수량
    sPrice As String,         ' 주문가격 (시장가일 경우 "0")
    sHogaGb As String,        ' 호가유형 (00:지정가, 03:시장가 등)
    sOrgOrderNo As String     ' 원주문번호 (정정/취소용)
) As Long

✅ VBA용 선물 주문 함수 예시 (신규 주문 전용)

vba(OrderModule.bas)

Function 선물_주문_실행(종목코드 As String, 수량 As Long, 가격 As Long, 주문종류 As String)
    ' 주문종류: "매수", "매도", "매수청산", "매도청산"
    
    Dim ocx As Object
    Set ocx = CreateObject("KHOpenAPI.KHOpenAPICtrl.1")

    Dim 주문코드 As Long
    Select Case 주문종류
        Case "매수": 주문코드 = 1
        Case "매도": 주문코드 = 2
        Case "매도청산": 주문코드 = 3
        Case "매수청산": 주문코드 = 4
        Case Else
            MsgBox "❌ 잘못된 주문종류입니다. (매수/매도/청산)", vbCritical
            Exit Function
    End Select

    Dim 가격형식 As String
    If 가격 = 0 Then
        가격형식 = "0"
    Else
        가격형식 = CStr(가격)
    End If

    Dim result As Long
    result = ocx.SendOrderFO("선물주문", "7000", "계좌번호", 종목코드, 주문코드, 수량, 가격형식, "03", "")

    If result = 0 Then
        MsgBox "✅ 선물 주문 전송 성공!"
    Else
        MsgBox "❌ 선물 주문 실패! 오류 코드: " & result
    End If
End Function

✅ 조건 시그널 발생 시 연결 예시 (매수/매도)

vba(OrderModule.bas)

If signalText Like "*매수 시그널*" Then
    Call 선물_주문_실행("101W6000", 1, 0, "매수") ' 시장가 신규매수
ElseIf signalText Like "*매도 시그널*" Then
    Call 선물_주문_실행("101W6000", 1, 0, "매도") ' 시장가 신규매도
End If

🔐 주의할 점

항목 설명
종목코드 선물 종목코드 사용 (예: "101W6000": 코스피200 선물 최근월물)
계좌번호 실거래용 선물 계좌 (번호 형식: 5206xxxx-xx)
시장가 호가코드 "03" (선물 시장가 지정)
실제 주문 가능 시간 08:45 ~ 15:45 (또는 상품별 다름)

✅ 정리된 연결 코드

vba(OrderModule.bas)

Sub 조건매매_매수매도판단(r As Long)
    Dim signalText As String
    signalText = ws.Cells(r, 50).Value

    If signalText Like "*매수 시그널*" Then
        Call 선물_주문_실행("101W6000", 1, 0, "매수")
    ElseIf signalText Like "*매도 시그널*" Then
        Call 선물_주문_실행("101W6000", 1, 0, "매도")
    End If
End Sub

📝  적용해 보시고 모르는것 있으시면 댓글 달아주세요. 확인해서 알려드릴께요 !!! 

반응형