프로젝트/코인 투자 매크로

2025-06-21 [9] [v1.5] 연속 손실 제한 (Consecutive Loss Limit)

훈 님의 개발 블로그 2025. 6. 21. 18:59

오랜만에 등장했습니다!
요즘 시장이 안좋은지 매일 손해만 보는 저의 매크로를 위해 'n회 연속 손실이 발생한 경우 거래를 일시 중단하는 방어 코드'를 만들어보려 합니다.

1. portfolio 업데이트

기존 portfolio에 consecutive_losses라는 항목을 추가합니다.

# --- 가상 자산 초기화 함수 ---
def initialize_vportfolio():
    print("새로운 포트폴리오를 초기화합니다...")
    return {
        "cash": 1000000.0,  # 초기 가상 현금 100만원
        "coins_owned": [],   # 보유 코인 목록 (비어있음)
        "strategy_params": {
            "profit_take_percentage": 0.07,  # 수익실현 +7%
            "stop_loss_percentage": 0.035,   # 손절매 -3.5%
        },
        "hodl_list": [],   # 예외 항목
        "consecutive_losses": 0,    # 연속 손실 제한
    }

 

2. 카운트 증감

main_trader.py에서 매도 후 손익에 따라 초기화 또는 카운트 증가를 진행합니다.

    # --- 3. 매도 계획이 세워졌다면, 최종적으로 딱 한 번만 실행한다 ---
if should_sell:
    profit = (current_price - avg_buy_price) * quantity_to_sell

    # --- 👇 연속 손실 횟수 업데이트 로직 추가! 👇 ---
    if profit >= 0: # 수익이거나 본전일 때
        # 수익이 나면 연속 손실 횟수를 0으로 리셋
        my_vportfolio["consecutive_losses"] = 0
        print(f"-> 👍 수익 발생. 연속 손실 횟수가 0으로 초기화됩니다.")
    else: # 손실일 때
        # 손실이 나면 연속 손실 횟수를 1 증가
        my_vportfolio["consecutive_losses"] += 1
        print(f"-> 👎 손실 발생. 연속 손실 횟수 +1 (현재: {my_vportfolio['consecutive_losses']}회)")

 

3. 거래 제한

위에서 설정한 consecutive_losses값에 따라 거래를 진행할지 멈출지 컨트롤 합니다.

1). 변수 설정

consecutive_loss_limit = 5 # 연속 손실 한도
cooldown_hours = 6 # 거래 중지 시간 (hour)

 

2). 쿨다운 설정

위 손실일 때 카운트 증가시켜주는 부분에 아래와 같이 쿨다운을 추가합니다.

my_vportfolio["consecutive_losses"] += 1
print(f"-> 👎 손실 발생. 연속 손실 횟수 +1 (현재: {my_vportfolio['consecutive_losses']}회)")

# --- 연속 손실 한도 도달 시 쿨다운 설정! ---
if my_vportfolio["consecutive_losses"] >= consecutive_loss_limit:
    cooldown_end_time = time.time() + cooldown_hours * 3600    # hour
    my_vportfolio["cooldown_until"] = cooldown_end_time
    print(f"🔥🔥🔥 연속 손실 한도({consecutive_loss_limit}회) 도달! {cooldown_hours}시간 동안 거래를 중지합니다.")
    print(f"-> 거래 재개 예정 시각: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(cooldown_end_time))}")

 

3) 거래 제한

분석 대상 선정 전에 쿨다운 상태를 확인하고 건너띄는 내용을 추가합니다.

# --- 쿨다운(거래 중지) 상태인지 먼저 확인! ---
cooldown_until = my_vportfolio.get("cooldown_until", 0)
if time.time() < cooldown_until:
    resume_time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(cooldown_until))
    print(f"\n[{time.strftime('%Y-%m-%d %H:%M:%S')}] ❄️ 거래 중지(쿨다운) 상태입니다. ({resume_time_str} 까지)")
    continue
elif cooldown_until > 0:
    # 쿨다운 시간이 지났다면, 상태를 초기화
    print(f"\n[{time.strftime('%Y-%m-%d %H:%M:%S')}] ✅ 쿨다운 기간이 종료되었습니다. 거래를 재개합니다.")
    my_vportfolio["consecutive_losses"] = 0
    my_vportfolio["cooldown_until"] = 0
    virtual_portfolio_manager.save_vportfolio(my_vportfolio)  # 상태 초기화 후 저장

# 1. 분석 대상 선정

 

 

끝!