바이낸스 선물거래에서 스탑로스 외에도 다양한 주문 방식을 활용할 수 있다는 사실을 알고 계시나요? 이 가이드에서는 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 키는 절대 공개하지 마세요
- 테스트넷에서 충분히 검증 후 실전에 적용하세요
- 리스크 관리를 철저히 하세요
- 시장 상황을 항상 모니터링하세요
참고 자료:
'BINANCE > AUTO TRADE' 카테고리의 다른 글
CCXT로 Binance 선물거래 API 완전 정복하기 - 2025년 최신 가이드 (5) | 2025.08.27 |
---|---|
CCXT 라이브러리: 암호화폐 거래소 API 통합을 위한 완벽 가이드 (0) | 2025.08.26 |