AUTO TRADE/[대신증권] CYBOS PLUS

대신증권 CYBOS PLUS 프로그램 구현 (7) - 일봉 차트 조회 : 일자 범위

프로그램 구현 목표

  • 일봉 차트 데이터 조회 함수 생성하기
  • 일자 범위를 가지고 차트 데이터 조회하기

 

일봉 차트 데이터 조회 함수 생성하기

함수를 구현하기 전에 앞서 우리는 캡슐화된 일봉 차트 데이터 조회 함수를 구현해야 한다. 다시 말해, 전체 종목에 대한 일봉 차트 데이터를 조회하는 함수를 생성하기 전에 특정 종목의 종목코드를 인자로 받아서 그 종목에 대한 일봉 차트 데이터를 조회하는 함수를 생성해주어야 한다. 왜냐하면 종목코드를 조회하는 함수는 이미 `def _GetStockListByMarket(self):` 함수를 통해서 구현해두었기 때문에, 이 함수에서 종목코드를 얻어다가 종목코드를 한개씩 인자로 전달하면서 그 종목에 대한 차트 데이터를 조회해야 하기 때문이다. 그렇다면 차트 데이터를 조회하는 모듈은 무엇일까 ?

바로 `CpSysDib` 모듈의 `StockChart`이다. 이전에 다른 모듈에 대해 코드를 짤 때부터 일관적인 규칙에 따라 py 파일을 생성하고 클래스를 생성했듯이, 이 모듈에 대해서도 동일하게 CpSysDib.py 파일을 생성한 후에 `class StockChart` 클래스를 생성해서 해당 클래스 내부에서 차트 조회 함수들을 구현해보도록 하자.

## CpSysDib.py ##
import win32com.client

class StockChart:
    def __init__(self):
        self.stockchart = win32com.client.Dispatch("CpSysDib.StockChart")  ## COM 인스턴스 생성

이제 `CpSysDib.StockChart` 모듈을 통해 차트 데이터를 조회하기 위해서는 서버로 전달해주어야 하는 데이터가 무엇이 있는지를 먼저 파악해야 하는데, 데이터를 전달하는 방식에야 물론 다양한 방식이 있겠지만 근본적으로는 데이터를 요청하는 요청구분이 기간('1')인 경우와 개수('2')인 경우로 분류할 수 있다. 요청 구분에 따른 데이터 조회의 범위를 요약하면 다음과 같다. 다시 말해, 우리는 요청 구분이 1인 경우에 데이터를 조회할 함수요청 구분이 2인 경우에 데이터를 조회할 함수를 구분해서 코드를 구현해야 한다.

  • 요청 구분이 1(기간): 일봉 차트만 조회가 가능함
  • 요청 구분이 2(개수): 일, 주, 월, 분, 틱 모두 조회 가능함

그 이유라 하면 요청 구분이 1(기간)인 경우에는 일단 '기간'이라는 개념 자체가 특정 일자(A)부터 또 다른 특정 일자(B)까지를 의미하기 때문에 반드시 두 개의 날짜 데이터를 함께 전달해줘야만 그 기간에 대한 데이터를 조회할 수 있지만, 요청 구분이 2(개수)인 경우에는 두 개의 날짜 데이터가 아닌 요청할 데이터의 개수를 전달해주어야 하기 때문이다. 구현하고자 하는 차트 데이터 조회 함수를 요약하자면 아래와 같이 정리할 수 있다.

  • '특정 기간'에 대한 일봉 차트 데이터 조회
  • '특정 개수' 만큼의 분봉·일봉·주봉·월봉 차트 데이터 조회

 

 

일자 범위를 가지고 차트 데이터 조회하기

이 목차에서 구현하고자 하는 함수는 말 그대로 '요청 시작일'과 '요청 종료일'이라는 두 개의 데이터를 함께 전달하여 시작일부터 종료일까지에 해당하는 기간에 해당하는 일봉 차트 데이터를 조회하는 함수이다. 일자 범위를 전달하여 차트 데이터를 조회하는 함수는 기본적으로 '일봉 차트 데이터'만 조회가 가능하다. 이는 프로그램 구현의 한계가 아니라 대신증권 Open API에서 그렇게 제공하고 있으니 참고하도록 하자. 이 모듈에서 데이터를 요청할 때 서버로 전달해주어야 하는 데이터 목록은 아래와 같다. 

이제 어떠한 데이터를 전달해줘야 하는지 확인했으니 `def _day_range`라는 함수를 만들어서 일자 범위를 갖고 일봉 차트 데이터를 조회하는 함수를 만들어보도록 하자. 
※ Line: 8, 9

## CpSysDib.py ##
import win32com.client

class StockChart:
    def __init__(self):
        self.stockchart = win32com.client.Dispatch("CpSysDib.StockChart")  ## COM 인스턴스 생성
        
    def _day_range(self):
        pass

이제 함수를 생성해주었다면 해당 함수에서 전달받도록 할 인자들을 살펴보도록 하자. 바로 위의 사진에서 살펴봤듯이 일자 범위를 가지고 데이터를 조회할 경우 Type 0, 1, 2, 3, 5, 6, 8, 9, 10, 11에 해당하는 10개의 데이터를 모두 입력해주어야 하는데, 그렇다고 해서 이 데이터를 모두 인자로 전달받아야 하는 건 아니다. 일단 하나씩 살펴보자면, `Type 0`에 해당하는 종목코드는 반드시 전달받아야겠지만, `Type 1`에 해당하는 요청 구분의 경우에는 앞서 살펴봤듯이 차트 데이터 조회 함수는 근본적으로 "요청 구분"이 1(기간)인가 2(개수)인가에 따라 두 개의 함수로 나눈다고 했기 때문에 굳이 전달받지 않아도 된다. 즉, 이 함수 내부에서 `Type 1`의 값으로 2를 기본적으로 넣어놓으면 되기 때문이다. 이제 요청 구분을 2로 전달해준 만큼, 요청종료일과 요청시작일에 해당하는 `Type 2`와 `Type 3`은 반드시 인자로 전달받아야 할 것이다.

## CpSysDib.py ##
import win32com.client

class StockChart:
    def __init__(self):
        self.stockchart = win32com.client.Dispatch("CpSysDib.StockChart")  ## COM 인스턴스 생성
        
    def _day_range(self, item_code, start_date, end_date):
        pass

이외에도 `Type 5`의 경우에는 회신받고자 하는 데이터를 하나의 리스트 형태로 전달해주어야 하는데, 그 내용은 아래의 표를 따른다. 자세한 내용은 아래의 표를 참고하도록 하고,  이번 게시글에서는 날짜(0), 시가(2), 고가(3), 저가(4),  종가(5), 전일 대비(6), 거래량(8), 거래대금(9), 대비 부호(37)에 대해서만 요청하도록 하자. `Type 5` 데이터는 인자로 전달받아도 되고 전달받지 않아도 되는데, 기본적으로 특정 일자 범위를 기준으로 조회하는 것은 대체로 필요한 데이터 타입은 거의 일정하기 때문에 본인의 경우에는 인자로 전달받지 않고 함수 내부에서 데이터의 배열을 직접 전달해줄 예정이다. 

다음으로 `Type 8`과 `Type 9`는 각각 갭 보정 여부와 수정주가 여부를 의미하는데, 이는 개인별 성향에 따라 보정 및 수정을 하고 싶지 않다면 "0"을, 보정 및 수정을 하고 싶다면 "1"을 전달해주면 된다. 그리고 `Type 10`은 "1"을, `Type 11`은 "N"을 입력하여 일봉 차트 데이터를 요청하는 함수를 만들어보도록 하자.

## CpSysDib.py ##
import win32com.client

class StockChart:
    def __init__(self):
        self.stockchart = win32com.client.Dispatch("CpSysDib.StockChart")  ## COM 인스턴스 생성
    
    def _day_range(self, item_code, start_date, end_date):
        """
        Type:5 (반환 데이터의 배열)
            0: 날짜, 1: 시간(HHMM), 2: 시가, 3: 고가, 4: 저가, 5: 종가, 6: 전일 대비(37과 함께 사용)
            8: 거래량, 9: 거래대금, 10: 누적체결매도수량(분 및 틱), 11: 누적체결매수수량(분 및 틱), 12: 상장주식수
            13: 시가총액, 14: 외국인 주문 한도 수량, 15: 외국인 주문 가능 수량, 16: 외국인 현재 보유 수량, 17: 외국인 현재 보유 비율
            18: 수정주가일자(YYYYMMDD), 19: 수정주가 비율, 20: 기관 순매수, 21: 기관누적순매수, 22: 등락주선, 23: 등락비율,
            24: 예탁금, 25: 주식 회전율, 26: 거래성립률, 37: 대비 부호,
            62: 누적체결 매도수량(분 및 틱만 제공, 체결가 비교 방식의 누적체결매도수량)
            63: 누적체결 매수수량(분 및 틱만 제공, 체결가 비교 방식의 누적체결매수수량)
        """
        self.stockchart.SetInputValue(0, item_code)     ## 종목코드
        self.stockchart.SetInputValue(1, ord("1"))      ## 요청 구분
        self.stockchart.SetInputValue(2, end_date)      ## 요청 종료일
        self.stockchart.SetInputValue(3, start_date)    ## 요청 시작일
        self.stockchart.SetInputValue(5, [0, 2, 3, 4, 5, 8, 9, 6, 37])  ## 데이터 배열
        self.stockchart.SetInputValue(6, ord("D"))      ## 차트 구분('D': 일봉, 'W': 주봉, 'M': 월봉, 'm': 분봉, 'T': 틱)
        self.stockchart.SetInputValue(8, ord("0"))      ## 갭 보정 여부(0: 보정 X, 1: 보정 O)
        self.stockchart.SetInputValue(9, ord("0"))      ## 수정주가 여부(0: 수정 X, 1: 수정 O)
        self.stockchart.SetInputValue(10, ord("1"))     ## 거래량 구분
        self.stockchart.SetInputValue(11, ord("N"))     ## 조기 적용 여부
        self.stockchart.BlockRequest()                  ## 데이터 요청

 

 


반응형
728x90

 

이제 `CpSysDib`의 `StockChart` 모듈 내에서 제공되는 이벤트(`OnReceived`)를 처리하기 위한 이벤트 처리기도 함께 구현해보도록 하자. 이 모듈의 이벤트를 처리할 클래스의 이름은 `class event_handler_CpSysDib:`이다. 

## CpSysDib.py ##
class event_handler_CpSysDib:
    """차트 데이터 조회 시 이벤트 처리"""
    def set_instance(self, disp, object):
        self.disp = disp
        self.object = object
        print(f"self.object:{self.object}")

    def OnReceived(self):
        if self.object == "_day_chart":
            print("Raised OnReceived Event")

그 후에, 다시 `class StockChart:`로 돌아와서 초기화 함수에서 이벤트를 처리할 수 있도록 하고 `def _day_range` 함수 내부에서 핸들러를 추가하여 `def set_instance`의 인자 중 `object`에 대하여 "_day_chart"를 전달해주도록 하자.
※ Line: 7, 8, 31

## CpSysDib.py ##
import win32com.client

class StockChart:
    def __init__(self):
        self.stockchart = win32com.client.Dispatch("CpSysDib.StockChart")  ## COM 인스턴스 생성
        self.handlers = win32com.client.WithEvents(self.stockchart, event_handler_CpSysDib)
        
    def _day_range(self, item_code, start_date, end_date):
        """
        Type:5 (반환 데이터의 배열)
            0: 날짜, 1: 시간(HHMM), 2: 시가, 3: 고가, 4: 저가, 5: 종가, 6: 전일 대비(37과 함께 사용)
            8: 거래량, 9: 거래대금, 10: 누적체결매도수량(분 및 틱), 11: 누적체결매수수량(분 및 틱), 12: 상장주식수
            13: 시가총액, 14: 외국인 주문 한도 수량, 15: 외국인 주문 가능 수량, 16: 외국인 현재 보유 수량, 17: 외국인 현재 보유 비율
            18: 수정주가일자(YYYYMMDD), 19: 수정주가 비율, 20: 기관 순매수, 21: 기관누적순매수, 22: 등락주선, 23: 등락비율,
            24: 예탁금, 25: 주식 회전율, 26: 거래성립률, 37: 대비 부호,
            62: 누적체결 매도수량(분 및 틱만 제공, 체결가 비교 방식의 누적체결매도수량)
            63: 누적체결 매수수량(분 및 틱만 제공, 체결가 비교 방식의 누적체결매수수량)
        """
        self.stockchart.SetInputValue(0, item_code)     ## 종목코드
        self.stockchart.SetInputValue(1, ord("1"))      ## 요청 구분
        self.stockchart.SetInputValue(2, end_date)      ## 요청 종료일
        self.stockchart.SetInputValue(3, start_date)    ## 요청 시작일
        self.stockchart.SetInputValue(5, [0, 2, 3, 4, 5, 8, 9, 6, 37])  ## 데이터 배열
        self.stockchart.SetInputValue(6, ord("D"))      ## 차트 구분('D': 일봉, 'W': 주봉, 'M': 월봉, 'm': 분봉, 'T': 틱)
        self.stockchart.SetInputValue(8, ord("0"))      ## 갭 보정 여부(0: 보정 X, 1: 보정 O)
        self.stockchart.SetInputValue(9, ord("0"))      ## 수정주가 여부(0: 수정 X, 1: 수정 O)
        self.stockchart.SetInputValue(10, ord("1"))     ## 거래량 구분
        self.stockchart.SetInputValue(11, ord("N"))     ## 조기 적용 여부
        self.handlers.set_instance(self.stockchart, "_day_range")
        self.stockchart.BlockRequest()                  ## 데이터 요청

마지막으로, Boss.py 파일 내부의 `class cybos(QMainWindow, main_ui):`에 있는 초기화 함수에 아래와 같은 코드를 추가하여 로그인이 이루어진 직후에 차트 데이터를 조회하도록 구현한 후, 프로그램을 실행시켜보자.
※ Line: 28

## Boss.py ##
import win32com.client
from pywinauto import application
from COM import CpSysDib
from COM import CpUtil
from COM import CpTrade
from COM import DsCbo1
import time

## GUI ##
import sys
from PyQt5 import uic
from PyQt5.QtWidgets import *

main_ui = uic.loadUiType("main.ui")[0]
class cybos(QMainWindow, main_ui):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.cybos = CpUtil.CpCybos()
        self.stockchart = CpUtil.CpStockCode()
        self.trade = CpTrade.CpTdUtil()
        self.codemgr = CpUtil.CpCodeMgr()
        self.stockmst = DsCbo1.StockMst()
        self.stockchart = CpSysDib.StockChart()

        self._open_cybosplus()
        self.stockchart._day_range("A005930", "20230101", "20230331")
        
        self.pushButton.clicked.connect(self._GetStockListByMarket)

▶ 실행 결과 확인하기

더보기

self.object:CpCybos
[통신결과:1] 서버와의 연결에 성공했습니다.
로그인되어 있습니다.
self.object:_day_range
Raised OnReceived Event

마지막 줄에 Raised OnReceived Event가 올바르게 출력되고 있는 것을 보니 서버에 데이터를 요청한 후, 수신받아야 할 데이터가 정상적으로 수신되고 있다는 것을 확인할 수 있다. (물론 현재 주가 데이터를 확인할 수는 없지만, 이 이벤트가 발생했다는 것은 데이터가 올바르게 수신되었다는 것이다. 이벤트가 발생하는 것과 데이터를 수신받는 것은 선후 관계는 있을지언정 온전하게 별개의 작업임을 알 수 있다.) 그렇다면 수신받은 데이터는 어떻게 확인할 수 있을까 ? 

데이터를 확인할 때 사용하는 함수는 `GetHeaderValue()`와 `GetDataValue()`이다. 다만 이 두 함수는 약간의 차이점이 존재하는데, 전자의 함수는 특정값을 조회할 때 사용하고 후자의 함수는 여러 개의 데이터를 조회할 때 사용한다. 다시 말해, 서버에 데이터를 요청한 이후에 '서버에 요청한 필드 배열(`Type 5`)의 개수'는 `GetHeaderValue()`를 통해 조회하지만 '서버에서 반환된 일봉 차트 데이터'와 같은 개수가 여러 개인 데이터는 `GetDataValue()` 함수를 사용한다는 것이다. 

이제 다시 본론으로 돌아와, 차트 데이터를 요청한 후에 서버로부터 확인할 수 있는 데이터 중에서도 요청한 필드의 개수(1), 필드의 배열(2), 반환된 데이터의 개수(3)를 확인해보도록 하자. 여기서, 데이터는 이벤트가 발생한 이후에나 조회할 수 있기 때문에 `def OnReceived(self):` 함수 내부에서 `GetHeaderValue()` 함수를 통해 확인해보도록 하자.
※ Line: 11, 12, 13

class event_handler_CpSysDib:
    """차트 데이터 조회 시 이벤트 처리"""
    def set_instance(self, disp, object):
        self.disp = disp
        self.object = object
        print(f"self.object:{self.object}")

    def OnReceived(self):
        if self.object == "_day_range":
            print("Raised OnReceived Event")
            len_fild = self.disp.GetHeaderValue(1)    ## 요청한 필드 개수
            array_fild = self.disp.GetHeaderValue(2)  ## 팔드 배열
            len = self.disp.GetHeaderValue(3)         ## 데이터 개수 확인
            print(f"필드 개수:{len_fild}({array_fild}), 데이터 개수:{len}")

▶ 실행 결과 확인하기

더보기

self.object:CpCybos
[통신결과:1] 서버와의 연결에 성공했습니다.
로그인되어 있습니다.
self.object:_day_range
Raised OnReceived Event
필드 개수:9(('날짜', '시가', '고가', '저가', '종가', '전일대비', '거래량', '거래대금', '대비부호')), 데이터 개수:62

전체 차트 데이터를 조회하기 위해 `GetDataValue()` 함수를 사용하기 전에 앞서, 우리는 두 가지 사실을 확인할 수 있다.

  1. `Type 5`에 해당하는 필드 배열은 [2, 1, 0, 3, 4]로 요청해도 [0, 1, 2, 3, 4]와 같이 순서대로 통보된다.
  2. 삼성전자의 2023년 1월 1일부터 2023년 3월 31일까지의 일봉 개수는 62개이다.

다시 본론으로 돌아와, `GetDataValue()` 함수를 사용하여 차트 데이터를 조회해보자. 이 함수는 우리가 앞서 데이터를 요청할 때 사용했던 필드 배열에 해당하는 데이터를 그 순서 그대로 사용하면 된다. 즉, 요청할 때에는 [0, 2, 3, 4, 5, 6, 8, 9]와 같이 요청했지만 이 데이터를 사용할 때에는 각각 [0, 1, 2, 3, 4, 5, 6, 7]을 사용하여 데이터를 얻어오면 된다. 다만 한 가지 유의할 점이 있다면 바로 위에서 확인한 두 가지 사실 중 두 번째 사실에 있는 "62"라는 데이터를 사용해야 한다는 것이다. 왜냐하면, 서버에서는 62개의 데이터를 반환해주었기 때문에 우리는 '날짜'라는 데이터를 62개 얻어오고 싶다면 `GetDataValue()` 함수를 62번을 사용해야 한다. 아래의 코드를 확인해보도록 하자.
※ Line: 16, 17

class event_handler_CpSysDib:
    """차트 데이터 조회 시 이벤트 처리"""
    def set_instance(self, disp, object):
        self.disp = disp
        self.object = object
        print(f"self.object:{self.object}")

    def OnReceived(self):
        if self.object == "_day_range":
            print("Raised OnReceived Event")
            len_fild = self.disp.GetHeaderValue(1)    ## 요청한 필드 개수
            array_fild = self.disp.GetHeaderValue(2)  ## 팔드 배열
            len = self.disp.GetHeaderValue(3)         ## 데이터 개수 확인
            print(f"필드 개수:{len_fild}({array_fild}), 데이터 개수:{len}")

            print(f"{self.disp.GetDataValue(0, 0)}")    ## 0: 날짜, 0: 인덱스 번호
            print(f"{self.disp.GetDataValue(0, 1)}")    ## 0: 날짜, 1: 인덱스 번호

▶ 실행 결과 확인하기

더보기

self.object:CpCybos
[통신결과:1] 서버와의 연결에 성공했습니다.
로그인되어 있습니다.
self.object:_day_range
Raised OnReceived Event
필드 개수:9(('날짜', '시가', '고가', '저가', '종가', '전일대비', '거래량', '거래대금', '대비부호')), 데이터 개수:62
20230331
20230330

그렇다면 여기서 62개의 데이터를 얻어오기 위해 사용해야 할 파이썬 함수는 바로 `for`다. 이는 `for A in B:`와 같은 방식으로 사용되는데, 만약 B라는 데이터에 0에서 9까지의 숫자가 포함되어 있다면 0부터 시작해서 그 데이터를 A라는 변수에 입력한 후 `for`문 하단의 작업을 수행한다. 만약 `for`문 하단에는 단순히 `print(A)`만 기재되어 있다면 이 함수는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9를 순서대로 출력한다. 이 점을 이용하여 `GetDataValue(fild, index)` 함수의 `index` 자리에 들어갈 데이터를 `for`문을 통해 입력해주는 것이다.
※ Line: 16, 17

class event_handler_CpSysDib:
    """차트 데이터 조회 시 이벤트 처리"""
    def set_instance(self, disp, object):
        self.disp = disp
        self.object = object
        print(f"self.object:{self.object}")

    def OnReceived(self):
        if self.object == "_day_range":
            print("Raised OnReceived Event")
            len_fild = self.disp.GetHeaderValue(1)    ## 요청한 필드 개수
            array_fild = self.disp.GetHeaderValue(2)  ## 팔드 배열
            len = self.disp.GetHeaderValue(3)         ## 데이터 개수 확인
            print(f"필드 개수:{len_fild}({array_fild}), 데이터 개수:{len}")

            for index in range(len):
                print(f"{self.disp.GetDataValue(0, index)}")    ## 0: 날짜, index: 인덱스 번호

▶ 실행 결과 확인하기

더보기

self.object:CpCybos
[통신결과:1] 서버와의 연결에 성공했습니다.
로그인되어 있습니다.
self.object:_day_range
Raised OnReceived Event
필드 개수:9(('날짜', '시가', '고가', '저가', '종가', '전일대비', '거래량', '거래대금', '대비부호')), 데이터 개수:62
20230331
20230330
20230329

   (중략)   
20230104
20230103
20230102

여기까지 `GetDataValue()` 함수가 어떠한 방식으로 동작하는지 확인했다면, 요청한 필드 배열에 해당하는 모든 필드 데이터를 각각의 변수에 입력한 후 결과값을 한 줄로 출력해보도록 하자.
※ Line: 16~26

class event_handler_CpSysDib:
    """차트 데이터 조회 시 이벤트 처리"""
    def set_instance(self, disp, object):
        self.disp = disp
        self.object = object
        print(f"self.object:{self.object}")

    def OnReceived(self):
        if self.object == "_day_range":
            print("Raised OnReceived Event")
            len_fild = self.disp.GetHeaderValue(1)    ## 요청한 필드 개수
            array_fild = self.disp.GetHeaderValue(2)  ## 팔드 배열
            len = self.disp.GetHeaderValue(3)         ## 데이터 개수 확인
            print(f"필드 개수:{len_fild}({array_fild}), 데이터 개수:{len}")

            for index in range(len):
                date = self.disp.GetDataValue(0, index)     ## 0: 날짜,    index: 인덱스 번호
                open = self.disp.GetDataValue(1, index)     ## 2: 시가,    index: 인덱스 번호
                high = self.disp.GetDataValue(2, index)     ## 3: 고가,    index: 인덱스 번호
                low = self.disp.GetDataValue(3, index)      ## 4: 저가,    index: 인덱스 번호
                close = self.disp.GetDataValue(4, index)    ## 5: 종가,    index: 인덱스 번호
                dif = self.disp.GetDataValue(5, index)      ## 6: 전일대비, index: 인덱스 번호
                vol = self.disp.GetDataValue(6, index)      ## 8: 거래량,   index: 인덱스 번호
                tvol = self.disp.GetDataValue(7, index)     ## 9: 거래대금, index: 인덱스 번호
                pm = self.disp.GetDataValue(8, index)       ## 37: 대비부호,index: 인덱스 번호
                print(f"[{date}] 시:{open}, 고:{high}, 저:{low}, 종:{close}, 전일대비:{pm}{dif}, 거래량:{vol}, 거래대금:{tvol}")

▶ 실행 결과 확인하기

더보기

self.object:CpCybos
[통신결과:1] 서버와의 연결에 성공했습니다.
로그인되어 있습니다.
self.object:_day_range
Raised OnReceived Event
필드 개수:9(('날짜', '시가', '고가', '저가', '종가', '전일대비', '거래량', '거래대금', '대비부호')), 데이터 개수:62
[20230331] 시:64000, 고:64000, 저:63700, 종:64000, 전일대비:50800, 거래량:14094479, 거래대금:900711000000
[20230330] 시:63700, 고:63700, 저:63100, 종:63200, 전일대비:50500, 거래량:15684377, 거래대금:993903000000
           (중략)
[20230103] 시:55400, 고:56000, 저:54500, 종:55400, 전일대비:53-100, 거래량:13547030, 거래대금:747898000000
[20230102] 시:55500, 고:56100, 저:55200, 종:55500, 전일대비:50200, 거래량:10031448, 거래대금:558433000000

 

 


728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.