Сегодня у нас на столе проект jhonwick547/trading_bot.
На первый взгляд — это серьёзная заявка на успех. Автоматический торговый бот для Binance, написанный на Python. А на деле — пособие по тому, как нельзя писать финансовый софт. Если вы запустите это на реальном счете, рынок вас сожрет.
В чем кошмар? 🤡
1️⃣Machine Learning Шредингера
В коде гордо импортируется
sklearn и загружается модель:self.model = joblib.load(model_path)Но в методе
generate_signals... она нигде не используется. 🤡Сигналы генерируются через набор
if-ов уровня 5-го класса: «Если RSI < 60 и MACD растет — покупай».Зачем там Random Forest? Видимо, чтобы кулер на ноутбуке гудел убедительнее.
2️⃣ Смертельная гонка
Смотрим функцию
execute_trade.1. Бот отправляет рыночный ордер (
create_market_buy_order).2. Бот пытается поставить Stop Loss и Take Profit отдельными запросами.
Вопрос на миллион: что будет, если между пунктом 1 и 2 у вас отвалится интернет, упадет скрипт или Binance вернет ошибку API?
Ответ: Вы останетесь с открытой позицией без стоп-лосса. Одна свеча не в ту сторону — и привет, ликвидация.
В нормальных системах используют OCO-ордера (One Cancels the Other) или отправляют сетку ордеров батчем, чтобы вход и стоп были атомарны (ну или хотя бы максимально близки).
3️⃣ Математика, которая не работает
Функция расчета позиции
calculate_position_size:risk_amount = balance * self.balance_pct # 10% от депо
position_size = risk_amount / (entry_price - stop_loss)Автор путает риск на сделку и объем входа.
Если
entry_price близка к stop_loss, знаменатель стремится к нулю, а размер позиции улетает в космос. Там стоит min(), но сама логика расчета объема от фиксированного риска реализована криво. В итоге вы либо рискуете копейками, либо всем депо, в зависимости от волатильности.4️⃣ Двойная работа
В цикле
start_trading бот скачивает свечи (fetch_data) и считает индикаторы, чтобы проверить сигнал.Если сигнал есть, он вызывает
execute_trade, где... снова скачивает свечи и снова считает индикаторы.Видимо, чтобы Binance быстрее забанил по IP за лишние запросы.
5️⃣ Хардкод ключей
В
if __name__ == "__main__": ключи предлагается вписать прямо в код.api_key = 'YOUR_API_KEY'Никогда. Слышите? Никогда не храните секреты в коде. Используйте
.env.👨🏻⚖️ Вердикт:
Внешне похоже на торгового бота, но по сути — генератор случайных убытков.
#жарим_код
Комментарии
0Комментариев пока нет.
Войдите, чтобы участвовать в обсуждении.