Freqtrade 2025.4 — современный крипто-трейд-бот и практическое руководство по запуску
Что такое Freqtrade
Freqtrade — это полностью открытый бот на Python для автоматизации спотовой и фьючерсной торговли криптовалютой. Он поддерживает десятки бирж, умеет бэктестить стратегии на исторических данных, оптимизировать параметры через Hyperopt и управляться из Telegram или веб-интерфейса FreqUI.
Версия 2025.4 приносит заметные улучшения:
- новый режим /pause вместо устаревшего
/stopbuy
; - обновлённый FreqUI 2.0 c диаграммой длительностей сделок;
- Hyperopt-функция MaxDrawDownPerPairHyperOptLoss для минимизации просадки;
- точный расчёт допустимой суммы сделки на фьючерсах;
- прекращена поддержка PyTorch на Intel Mac
Установка через Docker Compose
Docker — единственный рекомендуемый способ: он изолирует зависимости и уже содержит Python 3.12.
# клонируем проект
git clone https://github.com/freqtrade/freqtrade.git
cd freqtrade
# берём пример и запускаем
cp docker-compose.yml.example docker-compose.yml
docker compose pull # скачиваем образ 2025.4
docker compose up -d # стартуем бот
После первого запуска появится каталог user_data
с базовой структурой и пустым config.json
Создание и редактирование конфигурации
docker compose run --rm freqtrade new-config --config user_data/config.json
Ключевые поля для версии 2025.4:
Секция | Что задать |
---|---|
exchange | биржа, API-ключи, режим spot/futures |
pair_whitelist | список пар, например "BTC/USDT" |
stake_currency | базовая валюта депозита |
strategy | название стратегии (см. ниже) |
telegram.bot_commands | теперь есть /pause для быстрой паузы |
ui_settings.prerelease | true , если хотите получать ранние версии FreqUI |
hyperopt_loss | "MaxDrawDownPerPairHyperOptLoss" для новой метрики |
Загрузка данных и бэктест
# пример: минутные свечи за последние два года
docker compose exec freqtrade \
freqtrade download-data --timeframes 5m --timerange 2023-01-01::
Затем запустите бэктест любой стратегии:
docker compose exec freqtrade \
freqtrade backtesting --strategy SimpleDcaGrid \
--config user_data/config.json \
--timerange 2024-01-01::
Стратегия SimpleDcaGrid
Концепция
- DCA-сетka: бот усредняет позицию до четырёх раз, используя шаг сетки (по умолчанию 0,6 % просадки).
- ATR-фильтр: если волатильность выше порога
max_atr_pct
, покупки временно блокируются. - Тренд-фильтр: EMA 21 выше EMA 55 и ADX > 25 подтверждают восходящее движение.
- Без стоп-лосса: управление риском строится на среднем входе и трейлинг-стопе.
Код стратегии
from freqtrade.strategy.interface import IStrategy
from freqtrade.strategy import DecimalParameter, IntParameter
from pandas import DataFrame
import talib.abstract as ta
import logging
logger = logging.getLogger(__name__)
class SimpleDcaGrid(IStrategy):
timeframe = '5m'
max_open_trades = 1
startup_candle_count = 288
minimal_roi = {"0": 0.24, "38": 0.059, "98": 0.036, "155": 0.005}
stoploss = -1.0
trailing_stop = True
trailing_stop_positive = 0.012
trailing_stop_positive_offset = 0.096
trailing_only_offset_is_reached = False
# ==== DCA ====
position_adjustment_enable = True
max_entry_position_adjustment = 3
dca_mult = DecimalParameter(0.006, 0.02, default=0.006, space="buy")
# ==== Волатильность ====
max_atr_pct = DecimalParameter(1.0, 3.0, default=2.0, space="buy")
def populate_indicators(self, df: DataFrame, metadata: dict) -> DataFrame:
df['rsi'] = ta.RSI(df, timeperiod=14)
df['atr'] = ta.ATR(df, timeperiod=14)
df['atr_pct'] = df['atr'] / df['close'] * 100
df['ema_fast'] = ta.EMA(df, timeperiod=21)
df['ema_slow'] = ta.EMA(df, timeperiod=55)
df['adx'] = ta.ADX(df, timeperiod=14)
return df
def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
df['enter_long'] = 0
oversold = (df['rsi'] < 40) & (df['atr_pct'] < self.max_atr_pct.value)
trend = (df['ema_fast'] > df['ema_slow']) & (df['adx'] > 25) & (df['rsi'] < 70)
df.loc[oversold | trend, 'enter_long'] = 1
return df
def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
return df # выходы по ROI / трейлингу
def adjust_trade_position(self, trade, current_time, current_rate, current_profit, **kwargs):
"""Добавляем следующую долю, если:
• текущая просадка превышает dca_mult × (n+1)
• рынок не в шторме (ATR% < порога)
"""
result = self.dp.get_analyzed_dataframe(pair=trade.pair, timeframe=self.timeframe)
if isinstance(result, tuple):
pair_df = result[0]
else:
pair_df = result
if pair_df is None or pair_df.empty or 'atr_pct' not in pair_df.columns:
return 0 # нет данных – пропускаем
last_atr_pct = pair_df['atr_pct'].iloc[-1]
logger.info(f"profit={current_profit:.3%} | ATR%={last_atr_pct:.2f} | ")
if last_atr_pct >= self.max_atr_pct.value:
return 0 # пауза усреднения при шторме
step = self.dca_mult.value
down_th = -step * (trade.nr_of_successful_entries + 1)
up_th = step * (trade.nr_of_successful_entries + 1)
logger.info(f"down_th={down_th:.3f} | up_th={up_th:.3f} | ")
if current_profit < down_th:
return 40 # усреднение вниз
elif current_profit > up_th and trade.nr_of_successful_entries < self.max_entry_position_adjustment:
return 20 # докупка вверх
return 0
Запуск стратегии
Проверка на истории
docker compose exec freqtrade \
freqtrade backtesting --strategy SimpleDcaGrid \
--timerange 2024-10-01::2025-05-31 \
--config user_data/config.json
Dry-run
docker compose exec freqtrade \
freqtrade trade --config user_data/config.json \
--strategy SimpleDcaGrid --dry-run
Боевой режим
После успешного dry-run уберите флаг --dry-run
, убедитесь, что API-ключи имеют нужные права и включите оповещения в Telegram.
Обновление до новых версий
docker compose pull
docker compose up -d
Бот перезапустится с последним стабильным образом; проверьте changelog перед обновлением.
Заключение
Freqtrade 2025.4 сочетает мощный функционал с простотой развертывания: один Docker-контейнер покрывает торговлю, бэктесты и веб-интерфейс. Стратегия SimpleDcaGrid показывает, как объединить DCA-логика и фильтры волатильности для стабильной работы на BTC/USDT. Запускайте dry-run, анализируйте результаты, корректируйте параметры — и бот будет торговать 24/7 под вашим полным контролем.