>체결데이타 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 에서는 파일로 로그출력하는 방식보다, 훨씬 효과적이다. 리눅스에서는 파일로 디버깅 로그를 출력하도록 한다.

app.js
0.01MB
index.html
0.05MB

+ Recent posts