트레이딩을 자동화를 위해, Bithumb API와 텔레그램 알림을 활용한 간단한 스캘핑 봇을 만들었습니다. 개발언어는 파이썬으로 하고, 배포는 Docker를 이용했습니다. 이 글에서는 설정과정을 공유합니다.
1. 프로젝트 구조
먼저 프로젝트 폴더 구조입니다:
bithumb-bot-scalping/
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── main.py
├── aggressive_scalping.py
└── .env
- main.py : 실행 진입점, 데이터 불러오고 전략 실행
- aggressive_scalping.py : 전략 로직 정의
- .env : API 키, 시크릿키, 텔레그램 토큰 등 민감정보
- requirements.txt : 필요한 패키지 목록
- Dockerfile, docker-compose.yml : 배포 환경 정의
2. Dockerfile 작성
컨테이너 안에서 필요한 파이썬 환경을 세팅합니다:
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "main.py"]
단순히 파이썬 이미지 기반 → 패키지 설치 → 소스 복사 → 실행 순서입니다.
3. requirements.txt
봇이 사용하는 라이브러리들:
requests
pandas
python-telegram-bot==13.7
python-dotenv
- requests : 빗썸 API 호출
- pandas : 캔들 데이터 처리
- python-telegram-bot : 알림 전송
- python-dotenv : .env 환경변수 불러오기
4. main.py 핵심 코드
from dotenv import load_dotenv
import os, time, requests, pandas as pd
from aggressive_scalping import AggressiveScalpingStrategy
from telegram import Bot
load_dotenv()
API_KEY = os.getenv("API_KEY")
API_SECRET = os.getenv("API_SECRET")
bot = Bot(token=os.getenv("TELEGRAM_TOKEN"))
CHAT_ID = os.getenv("TELEGRAM_CHAT_ID")
def send_message(msg):
bot.send_message(chat_id=CHAT_ID, text=msg)
def main():
send_message("🚀 Bot Started")
while True:
try:
# 데이터 가져오기
res = requests.get("https://api.bithumb.com/public/candlestick/BTC_KRW/1m").json()
df = pd.DataFrame(res['data'], columns=["time","open","close","high","low","volume"])
df[["open","close","high","low","volume"]] = df[["open","close","high","low","volume"]].astype(float)
# 전략 실행
strategy = AggressiveScalpingStrategy()
signal = strategy.generate_signal(df)
if signal:
send_message(f"📢 Signal: {signal}")
except Exception as e:
send_message(f"❌ Error: {e}")
time.sleep(60)
if __name__ == "__main__":
main()
실제 매매 주문은 구현하지 않고, 시그널 감지 → 텔레그램 알림까지만 테스트했습니다.
5. 실행하기
- 이미지 빌드
docker-compose build --no-cache
- 컨테이너 실행
docker-compose up -d
- 로그 확인
docker logs -f bithumb-bot
성공적으로 실행되면 텔레그램에 메시지가 도착합니다 🎉
6. 시행착오
- 모듈 에러 (dotenv)
로컬에서는 잘 되는데 컨테이너에서는 안 되는 경우가 있었습니다. 원인은 requirements.txt 누락이거나 캐시 문제.
docker-compose build --no-cache로 재빌드하면 해결.
7. 참고할 점
- Docker에서는 로컬 환경이랑 완전히 따로 돈다 → requirements.txt가 전부다
- docker-compose.yml은 항상 루트에서 실행할 것
8. Oracle Cloud에 배포하기 (선택 사항)
개발이 완료된 자동매매 봇을 24시간 안정적으로 실행하기 위해서는 서버에 배포하는 것이 중요합니다. 여기서는 Oracle Cloud Infrastructure(OCI)를 활용하여 봇을 배포하는 방법을 소개합니다. Oracle Cloud는 Free Tier를 제공하여 부담 없이 시작할 수 있는 장점이 있습니다.
8.1. Oracle Cloud 계정 생성 및 가상 머신(VM) 인스턴스 설정
- 계정 생성: 먼저 Oracle Cloud Free Tier에 가입합니다.
- VM 인스턴스 생성:
- OCI 대시보드에서
컴퓨트
→인스턴스
→인스턴스 생성
으로 이동합니다. - 이름: 봇의 이름을 지정합니다 (예:
bithumb-scalping-bot
). - 이미지: 운영체제는
Ubuntu Server 22.04 LTS
(Long Term Support)를 선택하는 것이 안정적입니다. - 인스턴스 유형 및 셰이프: Free Tier를 사용한다면
AMD 기반
의VM.Standard.E2.1.Micro
셰이프를 선택합니다. - SSH 키페어 추가: 새로운 SSH 키페어를 생성하거나 기존 키를 업로드합니다. 이 키는 나중에 서버에 접속할 때 필요하니
개인 키
를 안전하게 보관하세요. 주로 생성하게 되는데 생성한 키는 반드시 저장해 둡니다. (이후 재확인 불가) - 가상 클라우드 네트워크(VCN): 기본 설정을 따르거나 새 VCN을 생성합니다. 방화벽 규칙을 통해 봇이 외부와 통신할 수 있도록 설정해야 합니다.
- OCI 대시보드에서
8.2. 네트워크(보안 목록) 설정
VM 인스턴스를 생성하면 자동으로 보안 목록(Security List)이 생성됩니다. 이 보안 목록에서 필요한 인바운드 및 아웃바운드 규칙을 추가해야 합니다.
- SSH 접속 허용: 인스턴스 생성 시 자동으로 SSH (포트 22) 규칙이 추가되지만, 혹시 없다면
소스 CIDR: 0.0.0.0/0
,대상 포트: 22
로 인바운드 규칙을 추가합니다. - 텔레그램 및 빗썸 API 통신을 위한 아웃바운드 규칙: 텔레그램 및 빗썸 API와의 통신을 위해 아웃바운드 규칙이 필요합니다. 기본적으로 모든 포트에 대한 아웃바운드 통신은 허용되어 있지만, 보안을 강화하려면 텔레그램 (일반적으로 443) 및 빗썸 API (443)에 대해서만 허용하도록 구체적으로 설정할 수도 있습니다. (예:
대상 CIDR: 0.0.0.0/0
,IP 프로토콜: TCP
,대상 포트: 443
).
8.3. VM에 접속 및 Docker 설치
- 폴더 생성 후 작성한 프로그램, Oracle 인스턴스 생성할 때 저장한 보안키(둘 다) 넣습니다.
- 터미널(Linux/macOS) 또는 PuTTY(Windows)를 사용하여 SSH로 터미널을 열고 권한설정.
icacls "<ssh-key-path>" /inheritance:r
icacls "<ssh-key-path>" /grant:r "<username>:(R)"
*서버 체크
tnc <server-ip> -p 22
- VM 접속: 터미널(Linux/macOS) 또는 PuTTY(Windows)를 사용하여 SSH로 VM에 접속합니다.
ssh -i <SSH 개인 키 파일 경로> ubuntu@<VM 공용 IP 주소>
8.4. 봇 파일 전송
개발 환경에서 작업한 봇 프로젝트 파일을 VM으로 전송해야 합니다.
- SCP 사용 (권장):
프로그램 파일을 압축하고 로컬 터미널에서 다음 명령어를 실행하여 프로젝트 폴더를 VM으로 전송합니다.
scp -r -i <SSH 개인 키 파일 경로> bithumb-bot-scalping/ ubuntu@<VM 공용 IP 주소>:~/
- Git Clone 사용: 만약 봇 코드가 GitHub 등의 원격 저장소에 있다면, VM에서
git clone
을 사용할 수도 있습니다.
sudo apt install -y git # git이 설치되어 있지 않다면 설치 git clone <원격 저장소 URL>
8.5. 환경 변수(.env
) 설정
VM에 전송된 프로젝트 폴더(/home/ubuntu/bithumb-bot-scalping/
또는 ~/bithumb-bot-scalping/
)로 이동한 후, .env
파일을 직접 생성할 수도 있지만 저는 알집파일에 포함하여 전송하는 방식으로 처리하였으므로 생략합니다.
이제 이 구조를 기반으로 실제 주문 API까지 붙이면 진짜 자동매매 봇이 완성될 것 같습니다.