🚀 Auto-deploy: Add background automated scheduler, Kelly allocation, multi-portfolio simulations, and UI improvements
This commit is contained in:
+26
-10
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user