Cybos#3株式情報のインポート(Request)


*このシリーズのテーマは、証券cybos apiを利用して株式計画を作成することです.

Request


Cybosから株式情報を取得する第2の方法は、Request()によって値をロードすることです.順番は以下の通りです.
  • 派遣によりオブジェクトを作成します.
    objStockMst = win32com.client.Dispatch("DsCbo1.StockMst")
  • オブジェクトにインポートしたい情報を入力します.
    objStockMst.SetInputValue(0, code)
    (codeはプロジェクトコードを含む変数です.)
  • 入力が完了したオブジェクトを要求する(またはブロック要求).
    objStockMst.BlockRequest()
    (これは実際のデータを要求するプロセスです)
  • オブジェクトから所望の情報が出力される.
    item[「現在」]=objStockMst.GetHeaderValue(11)
    (「GetHeaderValue(11)」は「従価」を表す.)
  • オブジェクトの入力、リクエスト、再取得の理由が混同される場合があります.ここでinputは私が探しているプロジェクトコードをオブジェクトに入力し、要求は入力したオブジェクトを実際のCybos apiに送信します.そして、最後にリクエストしたオブジェクトから私たちが望む情報(入力として入力した項目)を取得するのがgetです.
    要約すると、instance->input->request->get順です.
    動作原理によってはRequest()で値を取得できない例もあります.ヘルプの詳細を表示して使用してください.一般的に下端に利用可能かどうか記載されています.

    BlockRequest()とRequest()の違いは?


    BlockRequest()を使用しています.ではBlockRequest()とRequest()の違いは何でしょうか.
    この部分については、証券資料室に例があります.確認しようまず、サンプルコードの下部を見てみましょう.

    サンプルコード

    import pythoncom
    from PyQt5.QtWidgets import *
    import win32com.client
     
    import win32event
     
    g_objCodeMgr = win32com.client.Dispatch('CpUtil.CpCodeMgr')
     
    StopEvent = win32event.createEvent(None, 0, 0, None)
     
    class CpEvent:
        def set_params(self, client, name, caller):
            self.client = client  # CP 실시간 통신 object
            self.name = name  # 서비스가 다른 이벤트를 구분하기 위한 이름
            self.caller = caller  # callback 을 위해 보관
     
        def OnReceived(self):
            # 실시간 처리 - 현재가 주문 체결
            if self.name == 'stockmst':
                print('recieved')
                win32event.SetEvent(StopEvent)
                return
     
     
    class CpCurReply:
        def __init__(self, objEvent):
            self.name = "stockmst"
            self.obj = objEvent
     
        def Subscribe(self):
            handler = win32com.client.WithEvents(self.obj, CpEvent)
            handler.set_params(self.obj, self.name, None)
     
     
    def MessagePump(timeout):
        waitables = [StopEvent]
        while 1:
            rc = win32event.MsgWaitForMultipleObjects(
                waitables,
                0,  # Wait for all = false, so it waits for anyone
                timeout, #(or win32event.INFINITE)
                win32event.QS_ALLEVENTS)  # Accepts all input
     
            if rc == win32event.WAIT_OBJECT_0:
                # Our first event listed, the StopEvent, was triggered, so we must exit
                print('stop event')
                break
     
            elif rc == win32event.WAIT_OBJECT_0 + len(waitables):
                # A windows message is waiting - take care of it. (Don't ask me
                # why a WAIT_OBJECT_MSG isn't defined < WAIT_OBJECT_0...!).
                # This message-serving MUST be done for COM, DDE, and other
                # Windowsy things to work properly!
                print('pump')
                if pythoncom.PumpWaitingMessages():
                    break  # we received a wm_quit message
            elif rc == win32event.WAIT_TIMEOUT:
                print('timeout')
                return
                pass
            else:
                print('exception')
                raise RuntimeError("unexpected win32wait return value")
     
     
    code = 'A005930'
     
    ##############################################################
    #1. BlockRequest
    print('#####################################')
    objStockMst = win32com.client.Dispatch("DsCbo1.StockMst")
    objStockMst.SetInputValue(0, code)
    objStockMst.BlockRequest()
    print('BlockRequest 로 수신 받은 데이터')
    item = {}
    item['종목명']= g_objCodeMgr.CodeToName(code)
    item['현재가'] = objStockMst.GetHeaderValue(11)  # 종가
    item['대비'] =  objStockMst.GetHeaderValue(12)  # 전일대비
    print(item)
     
    print('')
    ##############################################################
    # 2. Request ==> 메시지 펌프 ==>  OnReceived 이벤트 수신
    print('#####################################')
    objReply = CpCurReply(objStockMst)
    objReply.Subscribe()
     
    code = 'A005930'
    objStockMst.SetInputValue(0, code)
    objStockMst.Request()
    MessagePump(10000)
    item = {}
    item['종목명']= g_objCodeMgr.CodeToName(code)
    item['현재가'] = objStockMst.GetHeaderValue(11)  # 종가
    item['대비'] =  objStockMst.GetHeaderValue(12)  # 전일대비
    print(item)
    これは混乱するので、ブロックを切ってお願いする場合だけ見てみましょう.注釈で説明します.
    #1. BlockRequest
    objStockMst = win32com.client.Dispatch("DsCbo1.StockMst")
    # objStockMst 라는 인스턴스를 만들었다.
    objStockMst.SetInputValue(0, code)
    # 인스턴스에 SetInputValue을 통하여 code(종목코드를 넣은 변수)를 입력한다. 
    objStockMst.BlockRequest()
    # BlockRequest를 통해 api로 요청을 보낸다.
    item = {}
    # get한 데이터를 딕셔너리로 넣기 위해 빈 딕셔너리를 생성한다.
    item['종목명']= g_objCodeMgr.CodeToName(code)
    # CodeToName으로 종목명을 가져와 딕셔너리에 넣는다.
    item['현재가'] = objStockMst.GetHeaderValue(11)  # 종가
    # GetHeaderValue(11)로 종가를 가져와 딕셔너리에 넣는다.
    item['대비'] =  objStockMst.GetHeaderValue(12)  # 전일대비
    # GetHeaderValue(12)로 전일대비를 가져와 딕셔너리에 넣는다.
    このようにBlockRequest()は一般データを要求する最も簡単な方法である.ではRequest()はいつ使いますか?上記のサンプルコードから、リアルタイムデータ(Subscribe)が受信され、イベントが発生したときにデータが返されると推測される.すなわち、要求呼び出し後、受信したイベントを介して受信したデータが返される.Request()コードを見てみましょう.
    # 2. Request ==> 메시지 펌프 ==>  OnReceived 이벤트 수신
    objReply = CpCurReply(objStockMst)
    # 위에서 생성한 objStockMst 인스턴스를 CpCurReply 클래스에 인수로 넣는다. 
    # CpCurReply클래스는 WithEvents매서드를 통해 CpEvent클래스와 
    # objStockMst인스턴스를 묶어주어 이벤트가 발생하면 핸들링을 해준다.
    code = 'A005930'
    # 종목코드를 code 변수에 할당한다.
    objStockMst.SetInputValue(0, code)
    # 인스턴스에 SetInputValue을 통하여 code(종목코드를 넣은 변수)를 입력한다. 
    objStockMst.Request()
    # Request를 통해 api로 요청을 보낸다.
    MessagePump(10000)
    # MessagePump함수로 이벤트를 발생시킨다.
    item = {}
    # get한 데이터를 딕셔너리로 넣기 위해 빈 딕셔너리를 생성한다.
    item['종목명']= g_objCodeMgr.CodeToName(code)
    # CodeToName으로 종목명을 가져와 딕셔너리에 넣는다.
    item['현재가'] = objStockMst.GetHeaderValue(11)  # 종가
    # GetHeaderValue(11)로 종가를 가져와 딕셔너리에 넣는다.
    item['대비'] =  objStockMst.GetHeaderValue(12)  # 전일대비
    # GetHeaderValue(12)로 전일대비를 가져와 딕셔너리에 넣는다.
    整理すると、両者の違いは以下の通りです.
    BlockRequest()
  • 関数は、要求されたデータを返しながら受信する.すなわち、同期通信.
  • イベントに関係なく、受信可能であり、最も簡単な受信通信である.
  • Request()
  • 関数は、最初に戻り、その後、後続のイベントが発生したときにデータを受信する.すなわち,非同期通信である.
  • 受信には
  • アクティビティが必要なので、アクティビティとバンドルする必要があります.
  • リファレンス


    cybosヘルプガイドhttp://cybosplus.github.io//
    Python学習アルゴリズムトレーニングhttps://wikidocs.net/book/110
    証券APIを使用するトレイシステムhttps://minsuksung-ai.tistory.com/26