Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
# ============================================
|
| 2 |
-
# 👑 TOMIRIS SPACE 19 v9.
|
| 3 |
# ============================================
|
| 4 |
import os, time, threading, warnings, json, asyncio
|
| 5 |
from typing import Dict, Any, Optional, List, Tuple
|
|
@@ -64,7 +64,7 @@ SYMBOL: str = "SOL/USD"
|
|
| 64 |
MT5_SYMBOL: str = "SOLUSD"
|
| 65 |
TIMEFRAMES: List[str] = ["15min", "1h", "4h"]
|
| 66 |
AUTO_REPORT_INTERVAL = 300 # секунд между авто‑отправками
|
| 67 |
-
RETRAIN_INTERVAL =
|
| 68 |
|
| 69 |
try:
|
| 70 |
with open("best_config.json", "r") as f:
|
|
@@ -112,7 +112,7 @@ COMPONENT_PERF: Dict[str, Dict[str, float]] = {
|
|
| 112 |
YAHOO_INTERVAL_MAP: Dict[str, str] = {"15min": "15m", "1h": "60m", "4h": "4h"}
|
| 113 |
|
| 114 |
# ================= ЗАГРУЗКА МОДЕЛЕЙ =================
|
| 115 |
-
print(f"🔥 SPACE 19 v9.
|
| 116 |
MODELS: Dict[str, Optional[Any]] = {"xgb_daily": None, "xgb_4h": None, "lgb": None}
|
| 117 |
|
| 118 |
if HAS_JOBLIB:
|
|
@@ -144,7 +144,7 @@ def get_next_twelve_key() -> str:
|
|
| 144 |
return key
|
| 145 |
|
| 146 |
session = requests.Session()
|
| 147 |
-
session.headers.update({"User-Agent": "Tomiris-Space19-v9.
|
| 148 |
|
| 149 |
def safe_float(value: Any, default: float = 0.0) -> float:
|
| 150 |
try:
|
|
@@ -800,7 +800,7 @@ def get_sol_signal() -> Optional[Dict[str, Any]]:
|
|
| 800 |
"risk": {"sl": sl, "tp": tp, "rr": round(tp_dist/(sl_dist+1e-10), 2) if direction != "WAIT" else 0},
|
| 801 |
"meta": {
|
| 802 |
"latency_ms": latency,
|
| 803 |
-
"model_version": "v9.
|
| 804 |
"features_used": len(model_features) if model_features else 0,
|
| 805 |
"dynamic_weights": comp_weights
|
| 806 |
}
|
|
@@ -823,7 +823,7 @@ def auto_report():
|
|
| 823 |
def retrain_models():
|
| 824 |
print("🔄 Запуск дообучения моделей SOL...")
|
| 825 |
try:
|
| 826 |
-
|
| 827 |
df = None
|
| 828 |
if HAS_YFINANCE:
|
| 829 |
yf_data = yf.download("SOL-USD", period="1y", interval="1d", progress=False)
|
|
@@ -852,7 +852,6 @@ def retrain_models():
|
|
| 852 |
|
| 853 |
if not features_list:
|
| 854 |
return
|
| 855 |
-
# Приводим к единому размеру (pad до 200)
|
| 856 |
X = np.array([list(f.values())[:200] + [0.0]*(200 - len(f)) for f in features_list])
|
| 857 |
y = np.array(targets)
|
| 858 |
|
|
@@ -871,7 +870,24 @@ def retrain_models():
|
|
| 871 |
|
| 872 |
def auto_retrain():
|
| 873 |
while True:
|
| 874 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 875 |
retrain_models()
|
| 876 |
|
| 877 |
# ================= KEEP-ALIVE =================
|
|
@@ -888,18 +904,19 @@ threading.Thread(target=auto_report, daemon=True).start()
|
|
| 888 |
threading.Thread(target=auto_retrain, daemon=True).start()
|
| 889 |
|
| 890 |
# ================= FASTAPI =================
|
| 891 |
-
app = FastAPI(title="TOMIRIS SOL/USD MASTER v9.
|
| 892 |
|
| 893 |
@app.get("/health")
|
| 894 |
async def health():
|
| 895 |
models_loaded = sum(1 for m in ["xgb_daily","xgb_4h","lgb"] if MODELS.get(m) is not None)
|
| 896 |
return {
|
| 897 |
-
"space": "Space 19 v9.
|
| 898 |
"status": "operational",
|
| 899 |
"symbol": SYMBOL,
|
| 900 |
"models_loaded": models_loaded,
|
| 901 |
"hub_connected": True,
|
| 902 |
-
"auto_retrain": True
|
|
|
|
| 903 |
}
|
| 904 |
|
| 905 |
@app.get("/consilium")
|
|
@@ -956,6 +973,6 @@ async def explain():
|
|
| 956 |
}
|
| 957 |
return {"error": "No prediction yet"}
|
| 958 |
|
| 959 |
-
print("🚀 SPACE 19 v9.
|
| 960 |
-
print("🥉 Ансамбль daily+4h + Meta SOL Score + Dynamic Weights + Auto-Retrain")
|
| 961 |
print("✅ Готов к бою!")
|
|
|
|
| 1 |
# ============================================
|
| 2 |
+
# 👑 TOMIRIS SPACE 19 v9.1 — SOL/USD MASTER (Hub‑Connected + Auto‑Retrain + Trigger)
|
| 3 |
# ============================================
|
| 4 |
import os, time, threading, warnings, json, asyncio
|
| 5 |
from typing import Dict, Any, Optional, List, Tuple
|
|
|
|
| 64 |
MT5_SYMBOL: str = "SOLUSD"
|
| 65 |
TIMEFRAMES: List[str] = ["15min", "1h", "4h"]
|
| 66 |
AUTO_REPORT_INTERVAL = 300 # секунд между авто‑отправками
|
| 67 |
+
RETRAIN_INTERVAL = 14 * 86400 # 14 дней
|
| 68 |
|
| 69 |
try:
|
| 70 |
with open("best_config.json", "r") as f:
|
|
|
|
| 112 |
YAHOO_INTERVAL_MAP: Dict[str, str] = {"15min": "15m", "1h": "60m", "4h": "4h"}
|
| 113 |
|
| 114 |
# ================= ЗАГРУЗКА МОДЕЛЕЙ =================
|
| 115 |
+
print(f"🔥 SPACE 19 v9.1: Загрузка моделей для {SYMBOL}...")
|
| 116 |
MODELS: Dict[str, Optional[Any]] = {"xgb_daily": None, "xgb_4h": None, "lgb": None}
|
| 117 |
|
| 118 |
if HAS_JOBLIB:
|
|
|
|
| 144 |
return key
|
| 145 |
|
| 146 |
session = requests.Session()
|
| 147 |
+
session.headers.update({"User-Agent": "Tomiris-Space19-v9.1"})
|
| 148 |
|
| 149 |
def safe_float(value: Any, default: float = 0.0) -> float:
|
| 150 |
try:
|
|
|
|
| 800 |
"risk": {"sl": sl, "tp": tp, "rr": round(tp_dist/(sl_dist+1e-10), 2) if direction != "WAIT" else 0},
|
| 801 |
"meta": {
|
| 802 |
"latency_ms": latency,
|
| 803 |
+
"model_version": "v9.1_auto_retrain",
|
| 804 |
"features_used": len(model_features) if model_features else 0,
|
| 805 |
"dynamic_weights": comp_weights
|
| 806 |
}
|
|
|
|
| 823 |
def retrain_models():
|
| 824 |
print("🔄 Запуск дообучения моделей SOL...")
|
| 825 |
try:
|
| 826 |
+
import joblib
|
| 827 |
df = None
|
| 828 |
if HAS_YFINANCE:
|
| 829 |
yf_data = yf.download("SOL-USD", period="1y", interval="1d", progress=False)
|
|
|
|
| 852 |
|
| 853 |
if not features_list:
|
| 854 |
return
|
|
|
|
| 855 |
X = np.array([list(f.values())[:200] + [0.0]*(200 - len(f)) for f in features_list])
|
| 856 |
y = np.array(targets)
|
| 857 |
|
|
|
|
| 870 |
|
| 871 |
def auto_retrain():
|
| 872 |
while True:
|
| 873 |
+
# Проверяем винрейт каждый час
|
| 874 |
+
time.sleep(3600)
|
| 875 |
+
try:
|
| 876 |
+
resp = session.get(f"{HUB_URL}/metrics", params={"space": "space_19_sol"}, timeout=10)
|
| 877 |
+
if resp.status_code == 200:
|
| 878 |
+
data = resp.json()
|
| 879 |
+
if data and len(data) > 0:
|
| 880 |
+
acc = data[0].get("accuracy", 0.5)
|
| 881 |
+
total = data[0].get("total_trades", 0)
|
| 882 |
+
if total >= 20 and acc < 0.4:
|
| 883 |
+
print(f"Точность SOL Master упала до {acc:.2f}, экстренное дообучение!")
|
| 884 |
+
retrain_models()
|
| 885 |
+
time.sleep(RETRAIN_INTERVAL)
|
| 886 |
+
continue
|
| 887 |
+
except Exception as e:
|
| 888 |
+
print(f"Ошибка проверки винрейта: {e}")
|
| 889 |
+
# Ждём оставшееся время до планового дообучения
|
| 890 |
+
time.sleep(RETRAIN_INTERVAL - 3600)
|
| 891 |
retrain_models()
|
| 892 |
|
| 893 |
# ================= KEEP-ALIVE =================
|
|
|
|
| 904 |
threading.Thread(target=auto_retrain, daemon=True).start()
|
| 905 |
|
| 906 |
# ================= FASTAPI =================
|
| 907 |
+
app = FastAPI(title="TOMIRIS SOL/USD MASTER v9.1 Auto-Retrain + Trigger")
|
| 908 |
|
| 909 |
@app.get("/health")
|
| 910 |
async def health():
|
| 911 |
models_loaded = sum(1 for m in ["xgb_daily","xgb_4h","lgb"] if MODELS.get(m) is not None)
|
| 912 |
return {
|
| 913 |
+
"space": "Space 19 v9.1 Auto-Retrain + Trigger",
|
| 914 |
"status": "operational",
|
| 915 |
"symbol": SYMBOL,
|
| 916 |
"models_loaded": models_loaded,
|
| 917 |
"hub_connected": True,
|
| 918 |
+
"auto_retrain": True,
|
| 919 |
+
"retrain_trigger": "accuracy < 0.4"
|
| 920 |
}
|
| 921 |
|
| 922 |
@app.get("/consilium")
|
|
|
|
| 973 |
}
|
| 974 |
return {"error": "No prediction yet"}
|
| 975 |
|
| 976 |
+
print("🚀 SPACE 19 v9.1 — SOL/USD MASTER (Hub-Connected + Auto-Retrain + Trigger) ЗАПУЩЕН!")
|
| 977 |
+
print("🥉 Ансамбль daily+4h + Meta SOL Score + Dynamic Weights + Auto-Retrain + Trigger")
|
| 978 |
print("✅ Готов к бою!")
|