재테크 A2Z

솔라나 그리드트레이딩 전략 프롬프트 본문

코딩 & 파이썬

솔라나 그리드트레이딩 전략 프롬프트

a2ztec 2025. 10. 7. 13:41
  1. 체결 대기 주문 목록 조회
  2. 조건 분기
    • Case 1:
      🟡 미체결 매도 1개, 미체결 매수 4개 → 2초 대기 후 반복
    • Case 2 (Case3):
      🔵 미체결 매도 0개(매도 완료)
      1. 모든 미체결 매수 주문 취소
      2. 시장가 매수 1Unit
      3. 보유 평단가 및 수량 조회
      4. 평단가 대비 +2% 매도 주문
      5. 로직 코드에 평단가 전달 → 매수 가격 리스트(3개) 수신
      6. 받은 매수 가격 3개에 각각 1Unit 지정가 매수 주문
    • Case 3 (Case4):
      🟢 미체결 매도 1개, 미체결 매수 ≤ 2개
      1. 기존 미체결 매도 주문 취소
      2. 보유 평단가 및 수량 조회
      3. 평단가 대비 +0.11% 매도 주문
      4. 미체결 매수 주문 리스트를 로직 코드에 전달
      5. 로직 코드에서 매수 가격 리스트 수신
      6. 받은 매수 가격들에 각각 1Unit 지정가 매수 주문

🧩 로직 코드 (logic.py)

입력값 (파라미터)

  • Case3: 현재 평단가
  • Case4: 미체결 매수 주문 리스트

출력값 (리턴)

  • 매수 주문 가격 리스트 (1~3개)

로직 상세

  • Case3 (평단가 입력):
    1. 평단가 × 0.98 (1번 가격)
    2. 1번 가격 × 0.98 (2번 가격)
    3. 2번 가격 × 0.98 (3번 가격)
    4. 3번 가격 × 0.98 (4번 가격)
      [1번, 2번, 3번, 4번] 리스트로 리턴 (소수점 반올림)
  • Case4 (미체결 매수 리스트 입력):
    • 2개일 때: 더 낮은 가격에서 4% 낮춘 1개만 리턴
    • 1개일 때: 해당 가격 × 0.98, 그다음 가격 × 0.98, 그다음 가격 × 0.98 → 3개 리스트 리턴
    • 모든 가격은 반올림 처리

⚙️ main.py 수정 포인트

  • Case3, Case4 모두
    매도를 먼저 걸고, 그 다음 매수를 거는 순서로 변경

📋 그리드 트레이딩 봇 개발 프롬프트


🔄 메인 로직 흐름

반복 실행 구조

 
 
text
무한 루프: ├─ 체결 대기 주문 목록 조회 (미체결 매도/매수 개수 확인) ├─ 조건 분기 (Case 1, 2, 3) └─ 2초 대기 후 반복

🎯 조건 분기 (3가지 Case)

Case 1: 정상 상태 (대기)

 
 
text
🟡 미체결 매도 1개, 미체결 매수 4개 → 2초 대기 후 반복 → 아무 행동 없음

Case 2 (또는 Case 3): 매도 체결 완료

 
 
text
🔵 미체결 매도 0개 (매도 완료) 실행 순서: 1. 모든 미체결 매수 주문 취소 2. 시장가 매수 1Unit 3. 보유 평단가 및 수량 조회 4. 평단가 대비 +2.0% 매도 주문 (먼저 걸기) 5. 로직 코드에 평단가 전달 → 매수 가격 리스트(4개) 수신 6. 받은 매수 가격 4개에 각각 1Unit 지정가 매수 주문

예시:

 
 
text
평단가: 100,000원 → 매도: 102,000원 (+2.0%) → 매수: [98,000원, 96,040원, 94,119원, 92,237원]

Case 3 (또는 Case 4): 매수 주문 부족

 
 
text
🟢 미체결 매도 1개, 미체결 매수 ≤ 3개 실행 순서: 1. 기존 미체결 매도 주문 취소 2. 보유 평단가 및 수량 조회 3. 평단가 대비 +2.0% 매도 주문 (먼저 걸기) 4. 미체결 매수 주문 리스트를 로직 코드에 전달 5. 로직 코드에서 추가 매수 가격 리스트 수신 6. 받은 매수 가격들에 각각 1Unit 지정가 매수 주문

예시:

 
 
text
평단가: 100,000원, 미체결 매수 2개 [98,000원, 96,040원] → 매도 취소 후 재생성: 102,000원 → 추가 매수: [94,119원, 92,237원]

🧩 로직 코드 (grid_logic.py)

함수 1: 평단가 기준 매수 가격 계산 (Case 2용)

 
 
python
def calculate_buy_prices_from_average(average_price: float) -> List[float]: """ 입력값: 현재 평단가 출력값: 매수 주문 가격 리스트 (4개) 로직: 1번 가격 = 평단가 × 0.98 (-2%) 2번 가격 = 1번 가격 × 0.98 (-4%) 3번 가격 = 2번 가격 × 0.98 (-6%) 4번 가격 = 3번 가격 × 0.98 (-8%) 리턴: [1번, 2번, 3번, 4번] 리스트 (소수점 반올림) """

예시:

 
 
text
입력: 100,000원 출력: [98,000원, 96,040원, 94,119원, 92,237원]

함수 2: 미체결 기준 추가 매수 가격 계산 (Case 3용)

 
 
python
def calculate_buy_prices_from_orders(pending_buy_orders: List[Dict]) -> List[float]: """ 입력값: 미체결 매수 주문 리스트 예) [{'price': 98000}, {'price': 96040}] 출력값: 추가 매수 가격 리스트 (1~3개) 로직: - 3개 남음: 가장 낮은 가격 × 0.98 → 1개 추가 - 2개 남음: 가장 낮은 가격 × 0.98, 그 다음 × 0.98 → 2개 추가 - 1개 남음: 해당 가격 × 0.98, 그 다음 × 0.98, 그 다음 × 0.98 → 3개 추가 리턴: 추가 매수 가격 리스트 (소수점 반올림) """

예시:

 
 
text
입력: [{'price': 98000}, {'price': 96040}] # 2개 남음 출력: [94119, 92237] # 2개 추가

함수 3: 익절 가격 계산

 
 
python
def calculate_sell_price(average_price: float, profit_rate: float = 0.02) -> float: """ 입력값: 현재 평단가, 수익률 (기본값 2%) 출력값: 매도 가격 로직: 평단가 × (1 + 수익률) 리턴: 매도 가격 (반올림) """

예시:

 
 
text
입력: 100,000원, 0.02 (2%) 출력: 102,000원

⚙️ 백테스트 엔진 (grid_engine.py)

초기화

 
 
python
class GridBacktestEngine: def __init__(self, data: pd.DataFrame, # 캔들 데이터 initial_capital: float, # 초기 자본 (예: 1,000,000) unit_amount: float, # 1Unit 금액 (예: 50,000) fee_rate: float): # 수수료율 (예: 0.0004)

주요 메서드

 
 
python
1. market_buy(price, timestamp) - 시장가 매수 실행 - 수수료 차감 - position, position_value 업데이트 2. place_sell_order(price, volume, timestamp) - 매도 지정가 주문 생성 - pending_sell_orders에 추가 3. place_buy_order(price, timestamp) - 매수 지정가 주문 생성 - pending_buy_orders에 추가 4. check_and_fill_orders(row, timestamp) - 현재 가격과 비교하여 체결 확인 - 체결 시 자산 업데이트 및 주문 목록에서 제거 5. cancel_all_buy_orders(timestamp) - 모든 미체결 매수 주문 취소 6. cancel_all_sell_orders(timestamp) - 모든 미체결 매도 주문 취소 7. get_average_price() -> float - 현재 보유 평단가 반환 8. get_pending_sell_count() -> int - 미체결 매도 주문 개수 9. get_pending_buy_count() -> int - 미체결 매수 주문 개수 10. get_trades_dataframe() -> pd.DataFrame - 전체 거래 내역을 DataFrame으로 반환

🎮 전략 실행 (grid_strategy.py)

메인 전략 함수

 
 
python
def grid_trading_strategy(row: pd.Series, engine: GridBacktestEngine, timestamp: pd.Timestamp): """ 그리드 트레이딩 전략 실행 흐름: 1. 주문 체결 확인 (check_and_fill_orders) 2. 미체결 매도/매수 개수 조회 3. Case 분기 - Case 1: return (대기) - Case 2: 매도 완료 → 새 사이클 시작 - Case 3: 매수 부족 → 주문 재조정 """

Case별 구현

 
 
python
# Case 1 if pending_sell_count == 1 and pending_buy_count == 4: return # 대기 # Case 2 if pending_sell_count == 0: engine.cancel_all_buy_orders(timestamp) engine.market_buy(current_price, timestamp) avg_price = engine.get_average_price() position = engine.position # 매도 먼저 sell_price = calculate_sell_price(avg_price, 0.02) engine.place_sell_order(sell_price, position, timestamp) # 매수 나중 buy_prices = calculate_buy_prices_from_average(avg_price) for price in buy_prices: engine.place_buy_order(price, timestamp) # Case 3 elif pending_sell_count == 1 and pending_buy_count <= 3: engine.cancel_all_sell_orders(timestamp) avg_price = engine.get_average_price() position = engine.position # 매도 먼저 sell_price = calculate_sell_price(avg_price, 0.02) engine.place_sell_order(sell_price, position, timestamp) # 매수 나중 pending_buy_list = [{'price': order.price} for order in engine.pending_buy_orders] additional_prices = calculate_buy_prices_from_orders(pending_buy_list) for price in additional_prices: engine.place_buy_order(price, timestamp)

📊 메인 실행 파일 (main.py)

설정

 
 
python
config = { 'market': 'KRW-SOL', # 솔라나 'timeframe': '5m', # 5분봉 'days': 365, # 1년 'initial_capital': 1000000, # 100만원 'unit_amount': 50000, # 5만원 }

실행 흐름

 
 
python
def run_grid_backtest(**config): # 1. 캔들 데이터 수집 df = get_candles(market, timeframe, days) # 2. 엔진 초기화 engine = GridBacktestEngine(df, initial_capital, unit_amount, 0.0004) # 3. 초기 포지션 생성 engine.market_buy(first_price, first_timestamp) avg_price = engine.get_average_price() sell_price = calculate_sell_price(avg_price, 0.02) engine.place_sell_order(sell_price, engine.position, first_timestamp) buy_prices = calculate_buy_prices_from_average(avg_price) for price in buy_prices: engine.place_buy_order(price, first_timestamp) # 4. 메인 루프 for timestamp, row in df.iterrows(): grid_trading_strategy(row, engine, timestamp) # 자산 평가 및 기록 # 5. 결과 분석 및 출력 results = analyze_results(engine) print_results(results) # 6. CSV 저장 engine.get_trades_dataframe().to_csv(filename)

🎯 핵심 파라미터 (검증 완료)

항목값설명
익절 2.0% 평단가 대비 +2.0% 매도
물타기 4단계 -2%, -4%, -6%, -8%
물타기 간격 2% 0.98씩 곱함
Unit 50,000원 1회 거래 금액
수수료 0.04% 빗썸 기준
시간프레임 5분봉 안정적 체결
 
 

📈 검증된 성과 (1년 백테스트)

 
 
text
기간: 2024.10.05 ~ 2025.10.07 (365일) 초기 자본: 1,000,000원 최종 자본: 1,639,667원 수익금: 639,667원 수익률: 63.97% 거래 횟수: 229회 승률: 99.56% 평균 거래당 수익: 2,793원 월 평균 수익: 53,306원 (5.33%)

⚠️ 주의사항

1. 주문 순서

  • 매도를 먼저, 매수를 나중에 (Case 2, 3 모두)
  • 이유: 평단가 계산 후 즉시 매도 주문 생성

2. 자본 관리

  • 최소 200만원 이상 권장 (100만원은 위험)
  • 극한 하락 시 97% 자본 사용 가능

3. 4단계 물타기 필수

  • -8%까지 대응 가능
  • 3단계만으로는 극한 하락 대응 부족

이 프롬프트를 기반으로 코드를 작성하면 연 64% 수익, 승률 99.56%의 그리드 트레이딩 봇을 구현할 수 있습니다! 🚀