가상 자산&코인 투자 전략/가상자산 환경 세팅

[자동매매 개발기] 수수료 자동 환급기 제작기 #2 - "클라우드에서 매일 알아서 정산하는 프로그램 만들기"

코젵 2026. 8. 28. 21:32

안녕하세요 코젵입니다.

좋은 하루 보내고 계신가요..?

지난 1화에서 "MEXC API로 수수료 자동 환급기를 만들 수 있다"는 결론까지 냈었죠.

조회도 되고, 계산은 제 마음대로고, 송금 엔드포인트도 있다.

세 조각이 다 있으니 이제 조립만 하면 된다고 했습니다.

이번 화에서는 그 조립을 실제로 해봅니다.

"매일, 사람 손 안 대고, 알아서 정산해서 보내는" 프로그램을 만들어야 하니까요.

어디서 돌릴까 - OCI 무료 서버

일단 이 프로그램은 24시간 켜져 있는 컴퓨터에서 돌아야 합니다.

매일 정해진 시간에 자동으로 실행돼야 하는데, 제 노트북을 24시간 켜둘 순 없잖아요.

그래서 클라우드 서버를 씁니다.

저는 오라클 클라우드(OCI)의 무료 등급(Always Free) 을 골랐습니다.

신용카드 등록은 하지만, 평생 무료로 주는 작은 우분투(Ubuntu) 서버가 있거든요.

이 정도 가벼운 프로그램 돌리기엔 차고 넘칩니다.

우분투 서버 하나 띄우고, 파이썬 깔고, 제 코드를 올리면 준비 끝입니다.

 

OCI 세팅 방법은 링크로.. ㅎ

https://foxydog.tistory.com/229

전체 그림 - crontab이 매일 깨운다

프로그램 자체는 "한 번 실행되면 그날치를 정산하고 끝"나는 구조입니다.

이걸 매일 자동으로 실행해주는 게 리눅스의 crontab입니다.

 
# 매일 아침 정해진 시간에 실행 (예시)
0 17 * * * cd /home/ubuntu/MEXC_REBATE && python3 mexc_rebate.py --config config.json --live

이 한 줄이 "매일 몇 시에 이 프로그램을 실행해라"라는 예약입니다.

이제 제가 자든 말든, 서버가 매일 알아서 프로그램을 깨웁니다.

프로그램이 하는 일을 순서대로 그리면 이렇습니다.

 
1. 신규 추천인이 있으면 등록 (자동 편입)
2. 어제 하루치 커미션을 UID별로 조회
3. 각자 등급에 맞는 환급액 계산
4. 내 지갑 잔액이 충분한지 확인
5. 각 UID에게 내부이체로 송금
6. 지급 내역을 DB에 기록 (중복 방지)

이 흐름을 코드로 하나씩 보여드리겠습니다.

1. API에 요청 보내기 - 서명이 핵심

거래소 API는 아무나 못 부릅니다.

내 요청이 진짜 나인지 증명하려면, 요청 내용을 비밀키로 암호화한 서명(signature) 을 붙여야 합니다.

MEXC는 HMAC-SHA256 방식을 씁니다.

 
python
def _sign(self, params: dict) -> str:
    params = dict(params)
    params["timestamp"] = int(time.time() * 1000)
    query = urlencode(params)
    sig = hmac.new(self.api_secret, query.encode(), hashlib.sha256).hexdigest()
    return query + "&signature=" + sig

여기서 초보들이 꼭 한 번은 넘어집니다.

"서명을 만들 때 쓴 문자열"과 "실제로 보낸 문자열"이 조금이라도 다르면 거부당하거든요.

파라미터 순서 하나, 공백 하나 때문에 몇 시간 날립니다.

핵심은 문자열을 한 번만 만들어서, 그걸로 서명도 하고 전송도 하는 겁니다.

2. 커미션 조회

서명이 통과되면 커미션 조회는 간단합니다.

기간을 정해서 UID별 커미션을 받아옵니다.

 
python
def get_commissions(self, start_ms, end_ms):
    path = "/api/v3/rebate/affiliate/commission"
    # startTime, endTime 으로 기간을 지정해서 UID별 커미션을 받아온다
    data = self._request("GET", path,
        {"startTime": start_ms, "endTime": end_ms, "page": 1, "pageSize": 100})
    return data["data"]["resultList"]

이걸로 "어제 하루 동안 누가 나에게 얼마의 커미션을 발생시켰는지"가 UID별로 나옵니다.

3. 환급액 계산 - 등급별 차등

여기가 제 규칙이 들어가는 부분입니다.

모두에게 똑같이 주는 게 아니라, 거래량(=수수료를 많이 낸 사람)에 따라 등급을 나눠

환급 비율을 다르게 줍니다.

 
python
tier = uid_tiers.get(uid, "normal")   # 이 사람 등급
rate = rates[tier]                    # 등급별 환급 비율 (예: 0.5 ~ 1.0)
amount = commission * rate            # 돌려줄 금액

예를 들어 커미션이 100 USDT인데 이 사람이 VIP 등급(비율 0.8)이면 80 USDT를 돌려주는 식입니다.

많이 거래하는 사람일수록 더 많이 돌려받게 되는 구조죠.

4. 송금 전, 반드시 잔액 확인

이게 실전에서 꼭 필요했던 안전장치입니다.

MEXC 커미션은 어필리에이트 영역에 쌓이는데, 이게 제 현물 지갑으로 자동으로 안 넘어옵니다.

즉 지갑에 돈이 없으면 송금이 실패하죠.

그래서 송금 전에 지갑 잔액을 확인하고, 이번에 나갈 총액보다 적으면

한 명도 보내지 않고 전체를 멈추게 했습니다.

 
python
balance = client.get_spot_balance("USDT")   # 현재 지갑 잔액
if balance < planned_total:                 # 나갈 총액보다 적으면
    logging.error("잔액 부족: 송금을 중단합니다.")
    return                                   # 전부 멈춤 (일부만 나가는 사고 방지)

"일부만 나가고 중간에 멈추는" 게 제일 위험하거든요.

전부 되거나, 전부 안 되거나. 둘 중 하나여야 뒤탈이 없습니다.

5. 송금, 그리고 기록

잔액이 충분하면 각 UID에게 내부이체로 보냅니다.

그리고 보낸 즉시 DB에 기록합니다.

 
python
tran_id = client.internal_transfer(uid, "USDT", amount)   # 실제 송금
store.record(period_id, uid, "USDT", amount, tran_id, "SUCCESS")  # 기록

기록이 왜 중요하냐면 - crontab으로 매일 도는 프로그램이라

혹시 두 번 실행되거나 중간에 죽었다 살아나도, "이미 보낸 사람"은 건너뛰어야 하기 때문입니다.

송금 전에 항상 "얘한테 이 기간 거 이미 보냈나?"를 DB에서 확인합니다.

돈이 오가는 프로그램에서 중복 송금만큼 무서운 게 없거든요.

6. 안전장치 - DRY-RUN

마지막으로, 실제 돈을 보내기 전에 항상 모의 실행(DRY-RUN) 을 먼저 돌립니다.

--live 옵션을 안 붙이면 실제 송금은 안 하고 "누구에게 얼마 보낼 예정"인지 로그만 찍습니다.

 
2026-08-28 09:14 INFO 이번 실행 대상 기간(직전 1개): 20260827-20260828
2026-08-28 09:14 INFO uid=71531783 tier=VIP3 commission=67.86 x 0.8 -> pay 54.29 USDT
2026-08-28 09:14 INFO 지급 예정: 1건, 합계 54.29 USDT
2026-08-28 09:14 INFO === run done (DRY-RUN, 송금 안 함) ===

이렇게 계산이 맞는 걸 눈으로 확인한 다음에야 --live를 붙입니다.

자동매매 만들면서 배운 건데, 돈 나가는 프로그램은 기능보다 안전장치가 먼저입니다.

마치며

정리하면 2화는 이렇습니다.

  • OCI 무료 우분투 서버에 올리고, crontab으로 매일 자동 실행
  • 서명 인증 → 커미션 조회 → 등급별 계산 → 잔액 확인 → 송금 → 기록
  • DRY-RUN, 중복 방지, 잔액 확인 등 안전장치를 겹겹이

이렇게 "매일 알아서 정산하는" 뼈대는 완성됐습니다.

물론 이 과정에서 예상 못 한 벽들도 만났죠. 송금이 리스크에 막히기도 했고,

"어제 것"을 조회했는데 자꾸 그저께 값이 나오기도 했고요. (이건 나중에 따로 풀어보겠습니다)

그런데 프로그램이 돌기 시작하니 새로운 문제가 생겼습니다.

바로 "돈은 잘 보내지는데, 받는 사람이 그걸 어떻게 확인하지?" 였습니다.

매번 "얼마 보냈어요"라고 말해줄 순 없으니까요.

그래서 다음 화에서는 추천인분들이 본인 UID만 넣으면 매일 얼마를 환급받았는지 직접 조회할 수 있는 사이트를 만든 이야기를 해보겠습니다.

감사합니다아