이전 글
투자 자동화를 위한 첫 걸음, EA 연결
https://www.gpters.org/wealth/post/first-step-automating-investments-su6oAUsFaSXi9oa
투자 자동화를 위한 두번째 걸음, 나만의 전략으로 백테스트 구현까지
https://www.gpters.org/wealth/post/tuja-jadonghwareul-wihan-dubeonjjae-geoleum-demogyejwaro-namanyi-hBwoY154jB5GNxh
Copy Trading 시스템이란?
하나의 완벽한 전략(Leader)을 기계적인 시스템(Middleware)을 통해 수많은 계좌(Follower)에 비율대로 복제하여 수익을 극대화하는 기술
1. 카피트레이딩의 핵심 이점 (Why?)
무한한 확장성 (Scalability): 사람의 손은 두 개뿐이라 동시에 여러 계좌를 컨트롤할 수 없습니다. 카피트레이딩 시스템을 쓰면 '단 한 번의 클릭'으로 10개, 100개의 계좌를 동시에 운용할 수 있어 수익 규모(Volume)를 극대화할 수 있습니다.
감정의 배제 (Discipline): 팔로워(B계좌)는 기계적으로 리더를 따라 하므로, 공포나 탐욕에 의한 뇌동매매를 원천 차단합니다. 리더의 전략을 그대로 이행합니다.
리스크 자동 조절 (Smart Money Management): 가장 중요한 기능입니다. 리더가 1억 원으로 1랏을 샀다고 해서, 1천만 원 가진 팔로워가 1랏을 사면 파산합니다. 시스템은 '잔고 비율'에 맞춰 자동으로 계약수(Lot)를 줄여서 진입시켜 줍니다.
2. 시스템 구조의 이해 (How?)
카피트레이딩 시스템은 크게 [발신 - 중계 - 수신] 3단계로 이루어집니다.
Leader (발신자 / 신호 생성):
트레이더가 실제로 매매하는 계좌입니다.
매수/매도/청산 행위가 발생하면 즉시 "나 지금 뭐 했어!"라고 신호(Signal)를 밖으로 보냅니다.
Middleware (중계자 / 데이터베이스):
우리가 설계한 '구글 시트'나 '서버'가 이 역할을 합니다.
리더의 신호를 받아 기록하고, 팔로워들이 볼 수 있도록 '게시판' 역할을 합니다. (중앙 통제실)
Follower (수신자 / 주문 실행):
복사할 계좌들입니다.
중계자를 감시하다가 신호가 바뀌면, "내 잔고는 리더의 1/10이니까, 물량도 1/10만 사야지"라고 계산한 뒤 주문을 넣습니다.
어떤 원리로 진행되는지 큰 틀을 잡아 이해하였으며, 이제 AI 에게 프롬프트를 제공하여 Leader EA, Follower EA 를 mq4 파일을 생성하고 컴파일까지 완료해줍시다!
metatrader 4기반으로 자동매매 전략을 만들어야 합니다.
##목표를 구현해주세요.
##목표:
1. A(Leader) 계좌의 포지션 변화를 감지하여 OPEN / HEARTBEAT / FLAT 신호를 전달
2. B(Follower) 계좌(복수, \\\\~10개)는 잔고 비례 + 리더 lot 배수 규칙으로 자동으로 실시간 복사하는 작업을 해야합니다.
3. 이 때, webhook과 mql4 코드, n8n등을 사용하려고 하는데 클로드 코드 기반 프로그램이 더 쉽다면 그렇게 해도됩니다.
##맥락:
현재는 인간이 수동으로 A(leader) 계좌에 포지션이 들어오면 스프레드시트에서 통화쌍별 lot 사이즈를 계산한 후 일일이 입력하고 있는 상황입니다.\\n\\n
##조건 \\n\\n
1. A계좌의 잔고와 B계좌의 잔고에 비례해서 계약수를 늘릴 것\\n\\n
2. 복사하려는 거래가 신규진입이 아닌 이전에 진입되어있던 통화쌍일 경우, 이전 진입 계약수 대비 현재 계약수에 비례하여 진입할 것\\n\\n
3. A계좌에서 생긴 거래가 이미 B계좌에서 진입되어 있으면 제외할 것(Lot 비율 15% 이내 또는 시간차 120초 이내면 카피 스킵)\\n\\n
4. 이전에 A계좌에서 B계좌로 복사한 거래에 대해서만 청산할 것(동일 통화쌍이 진입되어 있어도 A계좌와 무관한 다른 거래라면 제외할 것)\\n\\n
5. 브로커별로 심볼이 다른 경우에는 ea set 변경(Prefix/Suffix 입력만으로 동작)혹은 실패 시 자동 탐색기능이 필요합니다
실제로 한번 적용해보자!
카피트레이딩 구현 시 터미널을 두개 킬려면 사진과 같이 폴더 경로를 변경하여 두번 설치하면 되는데요,
윈도우 기반으로 하게되면 로컬에서 간편하게 적용이 가능하지만, 저는 맥북에서 작업중이라 따로 Ubuntu를 설치하여 작업하는게 아닌 이상은 실행이 어려웠어요.
Ubuntu 작업시 맥북이 조금 느려질 수도 있기도 하고, 이미 제 맥북에선 다른 사이드 프로젝트 작업들을 진행하고 있었기에 저는 바로 구글 클라우드를 통해 제 맥북을 Leader로 제 서브 컴퓨터(윈도우 기반)에 Follower 로 진행하여 테스트 하려고 합니다.
구글 클라우드로 카피트레이딩 시스템 구축하기
n8n 없이 구글 클라우드(Google Cloud Platform, GCP)의 Cloud Functions(서버리스 함수)와 Google Sheets(데이터베이스 역할)만으로도 완벽하고 비용 효율적인 카피트레이딩 시스템을 구축할 수 있습니다.
이 방식을 이용하게 되면, "현재 리더의 포지션 상태를 엑셀(시트)로 눈으로 실시간 확인 가능하다는 엄청난 장점이 있어 운영/관리에 매우 유리합니다.
저는 항상 어떤 시스템을 만들때에는 전체적인 틀, 아키텍처 먼저 대략적으로나마 잡아두고 작업을 진행하는 편이에요.
구글 클라우드를 이용하여 카피트레이딩 시스템 구축하기에 앞서 아키텍처를 잡아둡시다.
아키텍처: GCP Serverless Copy Trading
Leader EA (MT4) ➔
POST요청 ➔ Cloud Function (Writer)Cloud Function (Writer) ➔ Google Sheets API ➔ 스프레드시트 업데이트 (DB)
Follower EA (MT4) ➔
GET요청 ➔ Cloud Function (Reader)Cloud Function (Reader) ➔ Google Sheets API ➔ 데이터 읽기 & 가공 ➔ Follower에게 반환
그리고 이제 구현하는데에 앞서 필요한 권한 및 설정들을 찾아보아요.
1. 준비물 (GCP 설정)
Google Cloud Console: 프로젝트 생성 및 Google Sheets API, Cloud Functions API 활성화.
Service Account (서비스 계정): 키(JSON)를 생성하고 다운로드합니다.
Google Sheet: 빈 시트를 하나 만들고, 위에서 만든 서비스 계정 이메일(
[email protected])에 '편집자' 권한으로 공유합니다.
⚠️ 잠깐! 주의사항 및 성능 최적화 (필독)
구글 시트를 DB로 쓸 때 반드시 알아야 할 현실적인 제약 사항입니다.
레이턴시 (Latency):
구글 시트 API는 응답 속도가 아주 빠르지 않습니다. (보통 읽기/쓰기에 0.5초 ~ 1.5초 소요)
결론: 초단타(Scalping)에는 부적합하지만, 스윙이나 데이 트레이딩 용도로는 충분합니다.
1~2초 늦게 진입해도 괜찮은 전략이어야 합니다.
API 할당량 (Quota):
구글 시트 API는 분당 요청 제한(약 60회/분)이 있습니다.
해결책:
Leader는 상태가 변했을 때만(OnTrade) 전송하거나, 타이머를 3초 이상으로 둡니다.
Follower가 10개라면, 동시에 요청 시 제한에 걸릴 수 있습니다.
Follower들의OnTimer간격을 조금씩 다르게 설정하거나(랜덤 딜레이), Cloud Function에서 캐싱(Caching)을 구현해야 합니다.
인증 (Authentication):
위의 Cloud Function 코드는 편의상
Allow unauthenticated(공개)로 배포했다고 가정합니다.보안을 위해 MT4에서 요청할 때 헤더에
Secret-Token: mypassword123을 넣고
Python 코드 맨 앞단에서 이 토큰을 검사하는 로직을 추가하는 것이 좋습니다.
저는 앞서 카피트레이딩 전략 프롬프트를 이용하여 로컬 Python 서버 기반 copy trading 시스템이 구축되는 상태였는데요,
이를 GCP Serverless로 전환 해봅시다.
아래 스텝은 클로드 코드와 함께 진행하였습니다.
Step 1: Google Cloud Console 접속
로그인 후 우측 상단 프로젝트 선택 드롭다운 클릭
"새 프로젝트" 클릭
프로젝트 이름: copy-trading-system (원하는 이름)
조직: 없음 (개인 계정)
만들기 클릭
Step 2: 필요한 API 활성화
GCP Console에서 다음을 진행하세요:
좌측 메뉴 (햄버거 아이콘 ☰) 클릭
"API 및 서비스" → "라이브러리" 클릭
다음 API들을 검색해서 각각 "사용 설정" 클릭:
① Google Sheets API
② Cloud Functions API
③ Cloud Build API (Cloud Functions 배포에 필요)각 API를 검색 → 클릭 → "사용" 또는 "사용 설정" 버튼 클릭
Step 3: Service Account 생성
좌측 메뉴 → "IAM 및 관리자" → "서비스 계정"
상단 "서비스 계정 만들기" 클릭
다음 정보 입력:
서비스 계정 이름: copy-trading-bot
서비스 계정 ID: copy-trading-bot (자동 생성됨)
설명: Copy Trading System Service Account"만들기 및 계속하기" 클릭
역할 선택에서 "편집자" 검색 후 선택 (또는 "기본 편집자")
"계속" → "완료" 클릭
Step 4: JSON 키 다운로드
방금 만든 copy-trading-bot@... 서비스 계정을 클릭
상단 탭에서 "키" 탭 선택
"키 추가" → "새 키 만들기" 클릭
"JSON" 선택 → "만들기" 클릭
JSON 파일이 자동으로 다운로드됩니다
이 JSON 파일을 안전하게 보관하세요!
다음 형식입니다:
{
"type": "service_account",
"project_id": "copy-trading-xxxxx",
"private_key_id": "...",
"private_key": "-----BEGIN PRIVATE KEY-----\\n...",
"client_email": "[[email protected]](<mailto:[email protected]>)",
...
}
해당 JSON 파일을 프로젝트 의 config 폴더에 service-account.json 으로 수정하여 넣어줍시다.
(사진상으로는 config 폴더에 들어가있지 않지만.... 실제로는 config 에 들어가도록 파일을 이동 시켰었어요)
Step 5: Google Sheet 생성 및 권한 설정
Google Sheets 접속: https://sheets.google.com
"새 스프레드시트" 클릭 (빈 문서)
상단에서 제목을 "CopyTradingDB"로 변경
우측 상단 "공유" 버튼 클릭
사용자 추가 필드에 다음 이메일 붙여넣기:
copy-trading-bot@[사용자의 프로젝트].iam.gserviceaccount.com권한을 "편집자"로 설정
"완료" 클릭
Sheet ID 복사:
브라우저 주소창의 URL에서 Sheet ID를 복사하세요:
https://docs.google.com/spreadsheets/d/{SHEET_ID}/edit
여기까지 Sheet ID 를 입력하였으면 클로드코드가 입력한 정보를 기반으로 Cloud Functions 를 작성해줍니다.
여기까지 왔으면 생성된 파일구조는 다음과 같습니다.
copyTrading/
├── cloud-functions/
│ ├── writer/
│ │ ├── main.py ✅ Leader 신호 수신 → Google Sheets 저장
│ │ └── requirements.txt
│ ├── reader/
│ │ ├── main.py ✅ Follower 명령 조회 ← Google Sheets 읽기
│ │ └── requirements.txt
│ ├── deploy.sh ✅ 배포 스크립트 (Mac/Linux)
│ ├── deploy.bat ✅ 배포 스크립트 (Windows)
│ └── test_local.py ✅ 로컬 테스트 스크립트
├── config/
│ ├── config.json
│ └── service-account.json
배포 및 테스트
Google Cloud SDK(gcloud) 를 통해 배포하는 방법과
GCP Console에서 직접 배포하는 방법이 있습니다.
GCP Console 에서 직접 함수를 작성하여 배포를 하는 방법도 간편하지만
저는 gcloud 가 이미 설치 되어있었기 때문에 gcloud 기반으로 배포를 진행을 하려고 하는데요,
이조차도 클로드코드에게 gcloud 를 통해 배포해줘 라고 해주면 됩니다!
혹시나, gcloud 가 없는데? 라면
gcloud 를 먼저 install 하신뒤에 클로드코드에게 말하면 PATH 설정부터
우리가 그동안 입력해왔던 시트 아이디, 프로젝트 아이디를 기반으로 설정을 마쳐줘요.
📖 전체 문서
자세한 사용법과 문제 해결은 다음 파일을 참고하세요:
- copyTrading/GCP_SETUP_COMPLETE.md (방금 생성됨)
- copyTrading/README.md (기존 문서)
자세한 사용법 및 문제 해결 역시 잘 만들어주는 센스 😎
완성된 시스템 아키텍처는 다음과 같습니다.
┌─────────────────┐
│ Leader EA │ → A계좌 (리더)
│ (MT4) │
└────────┬────────┘
│ HTTPS POST
↓
┌─────────────────────────────────────┐
│ Cloud Function: Writer │ → GCP us-central1
│ copy-trading-writer │
└────────┬────────────────────────────┘
│ Google Sheets API
↓
┌─────────────────────────────────────┐
│ Google Sheets (Database) │
│ - Signals Sheet │
│ - Commands Sheet │
└────────┬────────────────────────────┘
│ Google Sheets API
↓
┌─────────────────────────────────────┐
│ Cloud Function: Reader │ → GCP us-central1
│ copy-trading-reader │
└────────┬────────────────────────────┘
│ HTTPS GET
↓
┌─────────────────┐
│ Follower EA │ → B계좌들 (팔로워 ~10개)
│ (MT4) │
└─────────────────┘
즉, 해당 구조의 핵심은
"A계좌(리더)가 매매하면 → 비서(Writer)가 엑셀(구글 시트)에 기록하고 → B계좌(팔로워)들은 그 엑셀을 수시로 확인해서 똑같이 따라 한다.”
입니다.
테스트 하기
클로드코드를 통해 배포까지 완료하였다면, GCP_SETUP_COMPLETE.md 파일을 하나 생성해주는데요,
해당 내용 안에 어떻게 테스트 하는지에 대한 사용 방법까지 뽑아줍니다.
이를 참고하여 테스트까지 진행 할 수 있습니다.
Leader EA 설정을 해봅시다.
먼저 저는 제가 작업하고 있는 맥북으로 리더를 잡을거기 때문에,
제 맥북의 MT4 에서 Leader_EA.mq4 를 컴파일 및 설치를 해줍니다.
MT4에서
Leader_EA.mq4컴파일 및 설치차트에 드래그 앤 드롭
설정 확인:
WebhookURL: https://...ScanInterval: 500 (ms)MagicNumber: 0 (모든 포지션 추적)
→ Leader EA 설정 완료!
Follower EA 설정을 해봅시다.
MT4에서
Follower_EA.mq4컴파일 및 설치차트에 드래그 앤 드롭
중요한 설정들 입력
ServerURL: https://...LeaderAccount: [A계좌 번호 입력!]PollInterval: 1000 (ms)LotMultiplier: 1.0UseBalanceRatio: true
→ 서브컴퓨터 에서의 Follower_EA 연결까지 완료!
그럼 이제 Leader 에서 수동으로 매수 매도를 진행하여 Follower 에까지 잘 되는지 한번 확인을 해보아야겠죠?
저는 예시로 SOLJPY 에서 0.01 랏 거래를 시도를 해보았구요,
리더계좌에서 거래가 활발히 진행되고 있는 통화쌍에 대충 시장가 주문을 통해 매수를 진행 했습니다.
(아래 티켓은 테스트 하다가 Follower 에서 신호를 실패한 … 로그에요.)
그러면 Follower 에서도 잘 나오고 있는것도 확인이 가능하며,
사진과 같이 스프레드시트에서 각 Signals, Commands 탭에 로그가 잘 찍혀있는것 까지
확인이 되었다면 성공입니다!
트러블 슈팅 아카이브
언제나 한 번에 내가 상상하던대로 구현되면 얼마나 좋을까요.. 🥲 제가 겪었던 트러블 슈팅을 모아보았습니다.
작업을 하시면서 여러 에러들을 해결 한 후에 성공하였다면 트러블 슈팅을 정리해서 아카이브로 보관하면 추후에 도움이 많이 될거에요.
문제 #1: wininet.dll Access Violation
증상
Leader EA 로그:
신호 전송 실패 [OPEN] Ticket:3444878Follower EA 로그:
Cannot call 'wininet.dll::InternetOpenW', DLL is not allowed
Access violation read to 0x00000070 in 'wininet.dll'원인
MT4에서 DLL 사용 허용이 안됨
EA 설정에서 "DLL 가져오기 허용" 체크박스 비활성화 상태
wininet.dll 호출 방식의 불안정성
MQL4에서 Windows DLL을 직접 호출하는 방식은 메모리 접근 오류 발생 가능
MT4 버전, OS 환경에 따라 동작이 불안정함
해결책 MT4 내장 WebRequest() 함수로 전환
문제 #2: HTTP 500 에러 (Google Sheets API)
증상
Leader EA 로그:
HTTP 에러: 500
응답: {"message":"{'code': 400, 'message': 'A sheet with the name \\"Signals\\" already exists..."}Follower EA 로그:
HTTP 에러: 500 (연속 발생)원인
동시 요청으로 인한 시트 생성 충돌
여러 EA가 동시에 같은 시트를 생성하려고 시도
Google Sheets API의 동시성 문제
processed 플래그 업데이트 실패
Reader Function에서
commands_ws.batch_update()실행 시 에러 발생 에러 발생 시 전체 응답이 500으로 반환됨
해결책 (단계적 접근)
단계 1: 시트 생성 에러 처리 개선
단계 2: processed 업데이트 비활성화
문제 #3: Google Sheets API 할당량 초과
증상
Reader Function 응답
{
"message": "Quota exceeded for quota metric 'Read requests' and limit 'Read requests per minute per user'",
"status": "RESOURCE_EXHAUSTED",
"quota_limit_value": "60"
}HTTP 상태 코드: 500
원인
Follower EA 설정:
PollInterval: 1000ms(1초)60초 / 1초 = 60회/분 요청
Google Sheets API 무료 할당량:
읽기 요청: 60회/분/사용자
정확히 한도에 도달!
해결책 PollInterval 조정: 기존: PollInterval = 1000ms (1초) 변경: PollInterval = 5000ms (5초)
결과: 60초 / 5초 = 12회/분 ✅ (안전)
추가 최 적화 (선택):
10초: 6회/분 (매우 안전, 약간 느림)
3초: 20회/분 (적당히 빠름)
권장 설정
일반 사용: PollInterval: 5000 (5초) → 충분히 빠르고 안정적
고빈도 거래: PollInterval: 3000 (3초) → 더 빠른 반응, 여전히 안전
보수적 설정: PollInterval: 10000 (10초) → 매우 안정적, 스윙 트레이딩에 적합
최종의 최종의 ... 권장 아키텍처
Leader EA (1초 스캔)
↓
Cloud Function Writer (즉시 저장)
↓
Google Sheets (중앙 DB)
↓
Cloud Function Reader (5분 필터)
↓
Follower EA (5초 폴링)
이를 통해 드디어 마침내 카피트레이딩 구축을 완료하였습니다!
글로만 카피트레이딩 에 대한걸 이해할 때에는 “아~ 이런거구나~” 라고만 생각하고 넘어갔을텐데, 실제로 직접 적용하고 많은 에러들을 만나니까 조금 더 트레이딩 개념에 대해 이해할 수 있었달까요.. 🥹
간단하게 진행 할 수 있을줄 알았는데 생각보다 길을 빙빙 돈 느낌이였습니다.
거기에 평일에는 시간을 잘 못쏟다보니 주말 되어서야 작업을 마저 할 수 있었는데, 거래 시간이 아니여서 조금 더 테스트를 이것저것 해보고 싶었는데 아쉽긴 했습니다. (아, 진짜 지난 추석 연휴가 너무 그립네요 )
뿐만아니라, 서브 에이전트 기능을 적극 활용해볼걸, 아직 에이전트 기능을 잘 쓰지 못하는것 같아 지금 생각해보니 이 부분도 아쉽네요.
다음에 실습 진행할 때 에는 좀 더 똑똑하게 AI를 잘 활용해보아야겠습니다.
Ref.
https://www.gpters.org/wealth/post/creating-program-automatically-copies-LhCkmYJIiUHhwUQ