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 |