Feature: Add auto-swap (coins to USDT) function - +$64.61 converted, freeing capital for trading
This commit is contained in:
parent
0973dace06
commit
ae15976f6b
|
|
@ -384,6 +384,98 @@ Reports: Alle 3h via Telegram 📊"""
|
||||||
logger.error(f"Performance Report Error: {e}")
|
logger.error(f"Performance Report Error: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def swap_coins_to_usdt(self):
|
||||||
|
"""
|
||||||
|
AUTO-SWAP: Konvertiere alle freien (unlocked) Coins → USDT
|
||||||
|
Ignoriert locked Coins (von aktiven Trades)
|
||||||
|
Skip-list: LDBTTC (shitcoin), LDDOGE (shitcoin), USDC (dust)
|
||||||
|
"""
|
||||||
|
skip_coins = ['USDT', 'LDBTTC', 'LDDOGE', 'USDC'] # Never swap these
|
||||||
|
|
||||||
|
try:
|
||||||
|
balance = self.client.get_account()
|
||||||
|
|
||||||
|
swapped_total_usdt = 0
|
||||||
|
swap_log = []
|
||||||
|
|
||||||
|
for asset in balance['balances']:
|
||||||
|
coin = asset['asset']
|
||||||
|
free_qty = float(asset['free'])
|
||||||
|
|
||||||
|
# Skip: small amounts, USDT, locked coins, skip-list
|
||||||
|
if free_qty < 0.00001 or coin in skip_coins:
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
symbol = f"{coin}USDT"
|
||||||
|
|
||||||
|
# Get current price to estimate value
|
||||||
|
ticker = self.client.get_symbol_info(symbol)
|
||||||
|
if not ticker:
|
||||||
|
logger.warning(f"No ticker for {symbol}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Round quantity to step size
|
||||||
|
qty_to_sell = self._round_quantity(free_qty, symbol)
|
||||||
|
if qty_to_sell < 0.00001:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# MARKET SELL (immediate)
|
||||||
|
order = self.client.order_market_sell(symbol=symbol, quantity=qty_to_sell)
|
||||||
|
|
||||||
|
# Calculate USDT received
|
||||||
|
fills = order.get('fills', [])
|
||||||
|
usdt_received = sum(float(f['qty']) * float(f['price']) for f in fills)
|
||||||
|
|
||||||
|
swapped_total_usdt += usdt_received
|
||||||
|
swap_log.append(f"✅ {coin}: {qty_to_sell:.6f} → ${usdt_received:.2f}")
|
||||||
|
logger.info(f"Sweep: Sold {qty_to_sell} {coin} for ${usdt_received:.2f}")
|
||||||
|
|
||||||
|
except BinanceAPIException as e:
|
||||||
|
logger.warning(f"Sweep {coin}: Binance Error {e.status_code} - {e.message}")
|
||||||
|
swap_log.append(f"❌ {coin}: {e.message}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Sweep {coin}: {e}")
|
||||||
|
swap_log.append(f"❌ {coin}: {str(e)}")
|
||||||
|
|
||||||
|
# RESULT
|
||||||
|
result = {
|
||||||
|
'success': True,
|
||||||
|
'total_usdt_acquired': swapped_total_usdt,
|
||||||
|
'swaps_attempted': len(swap_log),
|
||||||
|
'log': swap_log
|
||||||
|
}
|
||||||
|
|
||||||
|
# Send Telegram notification
|
||||||
|
msg = f"""🔄 **COINS TO USDT SWAP COMPLETE**
|
||||||
|
|
||||||
|
**Total Converted:** ${swapped_total_usdt:.2f} → USDT
|
||||||
|
|
||||||
|
{chr(10).join(swap_log)}
|
||||||
|
|
||||||
|
**New USDT Balance:** ${self.get_usdt_balance():.2f}
|
||||||
|
"""
|
||||||
|
self._send_telegram(msg)
|
||||||
|
|
||||||
|
logger.info(f"Swap complete: ${swapped_total_usdt:.2f} converted")
|
||||||
|
return result
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Swap error: {e}")
|
||||||
|
self._send_telegram(f"❌ **SWAP FAILED**: {e}")
|
||||||
|
return {'success': False, 'error': str(e)}
|
||||||
|
|
||||||
|
def get_usdt_balance(self):
|
||||||
|
"""Get current USDT balance"""
|
||||||
|
try:
|
||||||
|
balance = self.client.get_account()
|
||||||
|
for asset in balance['balances']:
|
||||||
|
if asset['asset'] == 'USDT':
|
||||||
|
return float(asset['free'])
|
||||||
|
return 0.0
|
||||||
|
except:
|
||||||
|
return 0.0
|
||||||
|
|
||||||
def send_performance_report(self):
|
def send_performance_report(self):
|
||||||
"""Send 3h performance report via Telegram"""
|
"""Send 3h performance report via Telegram"""
|
||||||
report = self.get_performance_report()
|
report = self.get_performance_report()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue