89 lines
2.4 KiB
PL/PgSQL
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';
|