전체적인 리팩토링
This commit is contained in:
@@ -459,6 +459,7 @@ export async function getDomesticDailyTimeChart(
|
||||
* - 일봉/주봉: inquire-daily-itemchartprice (FHKST03010100), 과거 페이징 지원
|
||||
* - 분봉 (오늘): inquire-time-itemchartprice (FHKST03010200)
|
||||
* - 분봉 (과거): inquire-time-dailychartprice (FHKST03010230)
|
||||
* - 지원 분봉: 1m/5m/10m/15m/30m/1h (서버에서 minute bucket 집계)
|
||||
*/
|
||||
export async function getDomesticChart(
|
||||
symbol: string,
|
||||
@@ -505,7 +506,7 @@ export async function getDomesticChart(
|
||||
return { candles: parsed, hasMore: Boolean(nextCursor), nextCursor };
|
||||
}
|
||||
|
||||
// ── 분봉 (1m / 30m / 1h) ──
|
||||
// ── 분봉 (1m / 5m / 10m / 15m / 30m / 1h) ──
|
||||
const minuteBucket = minutesForTimeframe(timeframe);
|
||||
let rawRows: Array<Record<string, unknown>> = [];
|
||||
let nextCursor: string | null = null;
|
||||
@@ -522,44 +523,40 @@ export async function getDomesticChart(
|
||||
);
|
||||
|
||||
// 다음 커서 계산
|
||||
// 데이터가 있으면 가장 오래된 시간 - 1분? 혹은 해당 날짜의 09:00 도달 시 전일로 이동
|
||||
// API가 시간 역순으로 데이터를 준다고 가정 (output[0]이 가장 최신, output[last]가 가장 과거)
|
||||
// 실제 KIS API는 보통 최신순 정렬
|
||||
if (rawRows.length > 0) {
|
||||
// 가장 과거 데이터의 시간 확인
|
||||
const oldestRow = rawRows[rawRows.length - 1]; // 마지막이 가장 과거라 가정
|
||||
const oldestTime = readRowString(oldestRow, "stck_cntg_hour");
|
||||
|
||||
// 09:00:00보다 크면 계속 같은 날짜 페이징 (단, KIS가 120건씩 주므로)
|
||||
// 만약 09시 근처라면 전일로 이동
|
||||
// 간단히: 가져온 데이터 중 090000이 포함되어 있거나, 더 가져올 게 없어 보이면 전일로
|
||||
// 여기서는 단순히 전일 153000으로 넘어가는 로직을 사용하거나,
|
||||
// 현재 날짜에서 시간을 줄여서 재요청해야 함.
|
||||
// KIS API가 '다음 커서'를 주지 않으므로, 마지막 데이터 시간을 기준으로 다음 요청
|
||||
|
||||
const oldestRow = rawRows[rawRows.length - 1];
|
||||
const oldestTimeRaw = oldestRow
|
||||
? readRowString(oldestRow, "stck_cntg_hour", "STCK_CNTG_HOUR")
|
||||
: "";
|
||||
const oldestDateRaw = oldestRow
|
||||
? readRowString(oldestRow, "stck_bsop_date", "STCK_BSOP_DATE")
|
||||
: "";
|
||||
const oldestTime = /^\d{6}$/.test(oldestTimeRaw)
|
||||
? oldestTimeRaw
|
||||
: /^\d{4}$/.test(oldestTimeRaw)
|
||||
? `${oldestTimeRaw}00`
|
||||
: "";
|
||||
const oldestDate = /^\d{8}$/.test(oldestDateRaw)
|
||||
? oldestDateRaw
|
||||
: targetDate;
|
||||
|
||||
if (oldestTime && Number(oldestTime) > 90000) {
|
||||
// 같은 날짜, 시간만 조정 (1분 전)
|
||||
// HHMMSS -> number -> subtract -> string
|
||||
// 편의상 120개 꽉 찼으면 마지막 시간 사용, 아니면 전일로
|
||||
if (rawRows.length >= 120) {
|
||||
nextCursor = targetDate + oldestTime; // 다음 요청 시 이 시간 '이전'을 달라고 해야 함 (Inclusive 여부 확인 필요)
|
||||
// 만약 Inclusive라면 -1분 해야 함. 안전하게 -1분 처리
|
||||
// 시간 연산이 복잡하므로, 단순히 전일로 넘어가는 게 나을 수도 있으나,
|
||||
// 하루치 분봉이 380개라 120개로는 부족함.
|
||||
// 따라서 시간 연산 필요.
|
||||
nextCursor = targetDate + subOneMinute(oldestTime);
|
||||
} else {
|
||||
// 120개 미만이면 장 시작까지 다 가져왔다고 가정 -> 전일로
|
||||
nextCursor = shiftYmd(targetDate, -1) + "153000";
|
||||
}
|
||||
// 120건을 꽉 채웠으면 같은 날짜에서 더 과거 시간을, 아니면 전일로 이동합니다.
|
||||
if (rawRows.length >= 120) {
|
||||
const nextTime = subOneMinute(oldestTime);
|
||||
nextCursor =
|
||||
nextTime === targetTime
|
||||
? shiftYmd(oldestDate, -1) + "153000"
|
||||
: oldestDate + nextTime;
|
||||
} else {
|
||||
nextCursor = shiftYmd(oldestDate, -1) + "153000";
|
||||
}
|
||||
} else {
|
||||
// 09:00 도달 -> 전일로
|
||||
nextCursor = shiftYmd(targetDate, -1) + "153000";
|
||||
nextCursor = shiftYmd(oldestDate, -1) + "153000";
|
||||
}
|
||||
} else {
|
||||
// 데이터 없음 (휴장일 등) -> 전일로 계속 시도 (최대 5일? 무한 루프 방지 필요하나 UI에서 제어)
|
||||
nextCursor = shiftYmd(targetDate, -1) + "153000";
|
||||
// 너무 과거(1년)면 중단? 일단 생략
|
||||
// 데이터 없음(휴장일 등)인 경우 전일 기준으로 한 번 더 탐색합니다.
|
||||
nextCursor = shiftYmd(targetDate, -1) + "153000";
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user