본문 바로가기

AI Insights & Innovations

최신 인공지능 기술과 트렌드를 탐색하는 전문 블로그

BINANCE/AUTO TRADE

바이낸스 선물거래 스탑로스 외 모든 주문방식 완전 가이드 - API로 구현하는 고급 트레이딩 전략

by dma-ai 2025. 8. 27.
728x90

바이낸스 선물거래에서 스탑로스 외에도 다양한 주문 방식을 활용할 수 있다는 사실을 알고 계시나요? 이 가이드에서는 CCXT 라이브러리와 Binance API를 활용하여 구현할 수 있는 모든 주문 유형과 고급 기능들을 상세히 설명합니다.

1. 기본 주문 유형 (Order Types)

1.1 시장가 주문 (MARKET)

현재 시장가격으로 즉시 체결되는 주문입니다.

CCXT 구현 예시:

import ccxt

exchange = ccxt.binanceusdm({
    'apiKey': 'your-api-key',
    'secret': 'your-secret',
    'sandbox': True,  # 테스트넷 사용
})

# 시장가 매수 주문
order = exchange.create_market_buy_order(
    symbol='BTC/USDT',
    amount=0.001,
    params={'positionSide': 'LONG'}
)
print(order)

1.2 지정가 주문 (LIMIT)

지정한 가격 또는 더 유리한 가격에 체결되는 주문입니다.

CCXT 구현 예시:

# 지정가 매수 주문
order = exchange.create_limit_buy_order(
    symbol='BTC/USDT',
    amount=0.001,
    price=45000,
    params={
        'timeInForce': 'GTC',
        'positionSide': 'LONG'
    }
)

1.3 스탑 시장가 주문 (STOP_MARKET)

지정한 스탑 가격에 도달하면 시장가 주문으로 전환됩니다.

CCXT 구현 예시:

# 스탑 시장가 매도 주문 (손절)
order = exchange.create_order(
    symbol='BTC/USDT',
    type='STOP_MARKET',
    side='sell',
    amount=0.001,
    params={
        'stopPrice': 44000,
        'workingType': 'MARK_PRICE',  # MARK_PRICE 또는 CONTRACT_PRICE
        'positionSide': 'LONG'
    }
)

1.4 테이크프로핏 시장가 주문 (TAKE_PROFIT_MARKET)

지정한 이익 실현 가격에 도달하면 시장가 주문으로 전환됩니다.

CCXT 구현 예시:

# 테이크프로핏 시장가 매도 주문
order = exchange.create_order(
    symbol='BTC/USDT',
    type='TAKE_PROFIT_MARKET',
    side='sell',
    amount=0.001,
    params={
        'stopPrice': 48000,
        'workingType': 'MARK_PRICE',
        'positionSide': 'LONG'
    }
)

1.5 트레일링 스탑 주문 (TRAILING_STOP_MARKET)

가격이 유리한 방향으로 움직일 때 스탑 가격을 자동으로 조정하는 주문입니다.

CCXT 구현 예시:

# 트레일링 스탑 주문 (3% 트레일링)
order = exchange.create_order(
    symbol='BTC/USDT',
    type='TRAILING_STOP_MARKET',
    side='sell',
    amount=0.001,
    params={
        'callbackRate': '3.0',  # 3% 콜백 비율
        'activationPrice': 46000,  # 활성화 가격
        'workingType': 'MARK_PRICE',
        'positionSide': 'LONG'
    }
)

2. 주문 유효 기간 (Time In Force)

TIF 유형 설명 사용 사례

GTC Good Till Canceled - 취소될 때까지 유효 일반적인 지정가 주문
FOK Fill or Kill - 즉시 전체 체결 또는 취소 대량 주문의 완전 체결 필요시
IOC Immediate or Cancel - 즉시 가능한 만큼 체결 후 취소 부분 체결 허용
GTX Good Till Crossing (Post Only) - 메이커 주문만 허용 수수료 절약 목적
GTD Good Till Date - 지정 날짜까지 유효 특정 기간 내 체결 원할 때

GTD 주문 예시:

from datetime import datetime, timedelta

# 7일 후까지 유효한 주문
future_date = int((datetime.now() + timedelta(days=7)).timestamp() * 1000)

order = exchange.create_limit_buy_order(
    symbol='BTC/USDT',
    amount=0.001,
    price=44000,
    params={
        'timeInForce': 'GTD',
        'goodTillDate': future_date,
        'positionSide': 'LONG'
    }
)

3. 고급 주문 기능

3.1 자기 거래 방지 (Self-Trade Prevention, STP)

같은 계정 내 주문끼리 체결되는 것을 방지합니다.

STP 모드:

  • NONE: STP 비활성화
  • EXPIRE_TAKER: 테이커 주문 만료
  • EXPIRE_BOTH: 양쪽 주문 모두 만료
  • EXPIRE_MAKER: 메이커 주문 만료
# STP 설정 주문
order = exchange.create_limit_buy_order(
    symbol='BTC/USDT',
    amount=0.001,
    price=44000,
    params={
        'selfTradePreventionMode': 'EXPIRE_TAKER',
        'positionSide': 'LONG'
    }
)

3.2 가격 매칭 (Price Match)

지정가 주문에서 자동으로 적절한 가격을 설정합니다.

가격 매칭 모드:

  • OPPONENT: 상대방 최우선 가격
  • OPPONENT_5/10/20: 상대방 5/10/20번째 가격
  • QUEUE: 같은 편 최우선 가격
  • QUEUE_5/10/20: 같은 편 5/10/20번째 가격
# 가격 매칭을 사용한 주문
order = exchange.create_order(
    symbol='BTC/USDT',
    type='LIMIT',
    side='buy',
    amount=0.001,
    params={
        'priceMatch': 'OPPONENT',  # 상대방 최우선 가격으로 자동 설정
        'timeInForce': 'GTC',
        'positionSide': 'LONG'
    }
)

3.3 포지션 축소 전용 주문 (Reduce Only)

기존 포지션을 줄이는 목적으로만 사용되는 주문입니다.

# 포지션 축소 전용 주문
order = exchange.create_limit_sell_order(
    symbol='BTC/USDT',
    amount=0.001,
    price=47000,
    params={
        'reduceOnly': True,
        'positionSide': 'LONG'
    }
)

3.4 포지션 전체 종료 (Close Position)

현재 포지션을 모두 종료하는 주문입니다.

# 포지션 전체 종료 주문
order = exchange.create_order(
    symbol='BTC/USDT',
    type='STOP_MARKET',
    side='sell',
    params={
        'stopPrice': 44000,
        'closePosition': True,  # 포지션 전체 종료
        'workingType': 'MARK_PRICE',
        'positionSide': 'LONG'
    }
)

4. 포지션 모드 설정

4.1 단방향 모드 (One-way Mode)

전통적인 방식으로 롱/숏 포지션이 상쇄됩니다.

4.2 헤지 모드 (Hedge Mode)

롱과 숏 포지션을 동시에 보유할 수 있습니다.

포지션 모드 변경:

# 헤지 모드로 변경
response = exchange.fapiPrivatePostPositionSideDual({
    'dualSidePosition': 'true'  # true: 헤지모드, false: 단방향모드
})

# 현재 포지션 모드 확인
position_mode = exchange.fapiPrivateGetPositionSideDual()
print(f"Dual Side Position: {position_mode['dualSidePosition']}")

5. 배치 주문 (Batch Orders)

여러 주문을 한 번에 실행할 수 있습니다.

# 배치 주문 예시
batch_orders = [
    {
        'symbol': 'BTC/USDT',
        'side': 'BUY',
        'type': 'LIMIT',
        'quantity': '0.001',
        'price': '44000',
        'timeInForce': 'GTC',
        'positionSide': 'LONG'
    },
    {
        'symbol': 'BTC/USDT',
        'side': 'SELL',
        'type': 'TAKE_PROFIT_MARKET',
        'quantity': '0.001',
        'stopPrice': '48000',
        'workingType': 'MARK_PRICE',
        'positionSide': 'LONG'
    }
]

# 배치 주문 실행
batch_result = exchange.fapiPrivatePostBatchOrders({
    'batchOrders': json.dumps(batch_orders)
})

6. 주문 수정 (Order Modification)

기존 지정가 주문의 가격이나 수량을 수정할 수 있습니다.

# 주문 수정
modified_order = exchange.fapiPrivatePutOrder({
    'symbol': 'BTCUSDT',
    'orderId': '12345678',
    'side': 'BUY',
    'quantity': '0.002',  # 수량 변경
    'price': '43500'      # 가격 변경
})

7. 조건부 주문 (Conditional Orders)

특정 조건 충족 시 자동으로 실행되는 주문입니다.

# 조건부 주문 생성 함수
def create_conditional_order(symbol, condition_price, order_type, side, amount, target_price):
    return exchange.create_order(
        symbol=symbol,
        type=order_type,
        side=side,
        amount=amount,
        params={
            'stopPrice': condition_price,
            'price': target_price if order_type == 'STOP' else None,
            'workingType': 'MARK_PRICE',
            'timeInForce': 'GTC' if order_type == 'STOP' else None
        }
    )

# 사용 예시: BTC 가격이 45000에 도달하면 46000에 매수 주문
conditional_order = create_conditional_order(
    symbol='BTC/USDT',
    condition_price=45000,
    order_type='STOP',
    side='buy',
    amount=0.001,
    target_price=46000
)

8. 주문 상태 모니터링

# 활성 주문 조회
open_orders = exchange.fetch_open_orders('BTC/USDT')

# 주문 히스토리 조회
order_history = exchange.fetch_orders('BTC/USDT', limit=10)

# 특정 주문 상태 확인
order_status = exchange.fetch_order('12345678', 'BTC/USDT')

# 포지션 정보 조회
positions = exchange.fetch_positions(['BTC/USDT'])

# 계정 정보 조회
balance = exchange.fetch_balance()

9. 실전 트레이딩 전략 구현

9.1 그리드 트레이딩 전략

def create_grid_orders(symbol, base_price, grid_count, grid_spacing, order_size):
    orders = []
    
    for i in range(-grid_count//2, grid_count//2 + 1):
        if i == 0:
            continue
            
        price = base_price * (1 + i * grid_spacing / 100)
        side = 'buy' if i < 0 else 'sell'
        
        order = exchange.create_limit_order(
            symbol=symbol,
            side=side,
            amount=order_size,
            price=price
        )
        orders.append(order)
    
    return orders

# 그리드 전략 실행
grid_orders = create_grid_orders('BTC/USDT', 45000, 10, 2.0, 0.001)

9.2 DCA (Dollar Cost Averaging) 전략

import time

def dca_strategy(symbol, investment_amount, interval_hours, total_periods):
    for period in range(total_periods):
        try:
            # 현재 가격으로 시장가 매수
            order = exchange.create_market_buy_order(
                symbol=symbol,
                quoteOrderQty=investment_amount
            )
            print(f"Period {period + 1}: Bought {order['amount']} at {order['average']}")
            
            # 다음 매수까지 대기
            if period < total_periods - 1:
                time.sleep(interval_hours * 3600)
                
        except Exception as e:
            print(f"Error in period {period + 1}: {e}")

# DCA 전략 실행 (매일 100 USDT씩 30일간)
# dca_strategy('BTC/USDT', 100, 24, 30)

10. 리스크 관리

10.1 포지션 크기 계산

def calculate_position_size(account_balance, risk_percentage, entry_price, stop_loss_price):
    """
    포지션 크기를 계산합니다.
    
    Args:
        account_balance: 계정 잔고
        risk_percentage: 리스크 비율 (%)
        entry_price: 진입 가격
        stop_loss_price: 손절 가격
    
    Returns:
        적절한 포지션 크기
    """
    risk_amount = account_balance * (risk_percentage / 100)
    price_difference = abs(entry_price - stop_loss_price)
    risk_per_unit = price_difference / entry_price
    
    position_size = risk_amount / (entry_price * risk_per_unit)
    return round(position_size, 6)

# 사용 예시
balance = 10000  # 10,000 USDT
risk_pct = 2     # 2% 리스크
entry = 45000
stop_loss = 43500

position_size = calculate_position_size(balance, risk_pct, entry, stop_loss)
print(f"Recommended position size: {position_size} BTC")

10.2 자동 손절/익절 설정

def create_position_with_sl_tp(symbol, side, amount, entry_price, stop_loss_pct, take_profit_pct):
    """
    진입과 동시에 손절/익절 주문을 설정합니다.
    """
    # 메인 포지션 진입
    entry_order = exchange.create_limit_order(
        symbol=symbol,
        side=side,
        amount=amount,
        price=entry_price
    )
    
    # 손절가/익절가 계산
    if side == 'buy':
        stop_loss_price = entry_price * (1 - stop_loss_pct / 100)
        take_profit_price = entry_price * (1 + take_profit_pct / 100)
    else:
        stop_loss_price = entry_price * (1 + stop_loss_pct / 100)
        take_profit_price = entry_price * (1 - take_profit_pct / 100)
    
    # 손절 주문
    sl_side = 'sell' if side == 'buy' else 'buy'
    stop_loss_order = exchange.create_order(
        symbol=symbol,
        type='STOP_MARKET',
        side=sl_side,
        amount=amount,
        params={
            'stopPrice': stop_loss_price,
            'reduceOnly': True
        }
    )
    
    # 익절 주문
    take_profit_order = exchange.create_order(
        symbol=symbol,
        type='TAKE_PROFIT_MARKET',
        side=sl_side,
        amount=amount,
        params={
            'stopPrice': take_profit_price,
            'reduceOnly': True
        }
    )
    
    return {
        'entry': entry_order,
        'stop_loss': stop_loss_order,
        'take_profit': take_profit_order
    }

11. 주문 관리 도구

11.1 주문 취소 및 수정

# 모든 열린 주문 취소
def cancel_all_orders(symbol):
    open_orders = exchange.fetch_open_orders(symbol)
    for order in open_orders:
        try:
            exchange.cancel_order(order['id'], symbol)
            print(f"Cancelled order {order['id']}")
        except Exception as e:
            print(f"Failed to cancel order {order['id']}: {e}")

# 특정 조건의 주문만 취소
def cancel_orders_by_side(symbol, side):
    open_orders = exchange.fetch_open_orders(symbol)
    for order in open_orders:
        if order['side'] == side:
            try:
                exchange.cancel_order(order['id'], symbol)
                print(f"Cancelled {side} order {order['id']}")
            except Exception as e:
                print(f"Failed to cancel order: {e}")

11.2 주문 현황 모니터링

def monitor_orders(symbol):
    """주문 현황을 실시간으로 모니터링합니다."""
    while True:
        try:
            # 열린 주문 조회
            open_orders = exchange.fetch_open_orders(symbol)
            
            # 포지션 조회
            positions = exchange.fetch_positions([symbol])
            
            print(f"\n=== {symbol} 현황 ===")
            print(f"열린 주문 수: {len(open_orders)}")
            
            for order in open_orders:
                print(f"주문 ID: {order['id']}, 타입: {order['type']}, "
                      f"사이드: {order['side']}, 수량: {order['amount']}, "
                      f"가격: {order['price']}")
            
            for position in positions:
                if float(position['size']) != 0:
                    print(f"포지션: {position['side']}, 크기: {position['size']}, "
                          f"진입가: {position['entryPrice']}, PnL: {position['percentage']:.2f}%")
            
            time.sleep(30)  # 30초마다 업데이트
            
        except KeyboardInterrupt:
            print("모니터링을 종료합니다.")
            break
        except Exception as e:
            print(f"모니터링 오류: {e}")
            time.sleep(10)

마무리

바이낸스 선물거래는 스탑로스 외에도 다양한 주문 방식을 제공합니다. 각 주문 유형의 특성을 이해하고 적절한 상황에서 활용한다면 더욱 정교한 트레이딩 전략을 구사할 수 있습니다.

중요한 것은 실제 자금을 투입하기 전에 테스트넷에서 충분히 테스트해보는 것입니다. 또한 리스크 관리를 철저히 하고, 시장 상황에 맞는 주문 방식을 선택하는 것이 성공적인 트레이딩의 핵심입니다.

주의사항:

  • API 키는 절대 공개하지 마세요
  • 테스트넷에서 충분히 검증 후 실전에 적용하세요
  • 리스크 관리를 철저히 하세요
  • 시장 상황을 항상 모니터링하세요

참고 자료:

728x90