159 lines
4.2 KiB
TypeScript
159 lines
4.2 KiB
TypeScript
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;
|
|
};
|
|
|