stock-bot/database/postgres/init/06-create-backtest-tables.sql

56 lines
No EOL
2 KiB
PL/PgSQL

-- Create enum for backtest status (if not exists)
DO $$ BEGIN
CREATE TYPE backtest_status AS ENUM ('pending', 'running', 'completed', 'failed', 'cancelled');
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
-- Create backtests table
CREATE TABLE IF NOT EXISTS backtests (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
strategy TEXT NOT NULL,
symbols JSONB NOT NULL,
start_date TIMESTAMP WITH TIME ZONE NOT NULL,
end_date TIMESTAMP WITH TIME ZONE NOT NULL,
initial_capital NUMERIC(20, 2) NOT NULL,
config JSONB DEFAULT '{}',
status backtest_status NOT NULL DEFAULT 'pending',
error TEXT,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);
-- Create backtest_results table
CREATE TABLE IF NOT EXISTS backtest_results (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
backtest_id UUID NOT NULL REFERENCES backtests(id) ON DELETE CASCADE,
completed_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
metrics JSONB NOT NULL,
equity_curve JSONB NOT NULL,
ohlc_data JSONB NOT NULL,
trades JSONB NOT NULL,
positions JSONB NOT NULL,
analytics JSONB NOT NULL,
execution_time INTEGER NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);
-- Create indexes for better query performance
CREATE INDEX idx_backtests_status ON backtests(status);
CREATE INDEX idx_backtests_created_at ON backtests(created_at DESC);
CREATE INDEX idx_backtests_strategy ON backtests(strategy);
CREATE INDEX idx_backtest_results_backtest_id ON backtest_results(backtest_id);
-- Create updated_at trigger
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ language 'plpgsql';
DROP TRIGGER IF EXISTS update_backtests_updated_at ON backtests;
CREATE TRIGGER update_backtests_updated_at BEFORE UPDATE
ON backtests FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();