goldenChat base source add
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
import axios from 'axios';
|
||||
import { API_BASE_URL } from './apiConfig';
|
||||
|
||||
// 기간 정보 타입
|
||||
export interface PeriodInfo {
|
||||
id: number;
|
||||
period: number;
|
||||
isDefault: boolean;
|
||||
enabled: boolean;
|
||||
displayOrder: number;
|
||||
}
|
||||
|
||||
// 지표별 기간 응답 타입
|
||||
export interface IndicatorPeriodsResponse {
|
||||
indicatorType: string;
|
||||
indicatorDisplayName: string;
|
||||
periods: PeriodInfo[];
|
||||
defaultPeriod: number | null;
|
||||
}
|
||||
|
||||
// 기간 요청 타입
|
||||
export interface PeriodRequest {
|
||||
indicatorType: string;
|
||||
period: number;
|
||||
isDefault?: boolean;
|
||||
displayOrder?: number;
|
||||
enabled?: boolean;
|
||||
}
|
||||
|
||||
// 기간 설정 DTO
|
||||
export interface IndicatorPeriodSettingDto {
|
||||
id: number;
|
||||
indicatorType: string;
|
||||
period: number;
|
||||
isDefault: boolean;
|
||||
displayOrder: number;
|
||||
enabled: boolean;
|
||||
}
|
||||
|
||||
// 기간이 필요 없는 지표 목록
|
||||
export const PERIOD_NOT_REQUIRED_INDICATORS = [
|
||||
'MACD', 'MACD_HISTOGRAM'
|
||||
];
|
||||
|
||||
/**
|
||||
* 기간이 필요한 지표인지 확인
|
||||
*/
|
||||
export const isPeriodRequired = (indicatorType: string): boolean => {
|
||||
return !PERIOD_NOT_REQUIRED_INDICATORS.includes(indicatorType);
|
||||
};
|
||||
|
||||
/**
|
||||
* 모든 지표의 기간 설정 조회
|
||||
*/
|
||||
export const getAllIndicatorPeriods = async (): Promise<IndicatorPeriodsResponse[]> => {
|
||||
const response = await axios.get(`${API_BASE_URL}/indicator-periods`);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
/**
|
||||
* 특정 지표의 기간 설정 조회
|
||||
*/
|
||||
export const getIndicatorPeriods = async (indicatorType: string): Promise<IndicatorPeriodsResponse> => {
|
||||
const response = await axios.get(`${API_BASE_URL}/indicator-periods/${indicatorType}`);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
/**
|
||||
* 특정 지표의 활성화된 기간 목록 조회 (드롭다운용)
|
||||
*/
|
||||
export const getEnabledPeriods = async (indicatorType: string): Promise<number[]> => {
|
||||
const response = await axios.get(`${API_BASE_URL}/indicator-periods/${indicatorType}/enabled`);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
/**
|
||||
* 모든 지표의 활성화된 기간 맵 조회
|
||||
*/
|
||||
export const getAllEnabledPeriodsMap = async (): Promise<Record<string, number[]>> => {
|
||||
const response = await axios.get(`${API_BASE_URL}/indicator-periods/map`);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
/**
|
||||
* 기간 추가
|
||||
*/
|
||||
export const addPeriod = async (request: PeriodRequest): Promise<IndicatorPeriodSettingDto> => {
|
||||
const response = await axios.post(`${API_BASE_URL}/indicator-periods`, request);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
/**
|
||||
* 기간 수정
|
||||
*/
|
||||
export const updatePeriod = async (id: number, request: Partial<PeriodRequest>): Promise<IndicatorPeriodSettingDto> => {
|
||||
const response = await axios.put(`${API_BASE_URL}/indicator-periods/${id}`, request);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
/**
|
||||
* 기간 삭제
|
||||
*/
|
||||
export const deletePeriod = async (id: number): Promise<void> => {
|
||||
await axios.delete(`${API_BASE_URL}/indicator-periods/${id}`);
|
||||
};
|
||||
|
||||
/**
|
||||
* 지표 타입 표시명 가져오기 - 업비트 표준 16개
|
||||
*/
|
||||
export const getIndicatorDisplayName = (indicatorType: string): string => {
|
||||
const displayNames: Record<string, string> = {
|
||||
VOLUME: '거래량',
|
||||
MACD: 'MACD',
|
||||
STOCHASTIC: 'Stochastic Slow',
|
||||
RSI: 'RSI',
|
||||
ADX: 'ADX',
|
||||
CCI: 'CCI',
|
||||
TRIX: 'TRIX',
|
||||
DISPARITY: '이격도',
|
||||
NEW_PSYCHOLOGICAL: '신심리도',
|
||||
INVEST_PSYCHOLOGICAL: '투자심리도',
|
||||
WILLIAMS_R: 'Williams %R',
|
||||
BWI: '볼린저밴드 %B',
|
||||
OBV: 'OBV',
|
||||
VOLUME_OSC: 'VolumeOSC',
|
||||
VR: 'VR',
|
||||
DMI: 'DMI',
|
||||
};
|
||||
return displayNames[indicatorType] || indicatorType;
|
||||
};
|
||||
|
||||
// 캐시된 기간 맵 (성능 최적화)
|
||||
let cachedPeriodsMap: Record<string, number[]> | null = null;
|
||||
let cacheTimestamp: number = 0;
|
||||
const CACHE_DURATION = 5 * 60 * 1000; // 5분
|
||||
|
||||
/**
|
||||
* 캐시된 기간 맵 조회 (성능 최적화)
|
||||
*/
|
||||
export const getCachedPeriodsMap = async (): Promise<Record<string, number[]>> => {
|
||||
const now = Date.now();
|
||||
if (cachedPeriodsMap && (now - cacheTimestamp) < CACHE_DURATION) {
|
||||
return cachedPeriodsMap;
|
||||
}
|
||||
|
||||
cachedPeriodsMap = await getAllEnabledPeriodsMap();
|
||||
cacheTimestamp = now;
|
||||
return cachedPeriodsMap;
|
||||
};
|
||||
|
||||
/**
|
||||
* 캐시 무효화
|
||||
*/
|
||||
export const invalidatePeriodsCache = (): void => {
|
||||
cachedPeriodsMap = null;
|
||||
cacheTimestamp = 0;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user