Bot auto-update: src/main_ml.py,src/persistence.py

This commit is contained in:
Marc Blatter 2026-07-04 13:30:01 +02:00
parent e1c4e15197
commit 43fa4651c9
2 changed files with 100 additions and 0 deletions

View File

@ -1,3 +1,4 @@
from src.persistence import load_persistent_trades, save_persistent_trades, load_binance_positions_on_startup, init_persistence
import asyncio, logging, joblib, time, json, aiohttp, os
from datetime import datetime, timedelta
from src.config import get_config

99
src/persistence.py Normal file
View File

@ -0,0 +1,99 @@
#!/usr/bin/env python3
"""
Bot Persistence & Auto-Recovery System
- Saves all trades to persistent storage (JSON)
- On restart: Loads all trades + binance positions
- Dashboard syncs with persistent storage
- Bot operates autonomously even after restart
"""
import json
import os
import sys
sys.path.insert(0, '/home/marc/bot-deploy')
# Paths
TRADES_FILE = '/home/marc/bot-deploy/data/trades_persistent.json'
BOT_STATE_FILE = '/home/marc/bot-deploy/data/bot_state.json'
DATA_DIR = '/home/marc/bot-deploy/data'
# Ensure data directory exists
os.makedirs(DATA_DIR, exist_ok=True)
def init_persistence():
"""Initialize persistence files if they don't exist"""
if not os.path.exists(TRADES_FILE):
with open(TRADES_FILE, 'w') as f:
json.dump({
'current_trades': {},
'completed_trades': [],
'swaps': []
}, f, indent=2)
if not os.path.exists(BOT_STATE_FILE):
with open(BOT_STATE_FILE, 'w') as f:
json.dump({
'last_restart': None,
'total_capital_deployed': 0.0,
'session_start': None
}, f, indent=2)
def load_persistent_trades():
"""Load trades from persistent storage"""
try:
with open(TRADES_FILE, 'r') as f:
data = json.load(f)
return data.get('current_trades', {}), data.get('completed_trades', []), data.get('swaps', [])
except:
return {}, [], []
def save_persistent_trades(current_trades, completed_trades, swaps):
"""Save trades to persistent storage"""
data = {
'current_trades': current_trades,
'completed_trades': completed_trades,
'swaps': swaps
}
with open(TRADES_FILE, 'w') as f:
json.dump(data, f, indent=2)
def load_binance_positions_on_startup():
"""Load current open positions from Binance on startup"""
from src.bot.binance_client import BinanceClient
import asyncio
async def _load():
client = BinanceClient()
positions = {}
# Get account balances
balances = await client.get_balance()
# Scan for open positions (non-zero balances excluding USDT)
for symbol, amount in balances.items():
if symbol != 'USDT' and amount > 0.00001:
# Get current price for this asset
price = await client.get_price(f'{symbol}USDT')
positions[f'{symbol}USDT'] = {
'qty': amount,
'buy_price': price, # Current price as reference
'entry_time': None, # Lost on restart
'status': 'open'
}
print(f'✅ Loaded from Binance: {symbol}USDT - Qty: {amount} @ ${price}')
return positions
try:
loop = asyncio.get_event_loop()
except:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
return loop.run_until_complete(_load())
# Initialize on import
init_persistence()
print('✅ Persistence module initialized')