>체결데이타 HHMM으로 그룹화 HTML(.feat 서버처리)
서버내에서, 전체 SELECT되어진 데이타에 대해서 그룹 처리한다.
- DB에서 Group By하기에는, 시간이 많이 소요된다.
- 전체 데이타를 가져와서, 코드상에서 Group By를 실행한다.
List<object[]> dataList = datasqlite.SelectDataFromSQLiteToStr(PublicNM.findPossibleCodeTableNM(trText), "WHERE STOCKCODE = " + "'" + codeText + "'", APMSQLite.GetInstance.groupAConn);
List<ExturePlusKseTradeText> indexList = datasqlite.ConvertToExturePlusKseTrade(dataList);
List<ExturePlusKseTradeText> groupedindexList = indexList
.GroupBy(data => data.transactionProcessingTime.Substring(0, 4)) // HHMM 기준으로 그룹화
.Select(group => {
var firstItem = group.First(); // 그룹 내 첫 번째 항목을 선택
var lastItem = group.Last(); // 그룹 내 마지막 항목을 선택
// 그룹 내 tradePrice 값들로부터 highPrice, lowPrice, openPrice 계산
var tradePrices = group
.Select(item => int.TryParse(item.tradePrice, out int tradePrice) ? tradePrice : 0)
.ToList();
var highPriceInGroup = tradePrices.Max(); // 그룹 내에서 최고 가격
var lowPriceInGroup = tradePrices.Min(); // 그룹 내에서 최저 가격
var openPriceInGroup = tradePrices.FirstOrDefault().ToString(); // 그룹 내 첫 번째 항목의 tradePrice
return new ExturePlusKseTradeText
{
// 1분 단위로 그룹화된 시간 (HHMM)
transactionProcessingTime = group.Key,
// 거래량 합산 후 문자열로 변환
tradeVolume = group.Sum(item => int.TryParse(item.tradeVolume, out int tradeVol) ? tradeVol : 0).ToString(),
// 마지막 데이터에서 tradePrice, upDown, gap 등을 선택
tradePrice = lastItem.tradePrice ?? "0", // null인 경우 "0"을 기본값으로 설정
upDown = lastItem.upDown ?? "0", // null인 경우 "0"을 기본값으로 설정
gap = lastItem.gap ?? "0", // null인 경우 "0"을 기본값으로 설정
// 그룹 내 첫 번째부터 마지막까지의 최고/최저 가격을 설정
highPrice = highPriceInGroup.ToString(),
lowPrice = lowPriceInGroup.ToString(),
// 그룹 내 첫 번째 항목에서 openPrice를 가져오기
openPrice = openPriceInGroup, // 첫 번째 항목에서 tradePrice 가져오기
// 나머지 필드들도 마지막 데이터에서 가져오기
accmTradeVolume = lastItem.accmTradeVolume ?? "0", // null인 경우 "0"을 기본값으로 설정
accmTradeAmount = lastItem.accmTradeAmount ?? "0", // null인 경우 "0"을 기본값으로 설정
// 나머지 항목들도 마지막 데이터에서 가져오기
dataClass = lastItem.dataClass ?? "0", // null인 경우 "0"을 기본값으로 설정
infoMarketClass = lastItem.infoMarketClass ?? "0", // null인 경우 "0"을 기본값으로 설정
distributeStockIndex = lastItem.distributeStockIndex ?? "0", // null인 경우 "0"을 기본값으로 설정
boardID = lastItem.boardID ?? "0", // null인 경우 "0"을 기본값으로 설정
sessionID = lastItem.sessionID ?? "0", // null인 경우 "0"을 기본값으로 설정
stockCode = lastItem.stockCode ?? "0", // null인 경우 "0"을 기본값으로 설정
stockSeq = lastItem.stockSeq ?? "0", // null인 경우 "0"을 기본값으로 설정
// 나머지 필드들도 "NULL" 또는 "0" 처리
lastAskBidClassCode = lastItem.lastAskBidClassCode ?? "0",
LPHoldingVolume = lastItem.LPHoldingVolume ?? "0",
askOneQuote = lastItem.askOneQuote ?? "0",
bidOneQuote = lastItem.bidOneQuote ?? "0",
endText = lastItem.endText ?? "0" // "NULL"을 "0"으로 처리
};
})
.ToList();
for (int kk = 0; kk < groupedindexList.Count; kk++)
{
mmmList.Add(JsonConvert.SerializeObject(groupedindexList[kk]));
}
return mmmList;
Redis.Tick.Server에 TCP 정보분배.데이타 강제 입력하는 부분.스크린샷
Windows 에서의 debug는 SendMessage를 통해서 로그를 출력한다.
Windows 에서는 파일로 로그출력하는 방식보다, 훨씬 효과적이다. 리눅스에서는 파일로 디버깅 로그를 출력하도록 한다.
'java 언어 > Node.Server' 카테고리의 다른 글
부하 테스트 도구와 명령어(.feat Windows 환경) (0) | 2024.12.23 |
---|---|
실시간 Push 데이타 적용(Index.HTML) (0) | 2024.12.20 |
유사 종목명에 대한 종목코드 처리(팝업이용) (0) | 2024.12.10 |
Dynamic HTML(데이타를 출력할때에 동적으로 HTML을 생성한다.) (0) | 2024.12.05 |
SQLite는 독립적인 파일 기반 데이터베이스로, SQLite 명령줄 도구 sqlite3.exe를 통해 데이터베이스 파일을 쉽게 핸들링할 수 있습니다. (0) | 2024.12.02 |