Bot auto-update: src/main_ml.py,src/persistence.py
This commit is contained in:
parent
e1c4e15197
commit
43fa4651c9
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
Loading…
Reference in New Issue