본문 바로가기

Project/AlgoTrading

Binance API 기초 [4]

API를 사용하여 주문을 실행

우리가 사용하고 있는 라이브러리에는 테스트 주문을 생성할 수 있는 기능이 있다.

buy_order_limit = client.create_test_order(
    symbol='ETHUSDT',
    side='BUY',
    type='LIMIT',
    timeInForce='GTC',
    quantity=100,
    price=200)

주문을 제출하지 않고도 주문이 올바른지 확인할 수 있다. 

예를 들어 위 코드에서 유형을 'MARKET'으로 변경하면 예외가 발생한다. 그 이유는 timeInForce  가격 매개변수가 시장 주문에 사용되지 않기 때문이다. 대신 시장가 주문은 다음과 같다.

buy_order = client.create_test_order(symbol='ETHUSDT', side='BUY', type='MARKET', quantity=100)

이렇게 테스트 function 이 잘 동작한다면, create_test_order function 대신 create_order function을 사용하면 된다.

 

참고: 지정가 주문 코드를 사용할 때 이 코드가 작성된 이후 가격이 크게 변동한 경우 API 오류가 발생할 수 있다. 바이낸스는 코인이 현재 거래되고 있는 가격의 일정 비율 이내의 주문만 허용한다.

 

예외가 있을 수 있으므로 코드를 try/except 블록으로 래핑하고 정의된 예외 중 일부를 라이브러리에서 가져온다.

import os

from binance.client import Client
from binance.enums import *
from binance.exceptions import BinanceAPIException, BinanceOrderException

# init
api_key = os.environ.get('binance_api')
api_secret = os.environ.get('binance_secret')

client = Client(api_key, api_secret)

클라이언트 및 사용자 지정 예외 외에도 우리는 곧 이야기 해볼 binance.enums를 가져왔다.

 

# create a real order if the test orders did not raise an exception

try:
    buy_limit = client.create_order(
        symbol='ETHUSDT',
        side='BUY',
        type='LIMIT',
        timeInForce='GTC',
        quantity=100,
        price=200)

except BinanceAPIException as e:
    # error handling goes here
    print(e)
except BinanceOrderException as e:
    # error handling goes here
    print(e)

주문 확인서는 거래소에서 다시 전송되어 buy_limit 변수에 저장된다.

여기에는 orderId가 포함되어 있다. 이 ID를 사용하여 다음과 같이 지정가 주문을 취소할 수 있다.

    # cancel previous orders
    cancel = client.cancel_order(symbol='ETHUSDT', orderId=buy_limit['orderId'])

다시 한 번 확인을 받는다. 

기능 create_order은 주문하는 주요 방법이다. 여기에서 여러 매개변수를 사용할 수 있다.

그러나 아래와 같은 특정 함수들을 사용하는것이 편하다.

    # same order but with helper function
    buy_limit = client.order_limit_buy(symbol='ETHUSDT', quantity=100, price=200)

    # market order using a helper function
    market_order = client.order_market_sell(symbol='ETHUSDT', quantity=100)

다음은 사용할 수 있는 몇 가지 특정 함수 목록이다.

  • order_limit_buy()
  • order_limit_sell()
  • order_market_buy()
  • order_market_sell()
  • order_oco_buy()
  • order_ocosell()

마지막 두 개는 고급 주문 유형으로 간주된다. OCO는 O ne C ancels the O ther를 나타낸다 

이에 대한 좋은 예는 손절매와 이익 실현 목표를 사용하는 경우이다. 주문 중 하나가 적중하면 다른 주문을 취소하는 기능이다.

일부 주문 유형에는 ' MARKET ' 또는 ' BUY '와 같은 문자열 상수가 필요하다. 

다음은 기본 제공 변수를 사용하지 않는 주문의 예이다.

buy_order = client.create_test_order(symbol='ETHUSDT', side='BUY', type='MARKET', quantity=100)

그리고 이것은 내장 변수를 사용하는 것과 동일하다.

buy_order = client.create_test_order(symbol='ETHUSDT', side=SIDE_BUY, type=ORDER_TYPE_MARKET, quantity=100)

이 경로를 사용하려면 앞 게시물에서 나온 열거형 가져오기가 필요하다.

모든 하드 코딩된 문자열의 전체 목록은 여기에서 찾을 수 있다 .

손절매 구현

손절매를 설정하거나 이익을 취하는 방법은 주식이나 Forex와 같은 다른 시장과 다르다.

그 이유는 주식에는 기본 통화가 있기 때문이다. 

암호화폐에는 실제로 기본 통화의 개념이 없다. 거래를 할 때 한 통화를 다른 통화로 교환한다. 

이러한 이유로 바이낸스는 메인 주문에 기본적으로 손절매와 이익실현을 추가하는 것을 허용하지 않는다.

그러나 여전히 수동으로 구현할 수 있다.

이를 위해 OCO 주문을 할 수 있다. 아이디어는 손절매 또는 이익실현이 발생하면 다른 주문을 취소하는것이다.

주문으로 돌아가서 손절매를 구현하고 이익을 취하는 방법은 다음과 같다.

try:
    order = client.create_oco_order(
        symbol='ETHUSDT',
        side='SELL',
        quantity=100,
        price=250,
        stopPrice=150,
        stopLimitPrice=150,
        stopLimitTimeInForce='GTC')

except BinanceAPIException as e:
    # error handling goes here
    print(e)
except BinanceOrderException as e:
    # error handling goes here
    print(e)

stopPrice  stopLimitPrice를 모두 전달하고 있음에 유의해야 한다 . stopPrice 수준에 도달하면 stopLimitPrice를 사용 하여 지정가 주문이 이루어진다 . 대부분의 경우 가격은 이 두 매개변수에 대해 동일하다.

대부분의 자산이 손절매 지정가 주문을 허용하지만 모든 자산이 허용하는 것은 아니다. 주문하기 전에 지원 여부를 확인하는 것이 좋다.

이를 위해 아래와 같은 Endpoint 를 활용할 수 있다.

# use exchange info to confirm order types
info = client.get_symbol_info('ETHUSDT')
print(info['orderTypes'])

아래는 응답이다.

orderTypes 에서 이 자산에 대해 손절 제한이 실제로 허용됨을 보여준다.

이외 자산을 마진으로 거래할 수 있는지 여부, 최소 수량 및 틱 크기와 같은 다른 유용한 정보를 볼 수 있다.

'Project > AlgoTrading' 카테고리의 다른 글

Elliott Wave Analyzer 적용 [1]  (0) 2023.06.12
Binance API 기초 [3]  (1) 2023.06.06
Binance API 기초 [2]  (0) 2023.06.06
Binance API 기초 [1]  (0) 2023.06.06
Binance API를 이용한 Algorithm trading  (0) 2023.06.04