trading-platform-database-v2/ddl/schemas/broker_integration/tables/002_broker_prices.sql
rckrdmrd 4631a58b42 [DDL] feat: Sprint 6 - Add broker_integration and portfolio_management schemas
broker_integration (5 tables):
- broker_accounts: Cuentas MT4/MT5/API conectadas
- broker_prices: Precios en tiempo real
- spread_statistics: Estadisticas historicas de spread
- price_adjustment_model: Modelos de ajuste de precio
- trade_execution: Ejecucion de ordenes

portfolio_management (6 tables):
- portfolios: Portafolios de inversion
- portfolio_accounts: Cuentas vinculadas a portafolios
- investment_goals: Metas de inversion
- rebalance_suggestions: Sugerencias de rebalanceo
- portfolio_snapshots: Snapshots historicos
- monte_carlo_projections: Proyecciones Monte Carlo

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 20:19:27 -06:00

97 lines
3.0 KiB
SQL

-- ============================================================================
-- SCHEMA: broker_integration
-- TABLE: broker_prices
-- DESCRIPTION: Precios en tiempo real de brokers
-- VERSION: 1.0.0
-- CREATED: 2026-01-16
-- SPRINT: Sprint 6 - DDL Implementation Roadmap Q1-2026
-- ============================================================================
-- Tabla de Precios de Broker
CREATE TABLE IF NOT EXISTS broker_integration.broker_prices (
-- Identificadores
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
broker_account_id UUID NOT NULL REFERENCES broker_integration.broker_accounts(id) ON DELETE CASCADE,
-- Simbolo
symbol VARCHAR(20) NOT NULL,
-- Precios
bid DECIMAL(15, 8) NOT NULL,
ask DECIMAL(15, 8) NOT NULL,
spread DECIMAL(10, 4), -- En pips
spread_points INTEGER, -- En puntos
-- Volumen
bid_volume DECIMAL(15, 4),
ask_volume DECIMAL(15, 4),
-- Cambio
change_24h DECIMAL(15, 8),
change_percent_24h DECIMAL(10, 4),
high_24h DECIMAL(15, 8),
low_24h DECIMAL(15, 8),
-- Sesion
session_open DECIMAL(15, 8),
session_high DECIMAL(15, 8),
session_low DECIMAL(15, 8),
previous_close DECIMAL(15, 8),
-- Trading
is_trading_enabled BOOLEAN NOT NULL DEFAULT TRUE,
trading_session VARCHAR(20), -- 'pre_market', 'regular', 'after_hours'
-- Timestamp del broker
broker_timestamp TIMESTAMPTZ,
-- Timestamps
received_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
-- Constraints
CONSTRAINT broker_prices_unique UNIQUE (broker_account_id, symbol)
);
COMMENT ON TABLE broker_integration.broker_prices IS
'Precios en tiempo real recibidos de brokers conectados';
-- Indices
CREATE INDEX IF NOT EXISTS idx_broker_prices_account
ON broker_integration.broker_prices(broker_account_id);
CREATE INDEX IF NOT EXISTS idx_broker_prices_symbol
ON broker_integration.broker_prices(symbol);
CREATE INDEX IF NOT EXISTS idx_broker_prices_received
ON broker_integration.broker_prices(received_at DESC);
-- Vista de spreads actuales
CREATE OR REPLACE VIEW broker_integration.v_current_spreads AS
SELECT
bp.symbol,
ba.broker_name,
bp.bid,
bp.ask,
bp.spread,
bp.spread_points,
bp.is_trading_enabled,
bp.received_at
FROM broker_integration.broker_prices bp
JOIN broker_integration.broker_accounts ba ON bp.broker_account_id = ba.id
WHERE ba.is_active = TRUE
ORDER BY bp.symbol, bp.spread;
-- RLS
ALTER TABLE broker_integration.broker_prices ENABLE ROW LEVEL SECURITY;
CREATE POLICY broker_prices_tenant ON broker_integration.broker_prices
FOR ALL
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
-- Grants
GRANT SELECT, INSERT, UPDATE, DELETE ON broker_integration.broker_prices TO trading_app;
GRANT SELECT ON broker_integration.broker_prices TO trading_readonly;
GRANT SELECT ON broker_integration.v_current_spreads TO trading_app;