You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
294 lines
9.5 KiB
294 lines
9.5 KiB
-- CreateTable
|
|
CREATE TABLE "users" (
|
|
"id" SERIAL NOT NULL,
|
|
"username" VARCHAR(50) NOT NULL,
|
|
"email" VARCHAR(100) NOT NULL,
|
|
"password_hash" VARCHAR(255) NOT NULL,
|
|
"phone" VARCHAR(20),
|
|
"avatar_url" VARCHAR(255),
|
|
"membership_level" INTEGER NOT NULL DEFAULT 0,
|
|
"is_active" BOOLEAN NOT NULL DEFAULT true,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "user_sessions" (
|
|
"id" SERIAL NOT NULL,
|
|
"user_id" INTEGER NOT NULL,
|
|
"token" VARCHAR(500) NOT NULL,
|
|
"expires_at" TIMESTAMP(3) NOT NULL,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "user_sessions_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "products" (
|
|
"id" SERIAL NOT NULL,
|
|
"symbol" VARCHAR(20) NOT NULL,
|
|
"name" VARCHAR(100) NOT NULL,
|
|
"category" VARCHAR(50) NOT NULL,
|
|
"exchange" VARCHAR(50),
|
|
"unit" VARCHAR(20),
|
|
"min_change" DECIMAL(10,4),
|
|
"description" TEXT,
|
|
"is_active" BOOLEAN NOT NULL DEFAULT true,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "products_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "kline_data" (
|
|
"id" SERIAL NOT NULL,
|
|
"product_id" INTEGER NOT NULL,
|
|
"period" VARCHAR(10) NOT NULL,
|
|
"time" TIMESTAMP(3) NOT NULL,
|
|
"open" DECIMAL(18,6) NOT NULL,
|
|
"high" DECIMAL(18,6) NOT NULL,
|
|
"low" DECIMAL(18,6) NOT NULL,
|
|
"close" DECIMAL(18,6) NOT NULL,
|
|
"volume" BIGINT NOT NULL,
|
|
"open_interest" BIGINT,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "kline_data_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "tick_data" (
|
|
"id" SERIAL NOT NULL,
|
|
"product_id" INTEGER NOT NULL,
|
|
"price" DECIMAL(18,6) NOT NULL,
|
|
"change" DECIMAL(18,6) NOT NULL,
|
|
"change_percent" DECIMAL(10,4) NOT NULL,
|
|
"open" DECIMAL(18,6) NOT NULL,
|
|
"high" DECIMAL(18,6) NOT NULL,
|
|
"low" DECIMAL(18,6) NOT NULL,
|
|
"volume" BIGINT NOT NULL,
|
|
"open_interest" BIGINT,
|
|
"bid_price" DECIMAL(18,6),
|
|
"ask_price" DECIMAL(18,6),
|
|
"bid_volume" BIGINT,
|
|
"ask_volume" BIGINT,
|
|
"timestamp" TIMESTAMP(3) NOT NULL,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "tick_data_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "watchlist" (
|
|
"id" SERIAL NOT NULL,
|
|
"user_id" INTEGER NOT NULL,
|
|
"symbol" VARCHAR(20) NOT NULL,
|
|
"alert_price" DECIMAL(18,6),
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "watchlist_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "price_alerts" (
|
|
"id" SERIAL NOT NULL,
|
|
"user_id" INTEGER NOT NULL,
|
|
"symbol" VARCHAR(20) NOT NULL,
|
|
"alert_type" VARCHAR(20) NOT NULL,
|
|
"alert_price" DECIMAL(18,6) NOT NULL,
|
|
"is_active" BOOLEAN NOT NULL DEFAULT true,
|
|
"triggered_at" TIMESTAMP(3),
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "price_alerts_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "hot_events" (
|
|
"id" SERIAL NOT NULL,
|
|
"title" VARCHAR(255) NOT NULL,
|
|
"content" TEXT,
|
|
"summary" TEXT,
|
|
"impact" VARCHAR(20) NOT NULL,
|
|
"impact_level" INTEGER NOT NULL,
|
|
"source" VARCHAR(100),
|
|
"analysis" TEXT,
|
|
"risks" VARCHAR(255)[],
|
|
"event_time" TIMESTAMP(3),
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "hot_events_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "event_products" (
|
|
"id" SERIAL NOT NULL,
|
|
"event_id" INTEGER NOT NULL,
|
|
"product_id" INTEGER NOT NULL,
|
|
"impact_confidence" DECIMAL(3,2),
|
|
|
|
CONSTRAINT "event_products_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "trading_signals" (
|
|
"id" SERIAL NOT NULL,
|
|
"product_id" INTEGER NOT NULL,
|
|
"timeframe" VARCHAR(10) NOT NULL,
|
|
"signal_type" VARCHAR(20) NOT NULL,
|
|
"strength" INTEGER NOT NULL,
|
|
"indicators" JSONB,
|
|
"description" TEXT,
|
|
"entry_price" DECIMAL(18,6),
|
|
"stop_loss" DECIMAL(18,6),
|
|
"target_price" DECIMAL(18,6),
|
|
"is_active" BOOLEAN NOT NULL DEFAULT true,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "trading_signals_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "option_contracts" (
|
|
"id" SERIAL NOT NULL,
|
|
"product_id" INTEGER NOT NULL,
|
|
"symbol" VARCHAR(20) NOT NULL,
|
|
"type" VARCHAR(10) NOT NULL,
|
|
"strike_price" DECIMAL(18,6) NOT NULL,
|
|
"expiry_date" TIMESTAMP(3) NOT NULL,
|
|
"price" DECIMAL(18,6),
|
|
"iv" DECIMAL(10,4),
|
|
"delta" DECIMAL(10,4),
|
|
"gamma" DECIMAL(10,4),
|
|
"theta" DECIMAL(10,4),
|
|
"vega" DECIMAL(10,4),
|
|
"rho" DECIMAL(10,4),
|
|
"volume" BIGINT,
|
|
"open_interest" BIGINT,
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "option_contracts_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "paper_trades" (
|
|
"id" SERIAL NOT NULL,
|
|
"user_id" INTEGER NOT NULL,
|
|
"symbol" VARCHAR(20) NOT NULL,
|
|
"direction" VARCHAR(10) NOT NULL,
|
|
"entry_price" DECIMAL(18,6) NOT NULL,
|
|
"exit_price" DECIMAL(18,6),
|
|
"quantity" INTEGER NOT NULL,
|
|
"entry_time" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"exit_time" TIMESTAMP(3),
|
|
"pnl" DECIMAL(18,6),
|
|
"pnl_percent" DECIMAL(10,4),
|
|
"status" VARCHAR(20) NOT NULL DEFAULT 'open',
|
|
"notes" TEXT,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "paper_trades_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "system_configs" (
|
|
"id" SERIAL NOT NULL,
|
|
"key" VARCHAR(100) NOT NULL,
|
|
"value" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "system_configs_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "users_username_key" ON "users"("username");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "user_sessions_token_key" ON "user_sessions"("token");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "user_sessions_token_idx" ON "user_sessions"("token");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "products_symbol_key" ON "products"("symbol");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "kline_data_product_id_period_time_idx" ON "kline_data"("product_id", "period", "time");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "kline_data_product_id_period_time_key" ON "kline_data"("product_id", "period", "time");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "tick_data_product_id_timestamp_idx" ON "tick_data"("product_id", "timestamp");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "watchlist_user_id_idx" ON "watchlist"("user_id");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "watchlist_user_id_symbol_key" ON "watchlist"("user_id", "symbol");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "price_alerts_user_id_idx" ON "price_alerts"("user_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "price_alerts_symbol_is_active_idx" ON "price_alerts"("symbol", "is_active");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "event_products_event_id_product_id_key" ON "event_products"("event_id", "product_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "trading_signals_product_id_timeframe_created_at_idx" ON "trading_signals"("product_id", "timeframe", "created_at");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "option_contracts_product_id_expiry_date_idx" ON "option_contracts"("product_id", "expiry_date");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "option_contracts_product_id_type_strike_price_expiry_date_key" ON "option_contracts"("product_id", "type", "strike_price", "expiry_date");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "paper_trades_user_id_idx" ON "paper_trades"("user_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "paper_trades_user_id_status_idx" ON "paper_trades"("user_id", "status");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "system_configs_key_key" ON "system_configs"("key");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "user_sessions" ADD CONSTRAINT "user_sessions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "kline_data" ADD CONSTRAINT "kline_data_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "tick_data" ADD CONSTRAINT "tick_data_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "watchlist" ADD CONSTRAINT "watchlist_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "price_alerts" ADD CONSTRAINT "price_alerts_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "event_products" ADD CONSTRAINT "event_products_event_id_fkey" FOREIGN KEY ("event_id") REFERENCES "hot_events"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "event_products" ADD CONSTRAINT "event_products_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "trading_signals" ADD CONSTRAINT "trading_signals_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "option_contracts" ADD CONSTRAINT "option_contracts_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "paper_trades" ADD CONSTRAINT "paper_trades_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|