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.prereleasetrue, если хотите получать ранние версии 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 под вашим полным контролем.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *