trading-platform-database/ddl/schemas/trading/functions/02-update_bot_stats.sql

89 lines
2.4 KiB
PL/PgSQL

-- ============================================================================
-- Schema: trading
-- Function: update_bot_stats
-- Description: Actualiza las estadísticas de un bot basándose en sus posiciones
-- Parameters:
-- p_bot_id: ID del bot
-- Returns: JSONB con las estadísticas actualizadas
-- ============================================================================
CREATE OR REPLACE FUNCTION trading.update_bot_stats(
p_bot_id UUID
)
RETURNS JSONB
LANGUAGE plpgsql
AS $$
DECLARE
v_total_trades INTEGER := 0;
v_winning_trades INTEGER := 0;
v_losing_trades INTEGER := 0;
v_total_pnl DECIMAL(20,8) := 0;
v_win_rate DECIMAL(5,2) := 0;
v_current_capital DECIMAL(20,8);
v_initial_capital DECIMAL(20,8);
BEGIN
-- Obtener capital inicial
SELECT initial_capital INTO v_initial_capital
FROM trading.bots
WHERE id = p_bot_id;
IF NOT FOUND THEN
RAISE EXCEPTION 'Bot % not found', p_bot_id;
END IF;
-- Contar trades cerrados
SELECT
COUNT(*)::INTEGER,
COUNT(*) FILTER (WHERE realized_pnl > 0)::INTEGER,
COUNT(*) FILTER (WHERE realized_pnl < 0)::INTEGER,
COALESCE(SUM(realized_pnl), 0)
INTO
v_total_trades,
v_winning_trades,
v_losing_trades,
v_total_pnl
FROM trading.positions
WHERE bot_id = p_bot_id
AND status IN ('closed', 'liquidated');
-- Calcular win rate
IF v_total_trades > 0 THEN
v_win_rate := (v_winning_trades::DECIMAL / v_total_trades::DECIMAL) * 100;
END IF;
-- Calcular capital actual
v_current_capital := v_initial_capital + v_total_pnl;
-- Actualizar bot
UPDATE trading.bots
SET
total_trades = v_total_trades,
winning_trades = v_winning_trades,
total_profit_loss = v_total_pnl,
win_rate = v_win_rate,
current_capital = v_current_capital,
updated_at = NOW()
WHERE id = p_bot_id;
-- Retornar estadísticas
RETURN jsonb_build_object(
'bot_id', p_bot_id,
'total_trades', v_total_trades,
'winning_trades', v_winning_trades,
'losing_trades', v_losing_trades,
'win_rate', v_win_rate,
'total_profit_loss', v_total_pnl,
'initial_capital', v_initial_capital,
'current_capital', v_current_capital,
'roi_percentage', CASE
WHEN v_initial_capital > 0
THEN ((v_current_capital - v_initial_capital) / v_initial_capital * 100)
ELSE 0
END
);
END;
$$;
-- Comentarios
COMMENT ON FUNCTION trading.update_bot_stats IS 'Actualiza las estadísticas agregadas de un trading bot';