돈벌고싶다

바이비트와 파이썬을 이용한 자동매매 프로그램 - 2. 기초 본문

자동매매-바이비트

바이비트와 파이썬을 이용한 자동매매 프로그램 - 2. 기초

coinwithpython 2022. 4. 26. 22:01
728x90
반응형

 

저번 글에 이어, 이번엔 실습을 진행해 보도록 하겠습니다. 목차는 다음과 같습니다.

1. 라이브러리 호출

2. Request를 위한 Settings

3. 매매환경 설정

4. 포지션 진입

5. 포지션 청산

6. 마무리

 


 

1. 라이브러리 호출

 

from pybit import inverse_perpetual
from pybit import usdt_perpetual
import datetime

 

bybit API 관련해서 이전 코드들을 보면 inverse_perpetual과 usdt_perpetual을 구분짓지 않고 라이브러리를 호출하는데, 2022년 4월 26일 현재는 그런식으로 호출할 경우 warning이 뜹니다. 깔끔하게 위와 같이 호출하도록 합니다.

 


 

2. Request를 위한 Settings

 

# session = inverse_perpetual.HTTP(
#     endpoint="https://api.bybit.com", 
#     api_key='본인의 api key', 
#     api_secret='본인의 secret key',
# )

# session = inverse_perpetual.HTTP(
#     endpoint="https://api-testnet.bybit.com", 
#     api_key='본인의 api key', 
#     api_secret='본인의 secret key',
# )

# session = usdt_perpetual.HTTP(
#     endpoint="https://api.bybit.com", 
#     api_key='본인의 api key', 
#     api_secret='본인의 secret key',
# )

session = usdt_perpetual.HTTP(
    endpoint="https://api-testnet.bybit.com", 
    api_key='본인의 api key', 
    api_secret='본인의 secret key',
)

 

Bybit API를 이용하기 위한 기본 setting입니다. inverse 거래를 하고 싶다면 2번 코드를, USDT 거래를 하고 싶다면 4번 코드를 사용하시면 됩니다. 또한 testnet에서의 충분한 매매를 거친 뒤 실제 사용하자 한다면 1번 3번을 선택하시면 됩니다.

 

 


 

3. 매매환경 설정

 

symbol = "BTCUSDT"
leverage = 20

try:
    session.set_leverage(
        symbol=symbol,
        buy_leverage=leverage,
        sell_leverage=leverage
    )
except:
    pass

try:
    session.cross_isolated_margin_switch(
        symbol=symbol,
        is_isolated=True,
    )
except:
    pass

 

매매 환경설정에 관한 내용입니다. symbol과 leverage의 경우 추후 매매법에 대한 조건문을 걸 때 매우 많이 써야 하므로 미리 변수로 정의해줍니다.

set_leverage의 경우 leverage를 설정해주는 함수이고, cross_isolated_margin_switch의 경우 교차/격리 설정을 해주는 함수입니다. 위 코드의 경우 BTCUSDT에 대해 long과 short 모두 20배 레버리지를 두고 격리 설정을 해둔 상태입니다. is_isolated=False로 설정할 시 교차로 설정됩니다.

각각의 설정을 try 안에 넣었는데, 그 이유는 수정할 내용이 없을 경우(이미 레버리지가 20배, 격리 포지션으로 설정 되어 있는 경우) error가 나기 때문입니다.

 


 

4. 포지션 진입

 

now = datetime.datetime.utcnow()
price_now = session.public_trading_records(symbol=symbol,limit=1)['result'][0]['price']

# long
try:
    session.place_active_order(
        symbol=symbol,
        side='Buy',
        order_type="Market",
        qty=0.01,
        time_in_force="GoodTillCancel",
        reduce_only=False,
        close_on_trigger=False,
    )
    print(now.strftime("%H:%M:%S"), '에 $', price_now, 'long 진입')
except:
    print(now.strftime("%H:%M:%S"), '에 $', price_now, 'long 진입 과정에서 error 발생')


# short
try:
    session.place_active_order(
        symbol=symbol,
        side='Sell',
        order_type="Limit",
        qty=0.01,
        price=price_now
        time_in_force="GoodTillCancel",
        reduce_only=False,
        close_on_trigger=False,
    )
    print(now.strftime("%H:%M:%S"), '에 $', price_now, 'short 진입')
except:
    print(now.strftime("%H:%M:%S"), '에 $', price_now, 'short 진입 과정에서 error 발생')

 

매매가 이루어지거나 이루어지다가 error가 발생하는 경우 시간을 알기 위해 현재 시간을 now 변수에 저장합니다. 매매의 경우 place_active_order 함수를 이용합니다. long의 경우 side를 'Buy', short의 경우 side를 'Sell'로 설정합니다. 시장가 주문을 원하는 경우 order_type을 'Market'으로, 지정가 주문을 원하는 경우 order_type을 'Limit'으로 설정합니다. 지정가 주문의 경우 가격 또한 지정해야 하기 때문에, price 파라미터를 추가해줍니다. qty는 주문할 수량을 적는 파라미터로, 코인 단위로 작성되어야 합니다. long이던 short이던 포지션 진입이라면 reduce_only와 close_on_trigger는 반드시 False로 설정해주셔야 합니다.

 


 

5. 포지션 청산

 

now = datetime.datetime.utcnow()
price_now = session.public_trading_records(symbol=symbol,limit=1)['result'][0]['price']

# long
try:
    session.place_active_order(
        symbol=symbol,
        side='Sell',
        order_type="Market",
        qty=0.01,
        time_in_force="GoodTillCancel",
        reduce_only=True,
        close_on_trigger=True,
    )
    print(now.strftime("%H:%M:%S"), '에 $', price_now, 'long 청산')
except:
    print(now.strftime("%H:%M:%S"), '에 $', price_now, 'long 청산 과정에서 error 발생')


# short
try:
    session.place_active_order(
        symbol=symbol,
        side='Buy',
        order_type="Limit",
        qty=0.01,
        price=price_now
        time_in_force="GoodTillCancel",
        reduce_only=True,
        close_on_trigger=True,
    )
    print(now.strftime("%H:%M:%S"), '에 $', price_now, 'short 청산')
except:
    print(now.strftime("%H:%M:%S"), '에 $', price_now, 'short 청산 과정에서 error 발생')

 

청산은 진입과 비슷합니다. 단, 이번에는 진입과는 반대로 long 청산의 경우 side를 'Sell'으로, short 청산의 경우 side를 'Buy'로 설정해야 합니다. 또한 reduce_only와 close_on_trigger을 True로 설정해주셔야 합니다.

 


 

6. 마무리

 

여기까지 파이썬 코드와 API를 활용하여 바이비트에서 매매 설정을 하고 거래를 해보았습니다. 꼭 당부드리고 싶은게 있다면 반드시 예외처리를 모든 api 호출에 넣어야 합니다(try-except문). API연동이란게 워낙에 변수가 많이 존재하기 때문입니다. 다음 글에선 오늘 다룬 기초를 토대로 자동매매하는 코드를 작성해보겠습니다.

728x90
반응형
Comments