This commit is contained in:
2026-02-12 10:24:03 +09:00
parent 3cea3e66d0
commit 8f1d75b4d5
41 changed files with 22902 additions and 43669 deletions

View File

@@ -4,11 +4,17 @@ import type {
} from "@/features/trade/types/trade.types";
const REALTIME_SIGN_NEGATIVE = new Set(["4", "5"]);
const ALLOWED_REALTIME_TRADE_TR_IDS = new Set([
const EXECUTED_REALTIME_TRADE_TR_IDS = new Set([
"H0STCNT0",
"H0STANC0",
"H0STOUP0",
"H0UNCNT0",
"H0NXCNT0",
]);
const EXPECTED_REALTIME_TRADE_TR_IDS = new Set([
"H0STANC0",
"H0STOAC0",
"H0UNANC0",
"H0NXANC0",
]);
const TICK_FIELD_INDEX = {
@@ -29,6 +35,7 @@ const TICK_FIELD_INDEX = {
buyExecutionCount: 16,
netBuyExecutionCount: 17,
tradeStrength: 18,
executionClassCode: 21,
} as const;
/**
@@ -71,7 +78,10 @@ export function parseKisRealtimeTickBatch(raw: string, expectedSymbol: string) {
// TR ID check: regular tick / expected tick / after-hours tick.
const receivedTrId = parts[1];
if (!ALLOWED_REALTIME_TRADE_TR_IDS.has(receivedTrId)) {
const isExecutedTick = EXECUTED_REALTIME_TRADE_TR_IDS.has(receivedTrId);
const isExpectedTick = EXPECTED_REALTIME_TRADE_TR_IDS.has(receivedTrId);
// 체결 화면에는 "실제 체결 TR"만 반영하고 예상체결 TR은 제외합니다.
if (!isExecutedTick || isExpectedTick) {
return [] as DashboardRealtimeTradeTick[];
}
@@ -88,18 +98,15 @@ export function parseKisRealtimeTickBatch(raw: string, expectedSymbol: string) {
return [] as DashboardRealtimeTradeTick[];
}
const normalizedExpected = normalizeDomesticSymbol(expectedSymbol);
const ticks: DashboardRealtimeTradeTick[] = [];
for (let index = 0; index < parsedCount; index++) {
const base = index * fieldsPerTick;
const symbol = readString(values, base + TICK_FIELD_INDEX.symbol);
if (symbol !== expectedSymbol) {
if (symbol.trim() !== expectedSymbol.trim()) {
console.warn(
`[KisRealtime] Symbol mismatch: received '${symbol}', expected '${expectedSymbol}'`,
);
continue;
}
const normalizedSymbol = normalizeDomesticSymbol(symbol);
if (normalizedSymbol !== normalizedExpected) {
continue;
}
const price = readNumber(values, base + TICK_FIELD_INDEX.price);
@@ -119,7 +126,7 @@ export function parseKisRealtimeTickBatch(raw: string, expectedSymbol: string) {
: rawChangeRate;
ticks.push({
symbol,
symbol: normalizedExpected,
tickTime: readString(values, base + TICK_FIELD_INDEX.tickTime),
price,
change,
@@ -144,6 +151,10 @@ export function parseKisRealtimeTickBatch(raw: string, expectedSymbol: string) {
values,
base + TICK_FIELD_INDEX.netBuyExecutionCount,
),
executionClassCode: readString(
values,
base + TICK_FIELD_INDEX.executionClassCode,
),
open: readNumber(values, base + TICK_FIELD_INDEX.open),
high: readNumber(values, base + TICK_FIELD_INDEX.high),
low: readNumber(values, base + TICK_FIELD_INDEX.low),