바이낸스 비트코인 선물 자동매매 프로그램 코딩 가이드

Published on: 2025-01-25

이번 포스팅에서는 바이낸스 API를 활용해서 비트코인 선물을 자동으로 매매하는 프로그램을 만드는 방법에 대해 소개해보겠습니다.

바이낸스 코인 선물이란?

국내 코인거래소에서는 현물 거래만 가능한 것에 반해 해외 거래소인 바이낸스에서는 선물 거래가 가능한데요. 선물 거래의 가장 큰 특징은 레버리지와 숏 포지션이 가능하다는 것입니다.

비트코인 변동성이 작아도 레버리지를 활용해 큰 수익을 얻을 수 있고 또한 비트코인이 가격이 떨어질 것으로 예상되는 경우에는 숏 포지션을 잡아 수익을 낼 수 있다는 것입니다.

하지만 그만큼 리스크도 커지기 때문에 고 배율의 레버리지나 숏 포지션은 추천드리지 않습니다.

자동매매 전략

아주 기본적인 기술적 매매 전략을 활용하는 파이썬 코드를 작성해보겠습니다. 이 예제에서는 이동평균을 사용하며 파이썬 언어를 통해 구현해보았습니다.

  • 이동 평균 교차 전략을 사용
  • 단기 이동평균이 장기 이동평균을 상향 돌파하면 BUY, 하향 돌파하면 SELL 신호를 생성합니다.
  • 그렇지 않은 경우 HODE 신호를 반환합니다.
  • 무한 루프로 매초 실행되며 주기적으로 데이터를 가져와 신호를 생성하고 주문을 실행합니다.

개발 환경 구성

비트코인 자동매매를 위해서는 먼저 API키를 발급 받아야합니다. API 발급 방법은 아래 링크를 참고해주세요

환경 구성을 위해 파이썬과 VScode를 설치합니다. 자세한 내용은 아래 링크를 참고해주세요.

자동매매 프로그램 환경 설정

프로젝트 폴더 생성

Vscode에서 폴더를 하나 생성해줍니다.

  • Vscode 상단에 파일 → 폴더 열기 → C드라이브에다가 폴더를 만들어줍니다.
  • 마우스 우클릭으로 새폴더를 만들어 줍니다. 저는 autocoin으로 폴더를 만들어 보았습니다.
  • 폴더 선택을 클릭합니다.

새파일을 클릭해서 trading.py 파일을 만들어줍니다.

가상 환경 구성

프로그래밍 전 가상환경을 구성하여 라이브러리와 파이썬 버전이 다른 프로젝트와 충돌하지 않도록 해주겠습니다.

가상환경 생성

아래 명령어로 가상환경 폴더 venv를 생성합니다. 윈도우 기준의 명령어입니다.

python -m venv venv

가상환경을 활성화 합니다.아래 코드를 띄어쓰기 없이 붙여넣어 줍니다.

venv\Scripts\activate

터미널 프롬프트 왼쪽에 가상환경 명칭이 표시되면 활성화된 상태입니다.

가상환경 설정에 대해 자세하게 알고 싶다면 아래 포스팅을 참고해주세요

필수 라이브러리 설치

먼저 필요한 라이브러리 3개를 설치해보겠습니다.

pip install python-binance pandas ta
  • python-binance: 바이낸스 API를 사용하기 위한 라이브러리
  • pandas: 데이터 처리를 위한 라이브러리
  • ta: 기술적 지표 계산을 위한 라이브러리

Vscode 상단 메뉴에서 터미널을 새로 생성한 후 터미널 창에 위에 코드를 입력하면 라이브러리가 설치됩니다.

환경 변수 파일 만들기

API 및 중요 변수를 저장할 환경 변수 파일을 만들어보겠습니다. 처음 trading.py을 만든거 처럼 폴더 명 옆의 새파일을 클릭하고 .env 파일을 만들어줍니다.

이전에 저장해 놓은 바이낸스 API키를 입력합니다. “” 사이에 자신의 키를 넣어줍니다.

.env 파일을 사용하기 위해 dotenv 패키지를 설치해줍니다. 아래 코드를 터미널에 입력해줍니다.

pip install python-dotenv

코드 구현

라이브러리 부분

import os
from binance.client import Client
from binance.enums import *
from binance.exceptions import BinanceAPIException
import pandas as pd
import ta
import time
from dotenv import load_dotenv

필요한 패키지를 사용하기 위해 가장 상단에 Import 해주겠습니다.

import os

운영 체제와 상호작용할 수 있는 기능을 제공하는 표준 라이브러리입니다. 환경 변수 접근 등에 사용됩니다.

from binance.client import Client

python-binance 라이브러리에서 Client 클래스를 임포트합니다. 이를 통해 바이낸스 API와 통신할 수 있습니다.

from binance.enums import *

바이낸스 API에서 사용하는 다양한 상수(enumerations)를 임포트합니다. 예를 들어, 주문 유형, 거래 쌍, 시간 간격 등을 정의하는 상수들이 포함됩니다.

from binance.exceptions import BinanceAPIException

바이낸스 API 호출 시 발생할 수 있는 예외를 처리하기 위한 예외 클래스를 임포트합니다.

import pandas as pd

데이터 조작과 분석을 위한 라이브러리인 pandaspd라는 약칭으로 임포트합니다. 주로 데이터프레임을 사용하여 데이터 처리를 수행합니다.

import ta

기술적 분석을 위한 지표를 계산하는 라이브러리인 ta를 임포트합니다. 이동 평균, RSI 등 다양한 기술적 지표를 계산할 수 있습니다.

import time

시간 관련 기능을 제공하는 표준 라이브러리입니다. 주로 코드 실행의 지연(sleep) 등에 사용됩니다.

from dotenv import load_dotenv

.env 파일에 저장된 환경 변수를 로드하기 위한 load_dotenv 함수를 임포트합니다. 이는 민감한 정보를 코드에 직접 포함시키지 않고 관리할 수 있게 해줍니다.

환경 변수 로드 및 키 가져오기

# 환경변수 로드
load_dotenv()

# 환경 변수에서 API 키와 시크릿 키 가져오기 (보안 권장)
API_KEY = os.getenv('BINANCE_API_KEY')
API_SECRET = os.getenv('BINANCE_API_SECRET')

client = Client(API_KEY, API_SECRET)

.env 파일에서 환경변수를 받아오기 위해 환경 변수를 로드하고 환경변수에서 API키와 시크릿 키를 가져오는 코드를 구현합니다.

load_dotenv()

현재 작업 디렉토리 또는 지정된 경로에 있는 .env 파일을 읽어 환경 변수로 로드합니다. 이를 통해 API 키와 시크릿 키와 같은 민감한 정보를 안전하게 관리할 수 있습니다.

API_KEY = os.getenv(‘BINANCE_API_KEY’)

환경 변수에서 BINANCE_API_KEY 값을 가져와 API_KEY 변수에 저장합니다. 이는 바이낸스 API에 접근하기 위한 공개 키입니다.

API_SECRET = os.getenv(‘BINANCE_API_SECRET’)

환경 변수에서 BINANCE_API_SECRET 값을 가져와 API_SECRET 변수에 저장합니다. 이는 바이낸스 API에 접근하기 위한 비밀 키입니다.

client = Client(API_KEY, API_SECRET)

  • python-binance 라이브러리의 Client 클래스를 사용하여 바이낸스 API 클라이언트를 초기화합니다.
  • API_KEYAPI_SECRET을 인자로 전달하여 인증을 수행합니다.
  • 이 클라이언트를 통해 바이낸스의 다양한 API 엔드포인트(예: 현재 가격 조회, 주문 생성, 잔고 확인 등)에 접근할 수 있습니다.

전역변수

# 매매에 사용할 심볼과 시간대 설정
SYMBOL = 'BTCUSDT'
INTERVAL = '1h'
LIMIT = 100

# 이동 평균 기간 설정
SHORT_WINDOW = 10
LONG_WINDOW = 30

SYMBOL = ‘BTCUSDT’

거래할 자산의 심볼(거래쌍)을 설정합니다. 여기서 'BTCUSDT'는 비트코인(BTC)과 테더(USDT) 간의 거래를 의미합니다.

INTERVAL = ‘1h’

캔들 데이터의 시간 간격을 설정합니다. '1h'는 1시간 간격의 캔들 데이터를 의미합니다. 예를 들어, '1m'은 1분 간격, '4h'는 4시간 간격의 데이터를 의미합니다.

바이낸스 API는 다양한 시간 간격을 지원합니다. 가능한 값들은 '1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', '6h', '8h', '12h', '1d', '3d', '1w', '1M' 등이 있습니다.

LIMIT = 100

과거 데이터(캔들)를 몇 개까지 가져올지 설정합니다. 여기서는 최신 100개의 캔들 데이터를 가져오도록 설정되어 있습니다.

SHORT_WINDOW = 10

단기 이동 평균(SMA_Short)의 계산에 사용할 기간을 설정합니다. 여기서는 10기간(예: 10시간)의 이동 평균을 계산합니다.

LONG_WINDOW = 30

장기 이동 평균(SMA_Long)의 계산에 사용할 기간을 설정합니다. 여기서는 30기간(예: 30시간)의 이동 평균을 계산합니다.

캔들데이터 획득 함수

def get_historical_klines(symbol, interval, limit):
    """과거 캔들 데이터를 가져오는 함수"""
    klines = client.futures_klines(symbol=symbol, interval=interval, limit=limit)
    df = pd.DataFrame(klines, columns=[
        'timestamp', 'open', 'high', 'low', 'close', 'volume',
        'close_time', 'quote_asset_volume', 'number_of_trades',
        'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'
    ])
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
    for col in ['open', 'high', 'low', 'close', 'volume']:
        df[col] = df[col].astype(float)
    return df

함수 전체 개요

  • 함수명: get_historical_klines
  • 목적: 지정된 거래쌍(symbol), 시간 간격(interval), 데이터 개수(limit)에 따라 바이낸스 선물 API로부터 과거 캔들 데이터를 가져와서 정리된 pandas DataFrame으로 반환합니다.

함수 정의

def get_historical_klines(symbol, interval, limit):

함수 정의부로, symbol, interval, limit 세 가지 매개변수를 받습니다.

  • symbol: 거래할 자산의 심볼(예: ‘BTCUSDT’)
  • interval: 캔들 데이터의 시간 간격(예: ‘1h’는 1시간 간격)
  • limit: 가져올 캔들 데이터의 개수

바이낸스 API 호출

klines = client.futures_klines(symbol=symbol, interval=interval, limit=limit)

client.futures_klines : python-binance 라이브러리의 Client 객체를 사용하여 바이낸스 선물 API의 futures_klines 엔드포인트를 호출합니다.

매개변수

  • symbol=symbol: 가져올 데이터의 거래쌍을 지정합니다.
  • interval=interval: 캔들의 시간 간격을 지정합니다.
  • limit=limit: 가져올 캔들의 개수를 지정합니다.

바이낸스 API로부터 받은 캔들 데이터는 리스트 형태로 반환되며, 각 캔들은 여러 개의 필드를 포함합니다.

데이터프레임으로 변환

df = pd.DataFrame(klines, columns=[…])

  • pd.DataFrame: pandas 라이브러리를 사용하여 리스트 형태의 데이터를 데이터프레임으로 변환합니다.
  • klines: 이전 단계에서 가져온 캔들 데이터 리스트입니다.
  • columns=[…]: 데이터프레임의 각 열에 대한 이름을 지정합니다. 바이낸스 API의 futures_klines 응답은 특정 순서로 필드가 제공되므로, 이를 알아보기 쉽게 열 이름을 지정합니다.

열 이름 설명

  • ‘timestamp’: 캔들이 시작된 시간 (밀리초 단위 타임스탬프)
  • ‘open’: 캔들의 시가
  • ‘high’: 캔들의 고가
  • ‘low’: 캔들의 저가
  • ‘close’: 캔들의 종가
  • ‘volume’: 캔들의 거래량
  • ‘close_time’: 캔들이 종료된 시간 (밀리초 단위 타임스탬프)
  • ‘quote_asset_volume’: 견적 자산(예: USDT)으로 표시된 거래량
  • ‘number_of_trades’: 캔들 기간 동안 발생한 거래 수
  • ‘taker_buy_base_asset_volume’: 테이커가 구매한 기본 자산의 거래량
  • ‘taker_buy_quote_asset_volume’: 테이커가 구매한 견적 자산의 거래량
  • ‘ignore’: 현재 사용되지 않는 필드

타임스탬프 변환

df[‘timestamp’] = pd.to_datetime(df[‘timestamp’], unit=’ms’)

  • pd.to_datetime: pandas의 함수로, 숫자형 타임스탬프를 datetime 객체로 변환합니다.
  • df[‘timestamp’]: 데이터프레임의 ‘timestamp’ 열을 선택합니다.
  • unit=’ms’: 타임스탬프가 밀리초 단위임을 지정합니다.

‘timestamp’ 열의 값이 사람이 읽을 수 있는 날짜 및 시간 형식으로 변환됩니다.

데이터 타입 변환

for col in [‘open’, ‘high’, ‘low’, ‘close’, ‘volume’]:

반복문을 사용하여 지정된 열들의 데이터 타입을 변환합니다.

df[col] = df[col].astype(float)

각 열의 데이터를 float 타입으로 변환합니다.

대상 열:

  • ‘open’: 시가
  • ‘high’: 고가
  • ‘low’: 저가
  • ‘close’: 종가
  • ‘volume’: 거래량

숫자 데이터를 실수형으로 변환하여 이후의 수치 분석 및 계산이 용이하도록 합니다.

데이터프레임 반환

return df

정리된 pandas DataFrame을 함수의 호출 지점으로 반환합니다.

반환된 데이터프레임의 구조

  • ‘timestamp’: datetime 형식
  • ‘open’, ‘high’, ‘low’, ‘close’, ‘volume’ : float 형식
  • 기타 열들: 필요에 따라 추가로 사용할 수 있지만, 현재 함수에서는 주로 시계열 분석을 위한 기본적인 가격 및 거래량 데이터에 초점을 맞춥니다.

기술적 지표 적용 함수

def apply_technical_indicators(df):
    """기술적 지표 적용 함수"""
    df['SMA_Short'] = ta.trend.sma_indicator(df['close'], window=SHORT_WINDOW)
    df['SMA_Long'] = ta.trend.sma_indicator(df['close'], window=LONG_WINDOW)
    return df

함수 전체 개요

  • 함수명: apply_technical_indicators
  • 목적: 입력된 pandas DataFrame에 기술적 지표인 단순 이동 평균(SMA)을 계산하여 새로운 열로 추가합니다.
  • 입력: df (pandas DataFrame) – 과거 캔들 데이터가 포함된 데이터프레임
  • 출력: 기술적 지표가 추가된 df 데이터프레임

함수 정의

def apply_technical_indicators(df):

def apply_technical_indicators(df):

  • 함수 정의부로, df라는 하나의 매개변수를 받습니다.
  • df는 이전 단계에서 생성된 pandas DataFrame으로, 과거 캔들 데이터(시가, 고가, 저가, 종가, 거래량 등)를 포함하고 있어야 합니다.

단기 단순 이동 평균(SMA_Short) 계산 및 추가

df['SMA_Short'] = ta.trend.sma_indicator(df['close'], window=SHORT_WINDOW)

df[‘SMA_Short’]

  • 데이터프레임 df에 새로운 열 'SMA_Short'를 생성합니다.
  • 이 열은 단기 단순 이동 평균 값을 저장하게 됩니다.

ta.trend.sma_indicator(df[‘close’], window=SHORT_WINDOW)

  • ta 라이브러리: 기술적 분석을 위한 라이브러리로, 다양한 지표를 계산할 수 있습니다.
  • ta.trend.sma_indicator: ta 라이브러리의 trend 모듈에 있는 sma_indicator 함수로, 단순 이동 평균을 계산합니다.
  • df['close']: 종가 데이터를 의미합니다. 단순 이동 평균은 종가를 기반으로 계산됩니다.
  • window=SHORT_WINDOW: 이동 평균을 계산할 기간을 설정합니다. 여기서 SHORT_WINDOW는 단기 이동 평균의 기간을 나타내며, 이전에 설정된 값(예: 10)이 사용됩니다.

'SMA_Short' 열에는 지정된 단기 기간(SHORT_WINDOW) 동안의 종가의 단순 이동 평균 값이 계산되어 저장됩니다.

예를 들어, SHORT_WINDOW = 10이라면, 최근 10개의 종가의 평균값이 'SMA_Short'에 저장됩니다.

장기 단순 이동 평균(SMA_Long) 계산 및 추가

df['SMA_Long'] = ta.trend.sma_indicator(df['close'], window=LONG_WINDOW)

df[‘SMA_Long’]

  • 데이터프레임 df에 새로운 열 'SMA_Long'를 생성합니다.
  • 이 열은 장기 단순 이동 평균 값을 저장하게 됩니다.

ta.trend.sma_indicator(df[‘close’], window=LONG_WINDOW)

  • ta.trend.sma_indicator: 단순 이동 평균을 계산하는 함수입니다.
  • df['close']: 종가 데이터를 사용하여 이동 평균을 계산합니다.
  • window=LONG_WINDOW: 이동 평균을 계산할 기간을 설정합니다. 여기서 LONG_WINDOW는 장기 이동 평균의 기간을 나타내며, 이전에 설정된 값(예: 30)이 사용됩니다.

'SMA_Long' 열에는 지정된 장기 기간(LONG_WINDOW) 동안의 종가의 단순 이동 평균 값이 계산되어 저장됩니다.

예를 들어, LONG_WINDOW = 30이라면, 최근 30개의 종가의 평균값이 'SMA_Long'에 저장됩니다.

데이터프레임 반환

return df

return df

  • 기술적 지표가 추가된 데이터프레임 df를 반환합니다.
  • 반환된 데이터프레임은 이후 단계에서 매매 신호 생성이나 시각화 등에 활용될 수 있습니다.

매매 신호 생성 함수

def generate_signals(df):
    """매매 신호 생성 함수"""
    if df['SMA_Short'].iloc[-2] < df['SMA_Long'].iloc[-2] and df['SMA_Short'].iloc[-1] > df['SMA_Long'].iloc[-1]:
        return 'BUY'
    elif df['SMA_Short'].iloc[-2] > df['SMA_Long'].iloc[-2] and df['SMA_Short'].iloc[-1] < df['SMA_Long'].iloc[-1]:
        return 'SELL'
    else:
        return 'HOLD'

함수 전체 개요

  • 함수명: generate_signals
  • 목적: 입력된 pandas DataFrame에서 단기 및 장기 단순 이동 평균(SMA_Short 및 SMA_Long)을 기반으로 매매 신호(BUY, SELL, HOLD)를 생성합니다.
  • 입력: df (pandas DataFrame) – 기술적 지표가 적용된 데이터프레임으로, 최소한 'SMA_Short''SMA_Long' 열을 포함해야 합니다.
  • 출력: 문자열 'BUY', 'SELL', 또는 'HOLD' 중 하나를 반환하여 매매 신호를 나타냅니다.

함수 정의

def generate_signals(df):
    """매매 신호 생성 함수"""

def generate_signals(df):

함수 정의부로, df라는 하나의 매개변수를 받습니다.

df는 이전에 기술적 지표가 적용된 pandas DataFrame으로, 'SMA_Short''SMA_Long' 열을 반드시 포함해야 합니다.

매수(BUY) 신호 생성 조건

if df['SMA_Short'].iloc[-2] < df['SMA_Long'].iloc[-2] and df['SMA_Short'].iloc[-1] > df['SMA_Long'].iloc[-1]:
    return 'BUY'

df[‘SMA_Short’].iloc[-2] < df[‘SMA_Long’].iloc[-2]

  • 두 번째 마지막(이전) 데이터 포인트에서 단기 이동 평균이 장기 이동 평균보다 낮았음을 의미합니다.
  • 즉, 과거에 단기 이동 평균이 장기 이동 평균보다 낮았던 상황을 나타냅니다.

df[‘SMA_Short’].iloc[-1] > df[‘SMA_Long’].iloc[-1]

  • 가장 최근의 데이터 포인트에서 단기 이동 평균이 장기 이동 평균보다 높아졌음을 의미합니다.
  • 즉, 단기 이동 평균이 장기 이동 평균을 상향 돌파한 상황을 나타냅니다.

결합 조건 (and)

이전 데이터 포인트에서 단기 이동 평균이 장기 이동 평균보다 낮았고, 현재 데이터 포인트에서 단기 이동 평균이 장기 이동 평균보다 높아졌다면 이는 골든 크로스(Golden Cross) 라고 불리며, 강한 매수 신호로 해석됩니다.

결과: 조건이 참이면 'BUY' 신호를 반환합니다.

매도(SELL) 신호 생성 조건

elif df['SMA_Short'].iloc[-2] > df['SMA_Long'].iloc[-2] and df['SMA_Short'].iloc[-1] < df['SMA_Long'].iloc[-1]:
    return 'SELL'

df[‘SMA_Short’].iloc[-2] > df[‘SMA_Long’].iloc[-2]

  • 두 번째 마지막(이전) 데이터 포인트에서 단기 이동 평균이 장기 이동 평균보다 높았음을 의미합니다.
  • 즉, 과거에 단기 이동 평균이 장기 이동 평균보다 높았던 상황을 나타냅니다.

df[‘SMA_Short’].iloc[-1] < df[‘SMA_Long’].iloc[-1]

  • 가장 최근의 데이터 포인트에서 단기 이동 평균이 장기 이동 평균보다 낮아졌음을 의미합니다.
  • 즉, 단기 이동 평균이 장기 이동 평균을 하향 돌파한 상황을 나타냅니다.

결합 조건 (and)

이전 데이터 포인트에서 단기 이동 평균이 장기 이동 평균보다 높았고, 현재 데이터 포인트에서 단기 이동 평균이 장기 이동 평균보다 낮아졌다면 이는 데드 크로스(Death Cross) 라고 불리며, 강한 매도 신호로 해석됩니다.

결과: 조건이 참이면 'SELL' 신호를 반환합니다.

보류(HOLD) 신호 생성 조건

else:
return 'HOLD'
  • 위의 매수 또는 매도 조건이 모두 충족되지 않는 경우, 현재 시점에서는 매수나 매도 신호가 없음을 나타냅니다.
  • 따라서 'HOLD' 신호를 반환하여 현재 포지션을 유지하거나 새로운 포지션을 취하지 않도록 지시합니다.

주문 실행 함수

def place_order(signal):
    """주문 실행 함수"""
    try:
        if signal == 'BUY':
            print("매수 주문 실행")
            # 시장가 매수 주문 예제
            order = client.futures_create_order(
                symbol=SYMBOL,
                side=SIDE_BUY,
                type=ORDER_TYPE_MARKET,
                quantity=0.001  # 주문 수량은 적절히 설정
            )
            print(order)
        elif signal == 'SELL':
            print("매도 주문 실행")
            # 시장가 매도 주문 예제
            order = client.futures_create_order(
                symbol=SYMBOL,
                side=SIDE_SELL,
                type=ORDER_TYPE_MARKET,
                quantity=0.001  # 주문 수량은 적절히 설정
            )
            print(order)
        else:
            print("신호 없음. 대기 중...")
    except BinanceAPIException as e:
        print(f"주문 실패: {e.message}")

함수 전체 개요

  • 함수명: place_order
  • 목적: 입력된 매매 신호(signal)에 따라 바이낸스 선물 시장에서 실제 매수 또는 매도 주문을 실행합니다.
  • 입력: signal (문자열) – 'BUY', 'SELL', 또는 'HOLD' 중 하나의 값을 가질 수 있습니다.
  • 출력: 함수는 주문 결과를 출력하며, 예외 발생 시 오류 메시지를 출력합니다.

함수 정의

def place_order(signal):
    """주문 실행 함수"""

def place_order(signal):

  • 함수 정의부로, signal이라는 하나의 매개변수를 받습니다.
  • signal은 이전 단계에서 생성된 매매 신호로, 'BUY', 'SELL', 또는 'HOLD'의 값을 가집니다.

예외 처리 블록 (try-except)

try:
    # 주문 실행 로직
except BinanceAPIException as e:
    print(f"주문 실패: {e.message}")

try

  • 예외가 발생할 수 있는 코드를 감싸는 블록입니다. 여기서는 주문 실행과 관련된 코드가 포함됩니다.

except BinanceAPIException as e:

  • BinanceAPIException 예외가 발생할 경우 이를 잡아내어 처리합니다.
  • e.message: 예외 메시지를 출력하여 어떤 오류가 발생했는지 알 수 있도록 합니다.

API 호출 중 네트워크 오류, 인증 실패, 주문 제한 등 다양한 예외 상황을 처리하여 프로그램이 예기치 않게 종료되는 것을 방지합니다.

매수 주문 실행 (BUY 신호 처리)

if signal == 'BUY':
    print("매수 주문 실행")
    # 시장가 매수 주문 예제
    order = client.futures_create_order(
        symbol=SYMBOL,
        side=SIDE_BUY,
        type=ORDER_TYPE_MARKET,
        quantity=0.001  # 주문 수량은 적절히 설정
    )
    print(order)

if signal == ‘BUY’:

  • 입력된 signal'BUY'인 경우 매수 주문을 실행합니다.

print(“매수 주문 실행”)

  • 매수 주문을 실행하기 전에 사용자에게 알림을 출력합니다.

client.futures_create_order(…)

  • client: 이전에 초기화한 바이낸스 API 클라이언트 객체입니다.
  • futures_create_order: 바이낸스 선물 시장에서 주문을 생성하는 메서드입니다.

매개변수

  • symbol=SYMBOL: 거래할 자산의 심볼(예: 'BTCUSDT').
  • side=SIDE_BUY: 주문의 방향을 지정합니다. 'BUY'는 매수를 의미합니다.
  • type=ORDER_TYPE_MARKET: 주문 유형을 지정합니다. 여기서는 시장가 주문('MARKET')을 사용합니다.
  • quantity=0.001: 주문 수량을 지정합니다. 실제 거래 시 적절한 수량으로 설정해야 합니다.

print(order)

  • 주문이 성공적으로 생성되면 주문의 상세 정보를 출력합니다. 주문 ID, 상태, 가격 등 다양한 정보가 포함됩니다.

매도 주문 실행 (SELL 신호 처리)

elif signal == 'SELL':
    print("매도 주문 실행")
    # 시장가 매도 주문 예제
    order = client.futures_create_order(
        symbol=SYMBOL,
        side=SIDE_SELL,
        type=ORDER_TYPE_MARKET,
        quantity=0.001  # 주문 수량은 적절히 설정
    )
    print(order)

elif signal == ‘SELL’:

  • 입력된 signal'SELL'인 경우 매도 주문을 실행합니다.

print(“매도 주문 실행”)

  • 매도 주문을 실행하기 전에 사용자에게 알림을 출력합니다.

client.futures_create_order(…)

  • side=SIDE_SELL: 주문의 방향을 지정합니다. 'SELL'은 매도를 의미합니다.
  • 나머지 매개변수는 매수 주문과 동일하게 설정됩니다.

print(order)

  • 주문이 성공적으로 생성되면 주문의 상세 정보를 출력합니다.

HOLD 신호 처리

else:
    print("신호 없음. 대기 중...")

else:

  • 입력된 signal'BUY''SELL'이 아닌 경우에 해당합니다. 보통 'HOLD' 신호가 여기에 해당됩니다.

print(“신호 없음. 대기 중…”)

  • 현재 신호에 따라 매매를 실행하지 않고 대기 중임을 사용자에게 알립니다.

메인 함수

def main():
    while True:
        df = get_historical_klines(SYMBOL, INTERVAL, LIMIT)
        df = apply_technical_indicators(df)
        signal = generate_signals(df)
        print(f"현재 신호: {signal}")
        place_order(signal)
        # 다음 신호를 확인하기 전 대기 시간 (예: 1시간)
        time.sleep(3600)

if __name__ == "__main__":
    main()

함수 전체 개요

  • 출력: 없음 (주기적으로 주문을 실행하고 신호를 출력
  • 함수명: main
  • 목적: 지속적으로 시장 데이터를 수집하고, 기술적 지표를 적용하여 매매 신호를 생성한 후, 해당 신호에 따라 매수 또는 매도 주문을 실행하는 무한 루프를 실행합니다.
  • 입력: 없음

함수 정의

def main():
  • main 함수를 정의합니다.
  • 이 함수는 프로그램의 주요 실행 로직을 포함하며, 무한 루프를 통해 지속적으로 작동합니다.

무한 루프 (while True)

while True:
  • while 루프는 조건이 참인 동안 계속해서 반복됩니다.
  • True는 항상 참이므로, 이 루프는 무한히 반복됩니다.

프로그램이 종료되지 않고 지속적으로 데이터를 수집하고, 매매를 수행할 수 있도록 합니다.

과거 캔들 데이터 수집

df = get_historical_klines(SYMBOL, INTERVAL, LIMIT)

get_historical_klines 함수 호출:

  • 지정된 심볼(SYMBOL), 시간대(INTERVAL), 그리고 데이터 개수(LIMIT)에 따라 과거 캔들 데이터를 바이낸스 API로부터 가져옵니다.
  • 이 함수는 pandas DataFrame 형태의 데이터를 반환합니다.

현재 시장 상황을 분석하기 위한 과거 데이터를 수집합니다. 이후 단계에서 기술적 지표를 계산하고 매매 신호를 생성하는 데 사용됩니다.

기술적 지표 적용

df = apply_technical_indicators(df)

apply_technical_indicators 함수 호출:

  • 수집된 데이터프레임(df)에 기술적 지표(예: 단기 및 장기 단순 이동 평균)를 적용합니다.
  • 이 함수는 계산된 지표를 데이터프레임에 추가하고, 업데이트된 데이터프레임을 반환합니다.

매매 신호를 생성하기 위한 기반을 마련합니다. 기술적 지표는 시장의 추세를 파악하고, 매매 신호를 도출하는 데 사용됩니다.

매매 신호 생성

signal = generate_signals(df)

signal = generate_signals(df)

generate_signals 함수 호출:

  • 업데이트된 데이터프레임(df)을 기반으로 매매 신호를 생성합니다.
  • 함수는 'BUY', 'SELL', 또는 'HOLD' 중 하나의 문자열을 반환합니다.

현재 시장 상황에 따른 매매 결정을 내립니다. 생성된 신호에 따라 실제 주문이 실행됩니다.

매매 신호 출력

print(f"현재 신호: {signal}")
  • 현재 생성된 매매 신호를 콘솔에 출력합니다.
  • 예를 들어, 'BUY', 'SELL', 또는 'HOLD'가 출력됩니다.

실시간으로 신호를 모니터링하고, 프로그램의 진행 상황을 확인할 수 있습니다. 디버깅 또는 로깅 목적으로 유용합니다.

주문 실행

place_order(signal)

place_order 함수 호출

  • 생성된 매매 신호(signal)에 따라 실제 주문을 바이낸스 선물 시장에 실행합니다.
  • signal'BUY'인 경우 매수 주문을, 'SELL'인 경우 매도 주문을 실행합니다.
  • 'HOLD'인 경우 주문을 실행하지 않고 대기합니다.

자동화된 거래를 통해 신호에 따른 매매를 수행합니다. 이 과정에서 실제 자금이 사용되므로, 신중하게 다루어져야 합니다.

대기 시간 설정

# 다음 신호를 확인하기 전 대기 시간 (예: 1시간)
time.sleep(3600)
  • 프로그램의 실행을 일시 중지시킵니다.
  • 3600초(1시간) 동안 대기합니다.

다음 신호를 확인하기 전 일정 시간 동안 대기하여 무리한 API 호출을 방지하고, 전략에 맞게 주기적으로 매매를 수행합니다. 예를 들어, 숫자를 10으로 변경 시 10초 간격으로 함수가 수행됩니다.

프로그램 실행 시작

if __name__ == "__main__":
    main()
  • 현재 스크립트가 직접 실행될 때만 main() 함수를 호출하도록 합니다.
  • 다른 스크립트에서 모듈로 임포트될 경우 main() 함수가 실행되지 않습니다.

모듈화된 코드 재사용성을 높이고, 스크립트가 의도치 않게 실행되는 것을 방지합니다.

코드 다운로드

아래 링크를 통해 코드를 다운받으실 수 있습니다. 위 코드는 가장 기본적인 로직으로 자신만의 전략을 연구해서 충분히 테스트 후 매매를 하시는 것을 권장합니다.

위 링크 클릭 후 파일명을 클릭합니다.

오른쪽 상단에 다운로드 버튼을 클릭하거나 소스 전체를 복사해서 자신의 파이썬 파일로 붙여넣습니다.