Cybos#3株式情報のインポート(Request)
*このシリーズのテーマは、証券cybos apiを利用して株式計画を作成することです.
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()の違いは?
関数は、要求されたデータを返しながら受信する.すなわち、同期通信. イベントに関係なく、受信可能であり、最も簡単な受信通信である. Request()関数は、最初に戻り、その後、後続のイベントが発生したときにデータを受信する.すなわち,非同期通信である. 受信にはアクティビティが必要なので、アクティビティとバンドルする必要があります.
cybosヘルプガイドhttp://cybosplus.github.io//
Python学習アルゴリズムトレーニングhttps://wikidocs.net/book/110
証券APIを使用するトレイシステムhttps://minsuksung-ai.tistory.com/26
Request
Cybosから株式情報を取得する第2の方法は、Request()によって値をロードすることです.順番は以下の通りです.
objStockMst = win32com.client.Dispatch("DsCbo1.StockMst")
objStockMst.SetInputValue(0, code)
(codeはプロジェクトコードを含む変数です.)
objStockMst.BlockRequest()
(これは実際のデータを要求するプロセスです)
item[「現在」]=objStockMst.GetHeaderValue(11)
(「GetHeaderValue(11)」は「従価」を表す.)
要約すると、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()
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)로 전일대비를 가져와 딕셔너리에 넣는다.
# 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)로 전일대비를 가져와 딕셔너리에 넣는다.
リファレンス
cybosヘルプガイドhttp://cybosplus.github.io//
Python学習アルゴリズムトレーニングhttps://wikidocs.net/book/110
証券APIを使用するトレイシステムhttps://minsuksung-ai.tistory.com/26
Reference
この問題について(Cybos#3株式情報のインポート(Request)), 我々は、より多くの情報をここで見つけました https://velog.io/@dacokim32/Cybos-3주식정보가져오기requestテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol