154 lines
4.4 KiB
PL/PgSQL
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 $$; |