TradingAgents/init.sql

154 lines
4.4 KiB
PL/PgSQL

-- Database initialization script for Autonomous Trading System
-- Creates necessary extensions and initial setup
-- Enable TimescaleDB extension
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
-- Enable UUID generation
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- Enable crypto functions
CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- Create schema
CREATE SCHEMA IF NOT EXISTS trading;
-- Set default search path
SET search_path TO trading, public;
-- Create custom types
CREATE TYPE order_status AS ENUM (
'pending',
'submitted',
'partially_filled',
'filled',
'cancelled',
'rejected',
'failed'
);
CREATE TYPE order_side AS ENUM ('BUY', 'SELL');
CREATE TYPE order_type AS ENUM ('MARKET', 'LIMIT', 'STOP', 'STOP_LIMIT', 'BRACKET');
CREATE TYPE risk_level AS ENUM ('LOW', 'MEDIUM', 'HIGH', 'CRITICAL');
-- Grant permissions to user
GRANT ALL PRIVILEGES ON SCHEMA trading TO trader;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA trading TO trader;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA trading TO trader;
-- Create indexes for better performance
-- These will be created after tables are created by SQLAlchemy
-- Just documenting the important ones here
COMMENT ON SCHEMA trading IS 'Autonomous Trading System Schema';
-- Function to update last_updated timestamps
CREATE OR REPLACE FUNCTION update_last_updated()
RETURNS TRIGGER AS $$
BEGIN
NEW.last_updated = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Function to calculate portfolio metrics
CREATE OR REPLACE FUNCTION calculate_portfolio_metrics()
RETURNS TABLE(
total_value DECIMAL,
total_pnl DECIMAL,
position_count INTEGER,
avg_position_size DECIMAL
) AS $$
BEGIN
RETURN QUERY
SELECT
SUM(market_value) as total_value,
SUM(unrealized_pnl + realized_pnl) as total_pnl,
COUNT(*) as position_count,
AVG(market_value) as avg_position_size
FROM positions
WHERE shares > 0;
END;
$$ LANGUAGE plpgsql;
-- Function to get recent trades
CREATE OR REPLACE FUNCTION get_recent_trades(hours INTEGER DEFAULT 24)
RETURNS TABLE(
ticker VARCHAR,
action VARCHAR,
quantity INTEGER,
price DECIMAL,
executed_at TIMESTAMP WITH TIME ZONE
) AS $$
BEGIN
RETURN QUERY
SELECT
t.ticker,
t.action,
t.quantity,
t.price,
t.executed_at
FROM trades t
WHERE t.executed_at >= NOW() - INTERVAL '1 hour' * hours
ORDER BY t.executed_at DESC;
END;
$$ LANGUAGE plpgsql;
-- Create materialized view for performance metrics (updated hourly)
-- This will be created after the tables exist
-- Set up row-level security (RLS) for multi-tenant support
-- ALTER TABLE positions ENABLE ROW LEVEL SECURITY;
-- ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
-- Create audit log table for compliance
CREATE TABLE IF NOT EXISTS audit_log (
id SERIAL PRIMARY KEY,
table_name VARCHAR(50) NOT NULL,
operation VARCHAR(10) NOT NULL,
user_name VARCHAR(50),
changed_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
old_data JSONB,
new_data JSONB
);
-- Audit trigger function
CREATE OR REPLACE FUNCTION audit_trigger_function()
RETURNS TRIGGER AS $$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO audit_log(table_name, operation, user_name, new_data)
VALUES (TG_TABLE_NAME, TG_OP, current_user, row_to_json(NEW));
RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
INSERT INTO audit_log(table_name, operation, user_name, old_data, new_data)
VALUES (TG_TABLE_NAME, TG_OP, current_user, row_to_json(OLD), row_to_json(NEW));
RETURN NEW;
ELSIF TG_OP = 'DELETE' THEN
INSERT INTO audit_log(table_name, operation, user_name, old_data)
VALUES (TG_TABLE_NAME, TG_OP, current_user, row_to_json(OLD));
RETURN OLD;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
-- Performance settings
ALTER SYSTEM SET shared_buffers = '256MB';
ALTER SYSTEM SET effective_cache_size = '1GB';
ALTER SYSTEM SET maintenance_work_mem = '64MB';
ALTER SYSTEM SET checkpoint_completion_target = 0.9;
ALTER SYSTEM SET wal_buffers = '16MB';
ALTER SYSTEM SET default_statistics_target = 100;
ALTER SYSTEM SET random_page_cost = 1.1;
-- Reload configuration
SELECT pg_reload_conf();
-- Create initial admin notification
DO $$
BEGIN
RAISE NOTICE 'Database initialization complete for Autonomous Trading System';
RAISE NOTICE 'TimescaleDB enabled for time-series optimization';
RAISE NOTICE 'Audit logging configured for compliance';
END $$;