Python으로 UT Bot Alerts 지표 구현하기

UT Bot Alerts 는 오픈소스 스크립트로, Buy, Sell 시그널을 생성하는 지표입니다.
자동화된 알림 시스템을 통해 트레이딩 결정을 내릴 수 있습니다. 트레이더들은 자신의 트레이딩 조건에 맞춰 알림을 설정할 수 있으며, 조건에 따라 시장 움직임을 모니터링하고 트레이딩 기회를 식별할 수 있도록 지원합니다.

트레이딩뷰: https://kr.tradingview.com/v/n8ss8BID/

pip install pandas ccxt numpy

import pandas as pd
import ccxt
import numpy as np

# 예시) 바이낸스 선물 BTCUSDT, 1시간 봉 
bnb = ccxt.binance({'options': { 'defaultType': 'future' }}) 

def ATR(df, length):
    _df = df.copy()
    _df['HL'] = _df['high'] - _df['low']
    _df['HC'] = abs(_df['high'] - _df['close'].shift())
    _df['LC'] = abs(_df['low'] - _df['close'].shift())
    
    _df['TR'] = _df[['HL', 'HC', 'LC']].max(axis=1)
    df['ATR'] = _df['TR'].ewm(alpha=1/length, adjust=False).mean()

    return df['ATR']

def UT_BOT(key_value=1, atr_period=10):
    ohlcv = bnb.fetch_ohlcv(symbol="BTC/USDT", timeframe="1h", limit=500)
    df = pd.DataFrame(ohlcv, columns=['time', 'open', 'high', 'low', 'close', 'volume'])

    # Y-m-d H:is로 변환
    df['time'] = pd.to_datetime(df['time'], unit='ms').dt.tz_localize('UTC').dt.tz_convert('Asia/Seoul').dt.strftime('%Y-%m-%d %H:%M:%S')

    src = df['close']
    _df = df.copy()
    _df['ATR'] = ATR(_df, atr_period)
    _df['nLoss'] = key_value * _df['ATR']
    _df['xATRTrailingStop'] = np.nan

    for i in range(len(_df)):
        prev_stop = _df['xATRTrailingStop'].iloc[i - 1] if i > 0 else 0
        prev_close = src.iloc[i - 1] if i > 0 else 0

        if src.iloc[i] > prev_stop and prev_close > prev_stop:
            _df.loc[i, 'xATRTrailingStop'] = max(prev_stop, src.iloc[i] - _df['nLoss'].iloc[i])
        elif src.iloc[i] < prev_stop and prev_close < prev_stop:
            _df.loc[i, 'xATRTrailingStop'] = min(prev_stop, src.iloc[i] + _df['nLoss'].iloc[i])
        else:
            _df.loc[i, 'xATRTrailingStop'] = (
                src.iloc[i] - _df['nLoss'].iloc[i]
                if src.iloc[i] > prev_stop
                else src.iloc[i] + _df['nLoss'].iloc[i]
            )

    _df['Buy'] = (
        (src > _df['xATRTrailingStop']) &
        (src.shift(1) <= _df['xATRTrailingStop'].shift(1))
    )
    _df['Sell'] = (
        (src < _df['xATRTrailingStop']) &
        (src.shift(1) >= _df['xATRTrailingStop'].shift(1))
    )

    # Buy, Sell 시그널 저장
    df['UT'] = _df.apply(lambda row: 'Buy' if row['Buy'] else ('Sell' if row['Sell'] else ''), axis=1)
    
    # 시그널만 포착
    signal = df[df['UT'] != ''] 
    return signal

print(UT_BOT(key_value=1, atr_period=10)) # 트레이딩뷰 디폴트 값

트레이딩뷰 차트와 비교

해당시간 UT Bot – Sell 시그널입니다.

트레이딩뷰 차트와 동일합니다.