🚀 Auto-deploy: Add background automated scheduler, Kelly allocation, multi-portfolio simulations, and UI improvements

This commit is contained in:
2026-05-20 11:23:56 +00:00
parent 738490ea4f
commit 3921ce9359
9 changed files with 944 additions and 127 deletions
+26 -10
View File
@@ -1,7 +1,7 @@
"""
BrainSteel Fin — Decio Agent (v2)
Chief Strategist & Risk Officer
5-Pillar decision engine: Confiança < 75% → HOLD. BUY/SELL → SL 2% / TP 5%.
5-Pillar decision engine: Confiança < 70% → HOLD. BUY/SELL → SL 2% / TP 5%.
"""
import os, json, requests
from datetime import datetime
@@ -14,7 +14,7 @@ class DecioAgent:
self.openrouter_url = "https://openrouter.ai/api/v1/chat/completions"
self.model = "deepseek/deepseek-v4-flash:free"
# ── CORE RULE: confidence < 75% → always HOLD ─────────────────────────
# ── CORE RULE: confidence < 70% → always HOLD ─────────────────────────
def _risk_filter(self, confidence, signal):
"""Décio is a mathematician: no confidence ≥70%, no operation."""
return confidence < 70 or signal not in ("ALTA", "BAIXA")
@@ -62,9 +62,9 @@ Analítico, frio, matemático. Preservação de capital > lucro rápido.
Bullish signals: {self.brief_data.get('bullish_signals',0)} | Bearish: {self.brief_data.get('bearish_signals',0)}
REGRAS OPERACIONAIS:
Confiança < 75% → decisão SEMPRE HOLD (nunca opera)
Confiança ≥ 75% + sinal=ALTA → BUY
Confiança ≥ 75% + sinal=BAIXA → SELL
Confiança < 70% → decisão SEMPRE HOLD (nunca opera)
Confiança ≥ 70% + sinal=ALTA → BUY
Confiança ≥ 70% + sinal=BAIXA → SELL
BUY/SELL → Stop Loss = preço × 0.98 (-2%) | Take Profit = preço × 1.05 (+5%)
HOLD → stop_loss=0, take_profit=0
@@ -102,7 +102,7 @@ Analítico, frio, matemático. Preservação de capital > lucro rápido.
# Apply risk filter
if self._risk_filter(data.get("confidence", 0), signal):
data["decision"] = "HOLD"
data["justification"] = "Confiança < 75% — preservando capital"
data["justification"] = "Confiança < 70% — preservando capital"
data["stop_loss"] = 0
data["take_profit"] = 0
return data
@@ -131,7 +131,7 @@ Analítico, frio, matemático. Preservação de capital > lucro rápido.
elif self._risk_filter(confidence, signal):
decision = "HOLD"
sl, tp = 0, 0
justification = f"Confiança {confidence}% < 75% — preservando capital"
justification = f"Confiança {confidence}% < 70% — preservando capital"
elif signal == "ALTA":
decision = "BUY"
sl, tp = self._calc_levels(price, "BUY")
@@ -154,18 +154,34 @@ Analítico, frio, matemático. Preservação de capital > lucro rápido.
"signal": signal
}
# ── Dynamic Allocation (Kelly Scale) ─────────────────────────────────────
def _calc_allocation(self, confidence, decision):
"""Calcula a alocação de banca dinâmica baseada na confiança do sinal."""
if decision not in ("BUY", "SELL") or confidence < 70:
return 0
if confidence >= 90:
return 35 # Mão forte (alta convicção)
elif confidence >= 80:
return 25 # Mão padrão
else:
return 15 # Mão leve (cautela, 70-79%)
# ── Main run ───────────────────────────────────────────────────────────
def run(self):
llm_result = self._decide_llm()
result = llm_result if llm_result else self._local_decision()
price = self.brief_data.get("price", 0)
conf = result.get("confidence", 50)
action = result["decision"]
amount_pct = self._calc_allocation(conf, action)
output = {
"action": result["decision"],
"amount_pct": 25 if result["decision"] in ("BUY", "SELL") else 0,
"action": action,
"amount_pct": amount_pct,
"stop_loss": result.get("stop_loss", 0),
"take_profit": result.get("take_profit", 0),
"confidence": result.get("confidence", 50),
"confidence": conf,
"justification": result.get("justification", "")[:200],
"signal": result.get("signal", self.brief_data.get("signal", "NEUTRO")),
"price": price,