💰 Perdemos todo el depósito de cripto

Hoy tenemos sobre la mesa el proyecto jhonwick547/trading_bot.
A primera vista, parece una apuesta seria por el éxito. Un bot de trading automático para Binance, escrito en Python. Pero en realidad, es un manual de cómo no se debe escribir software financiero. Si lo ejecutas en una cuenta real, el mercado te devorará.

¿Cuál es la pesadilla? 🤡

1️⃣Machine Learning de Schrödinger
En el código se importa orgullosamente sklearn y se carga un modelo:
self.model = joblib.load(model_path)

Pero en el método generate_signals... no se usa en absoluto. 🤡
Las señales se generan mediante un conjunto de if de nivel de quinto grado: «Si RSI < 60 y MACD está creciendo, compra».
¿Para qué está Random Forest? Supongo que para que el ventilador de la laptop suene más convincente.

2️⃣ Carrera mortal
Miremos la función execute_trade.
1. El bot envía una orden de mercado (create_market_buy_order).
2. El bot intenta colocar un Stop Loss y un Take Profit con solicitudes separadas.

Pregunta del millón: ¿qué sucede si entre el paso 1 y 2 se cae el internet, falla el script o Binance devuelve un error de API?
Respuesta: Te quedas con una posición abierta sin stop loss. Una vela en dirección contraria y adiós, liquidación.
En sistemas normales se usan órdenes OCO (One Cancels the Other) o se envían lotes de órdenes para que la entrada y el stop sean atómicos (o al menos lo más cercanos posible).

3️⃣ Matemáticas que no funcionan
Función de cálculo de posición calculate_position_size:
risk_amount = balance * self.balance_pct  # 10% del depósito
position_size = risk_amount / (entry_price - stop_loss)

El autor confunde el riesgo por operación con el volumen de entrada.
Si entry_price está cerca de stop_loss, el denominador tiende a cero y el tamaño de la posición se dispara. Hay un min(), pero la lógica de cálculo del volumen a partir de un riesgo fijo está mal implementada. Al final, o arriesgas centavos o todo el depósito, dependiendo de la volatilidad.

4️⃣ Trabajo duplicado
En el bucle start_trading, el bot descarga velas (fetch_data) y calcula indicadores para verificar la señal.
Si hay señal, llama a execute_trade, donde... vuelve a descargar velas y vuelve a calcular indicadores.
Supongo que para que Binance banee la IP más rápido por solicitudes innecesarias.

5️⃣ Claves hardcodeadas
En if __name__ == "__main__": se sugiere escribir las claves directamente en el código.
api_key = 'YOUR_API_KEY'
Nunca. ¿Oyes? Nunca guardes secretos en el código. Usa .env.

👨🏻‍⚖️ Veredicto:
Externamente parece un bot de trading, pero en esencia es un generador de pérdidas aleatorias.

#criticamos_el_código