💰 Сливаем весь депозит крипты

Сегодня у нас на столе проект 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.

👨🏻‍⚖️ Вердикт:
Внешне похоже на торгового бота, но по сути — генератор случайных убытков.

#жарим_код