반응형
🔍 개요
아무리 수익성 있는 전략이라도 리스크 관리가 없다면 모든 수익은 단 한 번의 손실로 무너질 수 있습니다.
조건매매 자동화 시스템에서 리스크 관리는 단순한 보조 기능이 아니라, 수익을 보전하고 계좌를 지키기 위한 핵심 전략입니다.
이 단계에서는 Excel VBA 기반 자동매매 시스템에 다음과 같은 리스크 제어 로직을 추가하는 방법을 다룹니다:
✅ 주요 리스크 관리 항목
항목 | 설명 |
✅ 일간 최대 손실 제한 | 하루 -5% 이상 손실 시 자동 매매 중지 |
✅ 연속 손실 제한 | 손실이 연속 3회 발생하면 휴식 또는 정지 |
✅ 일일 거래 횟수 제한 | 하루 최대 거래 10회까지만 허용 |
✅ 거래 가능 시간 제한 | 장 중 특정 시간만 거래 (예: 09:10~15:20) |
📦 필수 데이터 구조 (전제조건)
열 번호내용
51열 | 매매 상태 (📥 매수, 📤 매도(익절), 📤 매도(손절) 등) |
54열 | 수익률 (거래당 수익률 %, 소수로 저장됨) |
1열 | 날짜 ('2025/04/20 등) |
✅ 왜 RiskModule로 따로 분리해야 하나요?
이유 | 설명 |
📦 기능 역할 분리 | Module1은 실시간 매매/시그널, ReportModule은 분석, RiskModule은 제어 기능 |
🛠 유지보수 쉬움 | 리스크 로직만 수정하거나 ON/OFF 하고 싶을 때 빠르게 찾고 제어 가능 |
🚧 에러 범위 최소화 | 실시간 함수와 섞이면 디버깅이 어려워질 수 있음 |
🔄 확장성 확보 | 향후 거래 제한 시간, 계좌 상태 검사, 전략 차단 스위치 등 추가 로직 삽입이 용이 |
🧱 추천 모듈 구조 예시
모듈이름 | 용도 |
Module1 | 실시간 기록, 조건매매 시그널, 기술지표 계산 (1~5단계) |
ReportModule | 전략 리포트 생성, 전략별 성과 분석 (6~7단계) |
RiskModule | 리스크 관리 (일간 손절, 연속 손실, 거래 제한 등 – 8단계) ✅ ← 여기에 넣으세요 |
✅ 작업 절차 요약
- Alt + F11 → VBA 편집기 열기
- 삽입 → 모듈 클릭 → Module3 생성됨
- 이름을 RiskModule로 변경 (좌측 모듈 이름 우클릭 → 이름 바꾸기)
- 아래 함수들 붙여넣기:
- 일간손실초과()
- 연속손실초과()
- 일일거래횟수초과()
- (선택) 시간제한확인()
🧠 VBA 리스크 관리 코드 – 실전 적용 예제
✅ 1. 일간 누적 손실 체크 & 자동 중단
vba(RiskModule.bas) <= 새로 생성함.
Function 일간손실초과() As Boolean
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim today As String: today = Format(Date, "yyyy/mm/dd")
Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Dim sumProfit As Double, r As Long
For r = 7 To lastRow
If ws.Cells(r, 1).Value = "'" & today Then
If IsNumeric(ws.Cells(r, 54).Value) Then
sumProfit = sumProfit + ws.Cells(r, 54).Value
End If
End If
Next r
If sumProfit < -0.05 Then ' -5% 이상 손실 시
MsgBox "❗일간 최대 손실 초과. 자동 중단됩니다.", vbCritical
일간손실초과 = True
Else
일간손실초과 = False
End If
End Function
✅ 2. 연속 손실 N회 체크 (예: 3회)
vba(RiskModule.bas)
Function 연속손실초과() As Boolean
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim r As Long: r = ws.Cells(ws.Rows.Count, 54).End(xlUp).Row
Dim count As Long: count = 0
Dim i As Long
For i = r To 7 Step -1
If ws.Cells(i, 51).Value Like "*매도*" Then
If ws.Cells(i, 54).Value < 0 Then
count = count + 1
If count >= 3 Then
MsgBox "❗연속 3회 손실 발생. 전략 정지!", vbExclamation
연속손실초과 = True
Exit Function
End If
Else
Exit For ' 손실이 아닌 경우 → 연속 끊김
End If
End If
Next i
연속손실초과 = False
End Function
✅ 3. 일일 거래 횟수 제한 (예: 10회)
vba(RiskModule.bas)
Function 일일거래횟수초과() As Boolean
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim today As String: today = Format(Date, "yyyy/mm/dd")
Dim r As Long, count As Long: count = 0
For r = 7 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
If ws.Cells(r, 1).Value = "'" & today Then
If ws.Cells(r, 51).Value Like "*매도*" Then
count = count + 1
End If
End If
Next r
If count >= 10 Then
MsgBox "❗일일 거래 횟수 초과. 전략 일시 중단!", vbInformation
일일거래횟수초과 = True
Else
일일거래횟수초과 = False
End If
End Function
🔁 리스크 제어 조건
vba(Module1.bas)
If 일간손실초과() Or 연속손실초과() Or 일일거래횟수초과() Then
isRunning = False
Exit Sub
End If
🔁 기록저장() 함수에 적용된코드(리스크 제어 조건)
vba(Module1.bas)
Sub 기록저장()
' 데이터 수집 및 저장
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim r As Long: r = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
ws.Cells(r, 1).Value = Format(Now, "yyyy/mm/dd")
ws.Cells(r, 2).Value = Format(Now, "hh:nn:ss")
' ... 나머지 실시간 데이터 저장
' 📍 ✅ 리스크 검사 위치: 여기 삽입!
If 일간손실초과() Or 연속손실초과() Or 일일거래횟수초과() Then
isRunning = False
MsgBox "📛 리스크 조건에 의해 자동 종료되었습니다.", vbCritical
Exit Sub
End If
' 기술지표 계산
' ...
' 시그널 감지
조건매매시그널_감지 r
' 매매 판단
조건매매_매수매도판단 r
End Sub
✅ 흐름 요약
단계 | 설명 |
1단계 | 실시간 DDE 값 저장 (ws.Cells...) |
✅ 2단계 | 리스크 검사 후 즉시 종료 여부 판단 |
3단계 | MA, BB 등 기술지표 계산 |
4단계 | 시그널 감지 (조건매매시그널_감지) |
5단계 | 매매 실행 판단 (조건매매_매수매도판단) |
🛠 삽입에 대한 추가 팁
- 이 위치에 넣으면 실시간 매매 전에 항상 리스크를 체크하게 됩니다.
- 조건을 만족하면 Exit Sub으로 해당 기록을 저장만 하고, 매매 판단은 건너뜁니다.
- 장 종료 검사(Time 조건) 와도 별도로 병행할 수 있어요.
✅ 조건매매_매수매도판단()에 넣는 건 어떤가요?
위치 | 추천여부 | 설명 |
기록저장() 내 | ✅ 매우 추천 | 실시간 루틴 전체 중단에 적합 |
조건매매_매수매도판단() 내 | ⚠️ 부분 사용은 OK | "직전 손실 후 바로 다음 매매" 같은 미세제어 시 사용 가능 |
✅리스크 제어 조건-결론
리스크 제어 코드는 반드시 기록저장() 함수 내
✅ "기술지표 계산 및 매매 시그널 감지 전에"
삽입해야 시스템이 신속하게 위험을 차단할 수 있습니다.
📍 응용 확장: 거래 가능 시간 제한(선택가능)
vba(Module1.bas)
If Time < TimeSerial(9, 10, 0) Or Time > TimeSerial(15, 20, 0) Then
Exit Sub ' 거래 불가 시간대
End If
📍기록저장() 함수에 적용된코드(응용 확장: 거래 가능 시간 제한)
vba(Module1.bas)
Sub 기록저장()
' 거래 가능 시간 확인 (예: 09:10~15:20 사이만 허용)
If Time < TimeSerial(9, 10, 0) Or Time > TimeSerial(15, 20, 0) Then
Exit Sub ' 거래 불가 시간대엔 저장 및 매매 중지
End If
' 기존 데이터 저장
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim r As Long: r = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
' 데이터 저장
ws.Cells(r, 1).Value = Format(Now, "yyyy/mm/dd")
ws.Cells(r, 2).Value = Format(Now, "hh:nn:ss")
' ✅ 리스크 검사
If 일간손실초과() Or 연속손실초과() Or 일일거래횟수초과() Then
isRunning = False
Exit Sub
End If
' 기술지표 계산...
' 조건매매시그널_감지 r
' 조건매매_매수매도판단 r
End Sub
✅ 왜 맨 앞줄이 좋은가요?
이유 | 설명 |
💡 시간 외 거래 방지 | 장 시작 전(예: 08:45) 또는 마감 후(15:45) 자동 차단 |
⚙️ 불필요한 저장 방지 | 시간 외에는 행도 추가하지 않음 (r 계산도 안 함) |
🔒 실전 연동 시 필수 | 실거래 API는 정해진 시간 외 주문 시 에러 발생 위험 있음 |
✅ 필요 시 설정 범위 변경 가능
시간 | 구간코드 예시 |
08:59~15:20 | Time < TimeSerial(8, 59, 0) Or Time > TimeSerial(15, 20, 0) |
점심시간 제외 | Or (Time > TimeSerial(11, 50, 0) And Time < TimeSerial(13, 0, 0)) 등도 추가 가능 |
✅거래 가능 시간 제한-결론
📍 거래 가능 시간 제한 코드는 기록저장() 함수 가장 상단에 삽입하세요.
이로써 시간 외 기록 + 매매 시그널 실행을 원천 차단하여 시스템 안정성이 대폭 향상됩니다.
📝 적용해 보시고 모르는것 있으시면 댓글 달아주세요. 확인해서 알려드릴께요 !!!
반응형