138 lines
3.0 KiB
TypeScript
138 lines
3.0 KiB
TypeScript
|
|
export enum MarketType {
|
|
DOMESTIC = 'Domestic',
|
|
OVERSEAS = 'Overseas'
|
|
}
|
|
|
|
export enum OrderType {
|
|
BUY = 'BUY',
|
|
SELL = 'SELL'
|
|
}
|
|
|
|
export type AiProviderType = 'gemini' | 'openai-compatible';
|
|
|
|
export interface AiConfig {
|
|
id: string;
|
|
name: string;
|
|
providerType: AiProviderType;
|
|
modelName: string;
|
|
baseUrl?: string;
|
|
}
|
|
|
|
export interface ApiSettings {
|
|
appKey: string;
|
|
appSecret: string;
|
|
accountNumber: string;
|
|
useTelegram: boolean;
|
|
telegramToken: string;
|
|
telegramChatId: string;
|
|
useNaverNews: boolean;
|
|
naverClientId: string;
|
|
naverClientSecret: string;
|
|
aiConfigs: AiConfig[];
|
|
preferredNewsAiId?: string;
|
|
preferredStockAiId?: string;
|
|
preferredNewsJudgementAiId?: string;
|
|
preferredAutoBuyAiId?: string;
|
|
preferredAutoSellAiId?: string;
|
|
}
|
|
|
|
export interface StockTick {
|
|
code: string;
|
|
price: number;
|
|
timestamp: number;
|
|
}
|
|
|
|
export interface StockItem {
|
|
code: string;
|
|
name: string;
|
|
price: number;
|
|
change: number;
|
|
changePercent: number;
|
|
market: MarketType;
|
|
volume: number;
|
|
tradingValue?: number; // 거래대금
|
|
buyRatio?: number; // 매수 비율 (0-100)
|
|
sellRatio?: number; // 매도 비율 (0-100)
|
|
per?: number;
|
|
pbr?: number;
|
|
roe?: number;
|
|
marketCap?: number;
|
|
dividendYield?: number;
|
|
aiScoreBuy: number;
|
|
aiScoreSell: number;
|
|
openPrice?: number; // 시가
|
|
highPrice?: number; // 고가
|
|
lowPrice?: number; // 저가
|
|
themes?: string[];
|
|
// --- New Fields ---
|
|
memo?: string; // 사용자 메모
|
|
aiAnalysis?: string; // AI 분석 리포트 텍스트
|
|
isHidden?: boolean; // 종목 숨김 여부
|
|
}
|
|
|
|
export interface TradeOrder {
|
|
id: string;
|
|
stockCode: string;
|
|
stockName: string;
|
|
type: OrderType;
|
|
price: number;
|
|
quantity: number;
|
|
status: 'PENDING' | 'COMPLETED' | 'CANCELLED';
|
|
timestamp: Date;
|
|
}
|
|
|
|
export interface ReservedOrder {
|
|
id: string;
|
|
stockCode: string;
|
|
stockName: string;
|
|
type: OrderType;
|
|
quantity: number;
|
|
monitoringType: 'PRICE_TRIGGER' | 'TRAILING_STOP';
|
|
triggerPrice: number;
|
|
trailingType: 'PERCENT' | 'AMOUNT';
|
|
trailingValue: number;
|
|
useStopLoss?: boolean;
|
|
stopLossType?: 'PERCENT' | 'AMOUNT';
|
|
stopLossValue?: number;
|
|
sellAll?: boolean;
|
|
highestPrice?: number;
|
|
lowestPrice?: number;
|
|
market: MarketType;
|
|
status: 'WAITING' | 'MONITORING' | 'TRIGGERED' | 'CANCELLED';
|
|
createdAt: Date;
|
|
expiryDate: Date;
|
|
}
|
|
|
|
export interface AutoTradeConfig {
|
|
id: string;
|
|
stockCode?: string;
|
|
stockName: string;
|
|
groupId?: string;
|
|
type: 'ACCUMULATION' | 'TRAILING_STOP';
|
|
quantity: number;
|
|
frequency: 'DAILY' | 'WEEKLY' | 'MONTHLY';
|
|
specificDay?: number;
|
|
executionTime: string;
|
|
trailingPercent?: number;
|
|
active: boolean;
|
|
market: MarketType;
|
|
}
|
|
|
|
export interface WatchlistGroup {
|
|
id: string;
|
|
name: string;
|
|
codes: string[];
|
|
market: MarketType;
|
|
}
|
|
|
|
export interface NewsItem {
|
|
title: string;
|
|
description: string;
|
|
link: string;
|
|
pubDate: string;
|
|
relatedThemes?: string[];
|
|
relatedStocks?: string[];
|
|
sentiment?: 'POSITIVE' | 'NEUTRAL' | 'NEGATIVE';
|
|
}
|