파이썬/바이낸스 선물 API

[선물 API] 주문 넣기, 취소하기

Eluv 2024. 11. 21. 23:23

API키를 발급 받은 상태여야 합니다.

API키 발급 방법은 바이낸스 API키 발급 참조

 

1. 시장가 주문

import ccxt
import time

with open("D:/코인/binance key.txt") as f:
    lines = f.readlines()
    api_key = lines[0].strip()
    secret_key = lines[1].strip()

Futures_binance = ccxt.binance({
    'apiKey': api_key,
    'secret': secret_key,
    'enableRateLimit': True,
    'options': {
        'defaultType': 'future',
        'adjustForTimeDifference': True,
    }
})

# 시장가 주문
def MARKET_order(symbol, side, positionSide, amount):
    try:
        order = Futures_binance.create_order(
            symbol=symbol,
            type='market',
            side=side,
            amount=amount,
            params={
                'positionSide': positionSide
            }
        )
        print(f"Order Market placed: {order['info']['symbol']}, {order['info']['price']}, {order['info']['origQty']}")
        # print(f"Order Limit placed: {order}")
    except Exception as e:
        print(f"MARKET_order Error: {e}")


symbol = 'ETHUSDT'  # 종목 이름
side = 'BUY'  # 'SELL'
positionSide = 'LONG'  # 'SHORT'
amount = 0.01  # 주문할 수량
price = 3000  # 주문할 가격

MARKET_order(symbol, side, positionSide, amount)

Market_order 함수는 시장가에 주문을 넣습니다.

시장가는 주문하는 가격을 정하는게 아니라

당장 거래할 수 있는 빠른 가격에 바로 체결됩니다.

 

그래서 아래의 지정가와 달리

MARKET_order 함수에는 price를 넣지 않습니다.

 

2. 지정가 주문

다음은 지정가 주문입니다. 사용하시려면
위의 코드블록에서 '# 시장가 주문'  밑의 전체 코드를 지우고

아래 코드블록의  '# 지정가 주문' 코드를 전부 넣으시면 됩니다.

# 지정가 주문
def LIMIT_order(symbol, side, positionSide, amount, price, Order_count):
    try:
        cp = 0.005 # 분할 간격 퍼센트. 0.005는 0.5%를 의미함.
        price_multiplier = 1 - cp if positionSide == 'LONG' else 1 + cp

        for i in range(Order_count):
            adjusted_price = price * (price_multiplier ** i)
            order = Futures_binance.create_order(
                symbol=symbol,
                type='limit',
                side=side,
                amount=amount,
                price=adjusted_price,
                params={
                    'positionSide': positionSide,
                    'timeInForce': 'GTC'
                }
            )
            print(
                f"Order Limit placed: {order['info']['symbol']}, {order['info']['price']}, {order['info']['origQty']}")
            #print(f"Order Limit placed: {order}")
            time.sleep(0.5)
    except Exception as e:
        print(f"LIMIT_order Error: {e}")

symbol = 'ETHUSDT'  # 종목 이름
side = 'BUY'  # 'SELL'
positionSide = 'LONG'  # 'SHORT'
amount = 0.01  # 주문할 수량
price = 3000  # 주문할 가격
Order_count = 2 # 분할 주문 횟수

LIMIT_order(symbol, side, positionSide, amount, price, Order_count)

LIMIT_order 함수는 지정가를 시작으로 주문을 분할해서 넣도록 설계했습니다.

 

Order_count 변수의 숫자 만큼 분할 주문을 넣습니다.

cp  변수만큼의 간격으로 분할 주문을 넣습니다. 현재는 0.5% 간격 입니다.

예를들어 1% 간격으로 분할 넣고 싶다면 cp의 값을 0.01로 변경하면 됩니다.

 

숏 포지션 진입 주문을 넣는다면 아래와 같이 값을 변경하면 됩니다.

side = 'SELL'
positionSidt = 'SHORT'

 

 

다음은 지정가로 포지션을 정리하는 주문을 넣는 방법입니다.

예를들어 롱 포지션에 보유중인 ETH를 0.01개 만큼  정리할 경우

side = 'SELL'
positionSidt = 'LONG'
amount = 0.01 # 정리할 수량
price = 3000  # 원하는 가격으로 설정

LIMIT_order(symbol, side, positionSide, amount, price)

 

반대로 숏 포지션에 보유중인 ETH를 0.01개 만큼 정리할 경우

side = 'BUY'
positionSidt = 'SHORT'
amount = 0.01 # 정리할 수량
price = 3000  # 원하는 가격으로 설정

LIMIT_order(symbol, side, positionSide, amount, price)

 

정리하면

LONG : BUY = 포지션 진입, SELL = 포지션 정리

SHORT : SELL = 포지션 진입, BUY = 포지션 정리

 

 

3. 대기 주문 일괄취소

다음은 미체결된 대기중인 주문을 일괄 취소하는 방법입니다.

import ccxt

with open("D:/코인/binance key.txt") as f:
    lines = f.readlines()
    api_key = lines[0].strip()
    secret_key = lines[1].strip()

Futures_binance = ccxt.binanceusdm({
    'apiKey': api_key,
    'secret': secret_key,
    'enableRateLimit': True,
    'options': {
        'defaultType': 'future',
        'adjustForTimeDifference': True,
    }
})

# 포지션 정리 주문
def cancel_all_order(symbol):
    try:
        Futures_binance.cancel_all_orders(symbol)
        return True
    except Exception as e:
        print(f'주문 취소 실패: {e}')
        return False
        
symbol = 'ETHUSDT'
cancel_all_order(symbol)

전체 취소라고 하는데 막상 취고하고자 하는 종목의 이름을 넣어줘야 합니다.