BinanceVolatilityBot์ CCXT๋ฅผ ์ด์ฉํ์ฌ ์๋๋งค๋งค ๋ด์ ๊ตฌํํ ํ๋ก์ ํธ์ ๋๋ค. ์ด ๋ด์ ๋ณ๋์ฑ ๋ํ ์ ๋ต๊ณผ EMA ๊ธฐ๋ฐ ์ถ์ธ ์ถ์ข ์ ๋ต์ ์ ์ฉํ์ฌ ์๋์ผ๋ก ์ ๋ฌผ๊ฑฐ๋๋ฅผ ์ํํฉ๋๋ค.
Manual ยท FAQ ยท Examples ยท Contributing
๋ณ๋์ฑ ๋ํ ์ ๋ต ์์
(https://www.tradingview.com/chart/TSLA/vlvAMwqN-Volatility-Breakout-Trading-Explained/)
๋ํ ๊ฐ๊ฒฉ = ํ์ฌ ์๊ฐ + (์ด์ ๊ณ ๊ฐ - ์ด์ ์ ๊ฐ) * k๊ฐ
์ค๋ ๊ฐ๊ฒฉ์ด ๋ํ ๊ฐ๊ฒฉ์ ๋์ด๊ฐ๋ฉด ๋งค์ํ๊ณ ๋ค์๋ ์์นจ ์ฅ์ด ์์ํ๋ฉด ๋ชจ๋ ๋งค๋ํ๋ค.
์ด์ ์๊ฐ : $920, ์ด์ ๊ณ ๊ฐ : $1000, ์ด์ ์ ๊ฐ : $900, ์ด์ ์ข ๊ฐ $960
ํ์ฌ ์๊ฐ : $960
๋ํ ๊ฐ๊ฒฉ = $960 + ($1000 - $900) * 0.6 = $1020
ํ์ฌ ์ฅ์ค์ ๋ํ ๊ฐ๊ฒฉ $1020์ ๋์ด์๋ฉด ๋งค์ํด์ ๋ค์ ์์์ ๋ชจ๋ ๋งค๋
์๋๋ ์ด๋ฌํ ๋งค๋งค ์ ๋ต์ ๋ฐฑํ ์คํ ์ผ๋ก ๊ตฌํํ ๊ฒฐ๊ณผ์ ๋๋ค. ๋ฐฑํ ์คํ ์ฝ๋๋ backtest.py์์ ํ์ธํ ์ ์์ต๋๋ค.
๋กฑ ํฌ์ง์
:
๋นจ๊ฐ์์ด ์ ์ด์ต์
๋๋ค. ์์๋ฃ๋ฅผ ์ ์ธํ๊ณ ๋งค์ ํฌ์ง์
๋ง ์ก์ ์ 200์ผ๊ฐ์ ๋์ ์์ต์ ์งํ๋ก ๋ํ๋ด์์ต๋๋ค.
MDD :
MDD(Most Drawdown, ์ต๋ ์์ค ๋ํญ)๋ ๋์ ์ด์ต๋ฅ ์ ์ต๋๊ฐ(Peak)์์ ๊ฐ์ฅ ํฌ๊ฒ ํ๋ฝํ ๋น์จ์ ๋ฐฑ๋ถ์จ๋ก ๋ํ๋
๋๋ค.
๋งค์ ์ ๋ต - ์ต์ข ๋์ ์์ต๋ฅ : 55.5006352412013%, MDD: -9.999630944195218%, ์ต์ ์ K๊ฐ: 0.513664700396083
๊ณต๋งค๋ ๋ํ ์๋ฆฌ๋ ๊ฐ์ต๋๋ค.
์ ํฌ์ง์
:
MDD :
MDD(Most Drawdown, ์ต๋ ์์ค ๋ํญ)
๊ณต๋งค๋ ์ ๋ต - ์ต์ข ๋์ ์์ต๋ฅ : 54.35987463558776 %, MDD: -8.271748731020926 %, ์ต์ ์ K๊ฐ: 0.8763195978770201
์ง๋ 200๊ฐ์ ์์น์ฅ์ด๋ผ ์ ํฌ์ง์ ์ ๊ฒฝ์ฐ k๊ฐ์ด ๋ณด์์ ์ผ๋ก ์กํ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ค์ ๋ก ์ด๋ ๊ฒ ์์ต์ ์ป์ ์ ์์ผ๋ฉด ์ข๊ฒ ์ง๋ง ํ์ค์ ๊ทธ๋ ์ง ์์ต๋๋ค. ํฐ ์ธ๋ ฅ์ด ๋งค๋ฌผ๋๋ฅผ ๋ซ๊ณ ํ ๋ฒ์ ๊ณ ๊ฐ ๊ฐฑ์ ์ ํด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ ์ ํ ๋งค์ ๊ฐ๊ฒฉ๋๋ฅผ ๊ตฌํ์ง ๋ชปํ๊ณ ๋์ ๊ฐ๊ฒฉ์ ์ฌ๊ณ ๋ฎ์ ๊ฐ๊ฒฉ์ ํ๋ ๋์ฐธ์ฌ๊ฐ ์์ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌํ์ฌ Auto ARIMA ๋ชจ๋ธ์ ์ฌ์ฉํด์ 15๋ถ ๋ค์ ๊ฐ๊ฒฉ์ ์์ธกํ๊ณ ์ ํฉํ ๊ฐ๊ฒฉ์ ๋งค๋งค๋ฅผ ์งํํ ์ ์๋๋ก ํ์์ต๋๋ค.
์ด ์ ๋ต์ ์ด๋ ํ๊ท ์ ๊ธฐ๋ฐ์ผ๋ก ํ ์๋๋งค๋งค ์ ๋ต์
๋๋ค. ์ฌ๊ธฐ์๋ 9์ผ, 21์ผ, 54์ผ ์ด๋ ํ๊ท ์ ์ฌ์ฉํ์ฌ ์ฃผ๊ฐ์ ์ถ์ธ์ ๋ชจ๋ฉํ
์ ํ๊ฐํ๊ณ , ๋งค์ ์กฐ๊ฑด์ ์ค์ ํฉ๋๋ค. ์ด ๋งค์ ์ ๋ต์ ์๋๋งค๋งค ์์คํ
์ ์ ์ฉ๋ ์ ์์ต๋๋ค.

์ด ์ ๋ต์์๋ ๋ค์๊ณผ ๊ฐ์ ์ธ ๊ฐ์ง ๋งค์ ์กฐ๊ฑด์ ์ฌ์ฉํฉ๋๋ค:
๊ธฐ๋ณธ ๋งค์ ์กฐ๊ฑด (Buy_conditions):
9์ผ ์ด๋ ํ๊ท (ema_9)์ด 21์ผ ์ด๋ ํ๊ท (ema_21)๋ณด๋ค ํด ๋.
์กฐ๊ฑด: ema_9 > ema_21
์ค๋ช
: ์ด ์กฐ๊ฑด์ ๋จ๊ธฐ ์ถ์ธ๊ฐ ์ค๊ธฐ ์ถ์ธ๋ณด๋ค ๊ฐํ๋ค๋ ์ ํธ๋ก ํด์๋ฉ๋๋ค. ์๋๋งค๋งค ์์คํ
์ ์ด ์ ํธ๊ฐ ๋ฐ์ํ ๋ ํด๋น ์ข
๋ชฉ์ ๋งค์ํ ์ ์์ต๋๋ค.
๊ฐํ ๋งค์ ์กฐ๊ฑด (ema_Buy_conditions):
9์ผ ์ด๋ ํ๊ท ๊ณผ 21์ผ ์ด๋ ํ๊ท ์ ์ฐจ์ด (ema_9 - ema_21)๊ฐ 21์ผ ์ด๋ ํ๊ท ๊ณผ 54์ผ ์ด๋ ํ๊ท ์ ์ฐจ์ด (ema_21 - ema_54)๋ณด๋ค ํด ๋.
์กฐ๊ฑด: (ema_9 - ema_21) > (ema_21 - ema_54)
์ค๋ช
: ์ด ์กฐ๊ฑด์ ๋จ๊ธฐ ์์น ๋ชจ๋ฉํ
์ด ์ค๊ธฐ ์์น ๋ชจ๋ฉํ
๋ณด๋ค ๊ฐํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์๋๋งค๋งค ์์คํ
์ ์ด ์ํฉ์ ๊ฐ๋ ฅํ ๋งค์ ์ ํธ๋ก ๊ฐ์ฃผํ์ฌ ํด๋น ์ข
๋ชฉ์ ๋ ํ์ ์๊ฒ ๋งค์ํ ์ ์์ต๋๋ค.
์ด์ ์ ๋งค์ ์กฐ๊ฑด ๋ณํ (Previous_ema_Buy_conditions):
ํ์ฌ 9์ผ ์ด๋ ํ๊ท ๊ณผ 21์ผ ์ด๋ ํ๊ท ์ ์ฐจ์ด (ema_9 - ema_21)๊ฐ ์ด์ ๊ฐ๋ณด๋ค ํด ๋.
์กฐ๊ฑด: (ema_9 - ema_21)๊ฐ ์ ์ผ์ (ema_9 - ema_21)๋ณด๋ค ํด ๋.
์ค๋ช
: ์ด ์กฐ๊ฑด์ ๋จ๊ธฐ ์ด๋ ํ๊ท ์ด ์ค๊ธฐ ์ด๋ ํ๊ท ์ ๋นํด ๋ ๋น ๋ฅด๊ฒ ์์นํ๊ณ ์์์ ๋ํ๋
๋๋ค. ์๋๋งค๋งค ์์คํ
์ ์ด ๊ฒฝํฅ์ ๊ฐ์งํ์ฌ ๋จ๊ธฐ์ ์ธ ๋งค์ ๋ชจ๋ฉํ
์ ํฌ์ฐฉํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์๋ Auto ARIMA ๋ชจ๋ธ์ ์ฌ์ฉํด์ 5๋ถ ๋ค์ ์ต์ ๊ฐ๊ฒฉ์ ์์ธกํ๊ณ ํด๋น ๊ฐ๊ฒฉ๋ณด๋ค ๋ฎ์ ๋ ๋งค์๋ฅผ ์งํํ ์ ์๋๋ก ํ์์ต๋๋ค.
ARIMA(Autoregressive Integrated Moving Average)๋ชจ๋ธ์ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ชจ๋ธ๋ก, ์ธ ๊ฐ์ง ์ฃผ์ ์์๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
์๊ธฐํ๊ท(AR, Autoregressive): ๊ณผ๊ฑฐ ๊ฐ๋ค์ด ํ์ฌ ๊ฐ์ ์ํฅ์ ๋ฏธ์น๋ ๋ชจ๋ธ์
๋๋ค.
๋์ ์ฐจ๋ถ(I, Integrated): ๋ฐ์ดํฐ๋ฅผ ์ ์ ์ํ๋ก ๋ณํํ๊ธฐ ์ํด ํ์ํ ์ฐจ๋ถ ๊ณผ์ ์
๋๋ค.
์ด๋ํ๊ท (MA, Moving Average): ๋ฐฑ์ ์ก์์ ์ํด ์ค๋ช
๋๋ ํ์ฌ ๊ฐ์ ๋ชจ๋ธ์
๋๋ค.
์ด ์ธ ๊ฐ์ง ์์๋ฅผ ๊ฒฐํฉํ์ฌ ARIMA ๋ชจ๋ธ์ ์๊ณ์ด ๋ฐ์ดํฐ์ ํจํด์ ์ค๋ช
ํ๊ณ ์์ธกํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
predict_price๋ ์ด ARIMA ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๊ธ์ต ์์ฐ(์: ์ฃผ์ ๋๋ ์ํธํํ)์ ๋ฏธ๋ ๊ฐ๊ฒฉ์ ์์ธกํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด ํจ์๋ ํน์ ๋ฏธ๋ ์๊ฐ ๊ฐ๊ฒฉ์ ๋ํ ์ข ๊ฐ๋ฅผ ์์ธกํ๊ณ ๊ณ ๊ฐ์ ์ ๊ฐ๋ฅผ ์ถ์ ํฉ๋๋ค. ํจ์์ ๊ตฌ์ฑ ์์์ ํ๋ก์ธ์ค๋ฅผ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
prediction_time: ์์ธก ์๊ฐ ๊ฐ๊ฒฉ์ ์ง์ ํ๋ ๋ฌธ์์ด (์: '1h'๋ 1์๊ฐ, '3m'๋ 3๋ถ ๋ฑ).
add_mintes: ์์ธก ๊ฐ๊ฒฉ์ ์ถ๊ฐํ ์ถ๊ฐ ๋ถ ์๋ฅผ ๋ํ๋ด๋ ์ ์ (๊ธฐ๋ณธ๊ฐ์ 0).
ํจ์๋ get_candles(exchange, symbol, timeframe=prediction_time, limit=200)์ ํธ์ถํ์ฌ ๊ณผ๊ฑฐ ๊ฐ๊ฒฉ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
์ด ๋ฐ์ดํฐ๋ timestamp, open, high, low, close, volume ์ด์ ํฌํจํฉ๋๋ค.
์ด ์ด๋ฆ ๋ณ๊ฒฝ ๋ฐ ์ธ๋ฑ์ฑ:
df = df.rename(columns={'timestamp': 'ds', 'open': 'open', 'high': 'high', 'low': 'low', 'close': 'y', 'volume': 'volume'})
df.set_index('ds', inplace=True)
๋ชจ๋ธ ์ด๊ธฐํ ๋ฐ ํ์ต:
auto_arima๋ฅผ ์ฌ์ฉํ์ฌ ARIMA ๋ชจ๋ธ์ ์ด๊ธฐํํ๊ณ ํ์ตํฉ๋๋ค.
model = auto_arima(df['y'], seasonal=False, suppress_warnings=True)
prediction_time์ ๋ฐ๋ผ ์ถ๊ฐํ ๋ถ(minute)์ ๊ณ์ฐํฉ๋๋ค.
if prediction_time == '6h':
minutes_to_add = 60*6
elif prediction_time == '3m':
minutes_to_add = 3
elif prediction_time == '5m':
minutes_to_add = 5
elif prediction_time == '15m':
minutes_to_add = 15
elif prediction_time == '30m':
minutes_to_add = 30
elif prediction_time == '1h':
minutes_to_add = 60
elif prediction_time == '1d':
minutes_to_add = 24 * 60๋ฏธ๋ ์์ ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค.
future = pd.DataFrame(index=[df.index[-1] + pd.Timedelta(minutes=minutes_to_add)])
future['open'] = df['open'].iloc[-1]
future['high'] = df['high'].iloc[-1]
future['low'] = df['low'].iloc[-1]
future['volume'] = df['volume'].iloc[-1]๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์์ธก์ ์ํํฉ๋๋ค.
forecast, conf_int = model.predict(n_periods=1, exogenous=[future.values], return_conf_int=True)
์์ธก๋ ์ข ๊ฐ๋ฅผ ์ ์ฅํ๊ณ ๊ณ ๊ฐ์ ์ ๊ฐ๋ฅผ ์์ธก ๊ตฌ๊ฐ(confidence interval)์ผ๋ก๋ถํฐ ๊ณ์ฐํฉ๋๋ค.
close_value = forecast[0]
predicted_close_price = close_value
predicted_high_price = conf_int[0][1]
predicted_low_price = conf_int[0][0]์ด ํจ์๋ ์ฃผ์ด์ง ์๊ฐ ๊ฐ๊ฒฉ ํ์ ์ข
๊ฐ๋ฅผ ์์ธกํ๊ณ , ์ ๋ขฐ ๊ตฌ๊ฐ์ ์ฌ์ฉํ์ฌ ๊ณ ๊ฐ์ ์ ๊ฐ๋ฅผ ์ถ์ ํ๋ ๊ณผ์ ์ ์๋ํํฉ๋๋ค.
UTC ๊ธฐ์ค 00:00, 06:00, 12:00, 18:00์ ๋ด์ด ์ก์ ๋ชจ๋ ํฌ์ง์
์ ์ข
๋ฃ๋ฉ๋๋ค.
datetime.datetime.now() >= entry_time + datetime.timedelta(hours=(6 - entry_time.hour % 6))
์ญ์ถ์ธ ๋ํ์ K๊ฐ์ ๊ธฐ์กด๊ฐ์ 0.3์ ๋ํ ์์น์
๋๋ค.(0.55 + 0.3)
์์ธก ๋ํ predict_price(prediction_time='15m')๋ก
๋ณ๋์ฑ์ด ์ฌํ๋ค๊ณ ํ๋จ๋์ด ๋ณด์์ ์ผ๋ก ์ง์ ํ์์ต๋๋ค.
์คํ ์บ์คํฑ RSI : RSI๊ฐ 70์ ๋์ด์๋ฉด ๊ณผ๋งค์ ์ํ๋ก ๊ฐ์ฃผ๋ ์ ์๊ณ , 30 ๋ฐ์ผ๋ก ๋จ์ด์ง๋ฉด ๊ณผ๋งค๋ ์ํ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์คํ ์บ์คํฑ RSI์ ์ดํ ์ง์ ์ ํตํด ์๋ก์ด ํฌ์ง์
์ ์ง์
์ ์ ํ ํ๋ ๋ฐ์ ํ์ฉํ์์ต๋๋ค.
def stochastic_rsi(data, period=14, smooth_k=3, smooth_d=3):
"""
์คํ ์ผ์คํฑ RSI๋ฅผ ๊ณ์ฐํ๋ ํจ์.
๋งค๊ฐ๋ณ์:
- data: 'high', 'low', 'close' ์ด์ ํฌํจํ DataFrame.
- period: RSI ๊ธฐ๊ฐ (๊ธฐ๋ณธ๊ฐ์ 14).
- smooth_k: %K๋ฅผ ๋ถ๋๋ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํ ๊ธฐ๊ฐ (๊ธฐ๋ณธ๊ฐ์ 3).
- smooth_d: %D๋ฅผ ๋ถ๋๋ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํ ๊ธฐ๊ฐ (๊ธฐ๋ณธ๊ฐ์ 3).
๋ฐํ๊ฐ:
- 'stoch_rsi_k' ๋ฐ 'stoch_rsi_d'.
"""
# RSI ๊ณ์ฐ
data = calculate_rsi(data, period)
# ์คํ ์ผ์คํฑ RSI (%K) ๊ณ์ฐ
min_rsi = data['rsi'].rolling(window=period, center = False).min()
max_rsi = data['rsi'].rolling(window=period, center = False).max()
stoch = 100 * (data['rsi'] - min_rsi) / (max_rsi - min_rsi)
stoch_rsi_k = stoch.rolling(window=smooth_k, center = False).mean()
# ์คํ ์ผ์คํฑ RSI (%D) ๊ณ์ฐ
stoch_rsi_d = stoch_rsi_k.rolling(window=smooth_d, center = False).mean()
return stoch_rsi_k, stoch_rsi_d๊ณผ๋งค์ ์ดํ ์ง์ : (stoch_rsi_k.iloc[-2]<100 and stoch_rsi_d.iloc[-2] < 95) or (stoch_rsi_k.iloc[-3] == 100 and stoch_rsi_d.iloc[-3] == 100)
๊ณผ๋งค๋ ์ดํ ์ง์ : (stoch_rsi_k.iloc[-2] > 0 and stoch_rsi_d.iloc[-2] > 5) or (stoch_rsi_k.iloc[-3] == 0 and stoch_rsi_d.iloc[-3] == 0)
์์์๋ ์ด์ ๋ก ์ ์๊ฐ์ 2๊ฐ ์ด์ ๊ฐ์ผ๋ก ๋์ค๋ ์ด์ ๋ํด ์๊ณ ์๋ค๋ฉด ๋ฉ์ผ์ด๋ ์ด์๋ก ์๋ ค์ฃผ์ธ์.
long_stop_loss = (df['low'].iloc[-1] + df['open'].iloc[-2])/2
short_stop_loss = (df['high'].iloc[-1] + df['open'].iloc[-2])/2
๋ง์ฝ ์์ ๊ฐ๋ณด๋ค ์์ธก๊ฐ๊ฒฉ์ด ๋ ๋ฒ์ด๋์๋ค๋ฉด predict_price(prediction_time='3m')์ผ๋ก ํฌ์ง์
์ง์ ์ ์ฌ์ง์ ํฉ๋๋ค.
์์๋ฃ ์ ์ฝ์ ์ํ ์ง์ ๊ฐ ์ฃผ๋ฌธ์ ์ฑ๊ฒฐ์ด ๋์ง ์์ ๊ฒฝ์ฐ UTC ๊ธฐ์ค 00:00, 06:00, 12:00, 18:00์ ์ทจ์๋ฉ๋๋ค.
์ด ํ๋ก์ ํธ๋ฅผ ์คํํ๊ธฐ ์ํด์๋ ๋จผ์ ํจํค์ง๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค. ์๋ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ค์นํ ์ ์์ต๋๋ค.
git clone https://github.com/ddjunho/BinanceVolatilityBot.git
cd BinanceVolatilityBot
pip install .๋๋ ๊ฐ๋ฐ ํ๊ฒฝ์์ ํจํค์ง๋ฅผ ์ค์นํ ๊ฒฝ์ฐ:
pip install -e .binance_keys.py ํ์ผ์ ์์ฑํ์ฌ Binance API ํค์ ์ํฌ๋ฆฟ ํค๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
# binance_keys.py
api_key = 'your_binance_api_key'
api_secret = 'your_binance_api_secret'cd BinanceVolatilityBot
echo -e "api_key = 'your_binance_api_key'\napi_secret = 'your_binance_api_secret'" > binance_keys.pyBotFather๋ฅผ ํตํด ๋ด์ ์์ฑ ํ telepot_bot_id.py ํ์ผ์ ์์ฑํ์ฌ Telegram ๋ด์ API ํ ํฐ๊ณผ ์ฑํ ID๋ฅผ ์ค์ ํฉ๋๋ค.
# telepot_bot_id.py
token = 'your_telegram_bot_token'
chat_id = 'your_telegram_chat_id'cd BinanceVolatilityBot
echo -e "token = 'your_telegram_bot_token'\nchat_id = 'your_telegram_chat_id'" > telepot_bot_id.py์ด Telegram ๋ด์ ์ํธํํ ์๋๋งค๋งค ์์คํ ์ ์ํด ์ค๊ณ๋์์ต๋๋ค. ์ฌ์ฉ์๊ฐ Telegram์ ํตํด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด, ํด๋น ๋ด์ ์ฌ์ฉ์๊ฐ ์ค์ ํ ์กฐ๊ฑด์ ๋ฐ๋ผ ์๋์ผ๋ก ์ํธํํ๋ฅผ ๋งค๋งคํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ ๋ช ๋ น์ด๋ฅผ ์ ํํ ์ ๋ ฅํ์ฌ ์ํ๋ ์ค์ ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์์ ๋ฐ ์ค์ง
/start: ์๋๋งค๋งค๋ฅผ ์์ํฉ๋๋ค.
/stop: ์๋๋งค๋งค๋ฅผ ์ค์งํ ์ด๊ธฐํํฉ๋๋ค.
๋์๋ง
/help: ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๋ช
๋ น์ด์ ๊ฐ ๋ช
๋ น์ด์ ์ค๋ช
์ ์ ๊ณตํฉ๋๋ค.
๋ ๋ฒ๋ฆฌ์ง ์ค์
/leverage(num): ๋ ๋ฒ๋ฆฌ์ง ๊ฐ์ ์ค์ ํฉ๋๋ค. (num์ 1์์ 10 ์ฌ์ด์ ๊ฐ)
์์: /leverage(5)
K ๊ฐ ์ค์
/set(k): K ๊ฐ์ ์ค์ ํฉ๋๋ค. (k๋ 0.2์์ 0.75๊น์ง 0.05 ๋จ์๋ก ์ค์ ๊ฐ๋ฅ)
์์: /set(0.5)
์ต์ ์์น ์ค์
/Profit_Percentage(num): ์ต์ ์์น๋ฅผ ์ค์ ํฉ๋๋ค. (num์ 100์์ 200 ์ฌ์ด์ ๊ฐ)
์์: /Profit_Percentage(120)
๊ฐ๊ฒฉ ์์ธก
/predict_3m, /predict_5m, /predict_15m, /predict_1h, /predict_6h, /predict_1d: ๊ฐ๊ฐ 3๋ถ, 5๋ถ, 15๋ถ, 1์๊ฐ, 6์๊ฐ, 1์ผ ๋ค์ ๊ฐ๊ฒฉ์ ์์ธกํฉ๋๋ค.
์กฐ๊ฑด ์ถฉ์กฑ ์ฝ์ธ ๋ชฉ๋ก
/Condition_fulfillment_symbols: ema ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ์ํธํํ ์ฌ๋ณผ ๋ชฉ๋ก์ ์ ๊ณตํฉ๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋๋ก BinanceVolatilityBot์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
cd BinanceVolatilityBot
nohup python3 BinanceVolatilityBot.py > output.log &๋ํ์ ๊ธฐ์ค์ธ k๊ฐ์ ๊ตฌํ๋ ค๋ฉด backtest.py ์ ์คํํฉ๋๋ค. ๋งค์์ ๋งค๋์ ์ต์ข ๋์ ์์ต๋ฅ ์ ๊ตฌํ๊ณ ์ต์ ์ k๊ฐ์ ์ฐพ์ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ : 0.55
python3 tests/backtest.py๊ฐ๋จํ ์ ๊ฒ๋ฅผ ์ํํ๋ ค๋ฉด test_binance_volatility_bot.py ํ์ผ์ ์คํํฉ๋๋ค.
pytest tests/test_binance_volatility_bot.pyํ ์คํธ๋ ์ ์์ ์ผ๋ก ์๋ํ๋์ง ํ์ธํ๊ณ , ํ์ํ ๊ฒฝ์ฐ ์ถ๊ฐ์ ์ธ ์ ๋ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ๊ธฐ๋ฅ์ ๊ฒ์ฆํ ์ ์์ต๋๋ค.
