* 대신 CYBOS Touch만의 특징
모바일의 특성을 고려하여 언제 어디서나 빠르게 접속하고, 최소 동작을 통해 누구나 손쉽게 서비스를 이용할 수 있도록 구현 되었습니다.
- 한번만 계좌 로그인을 하시면, 추가 로그인 없이 빠른 시세 조회가 가능합니다.
- 인터넷뱅킹 고객님은 공인인증서만 입력하시면 빠르게 뱅킹 서비스 이용이 가능합니다.
- 대신증권 계좌가 없어도 “체험하기” 기능을 통해 시세조회 및 주문 등 모든 기능을 체험해 볼 수 있습니다.
- 대신증권 내부의 다양한 검증을 통해 종목발굴을 해 주는 “오아시스” 서비스를 제공합니다.
- 보유잔고의 리스크 관리를 위해 “자동매도주문” 서비스를 제공합니다.
- HTS와 모바일간 관심종목그룹과 메모가 공유됩니다.
* 주요제공서비스
1. 주식
- 현재가
- 관심종목
- 주식차트
-
현금/신용주문
- 자동주문
- 번개주문(원터치 주문)
- 예약주문
- 주식체결 및 계좌잔고
- 기타상장증권 현재가, 주문, 체결/잔고
2. 투자정보
- 기업정보
- 테마입체분석
- 투자자별 매매종합
- 뉴스/공시
- 지수/환율
- 세계증시
3.투자포커스
- 전문가 관심
- 종목발굴
- 목표가설정
- 시장분석
4. 선물옵션
- 선물옵션, CME, EUREX, 주식선물 현재가
- 선물옵션, CME, EUREX, 주식선물 주문
- 선물옵션, CME, EUREX, 주식선물 체결 및 계좌잔고
- 선물옵션 당일손익
5. 해외주식
- 미국, 중국, 일본, 홍콩 주식 실시간 시세 조회
- 주문, 체결/잔고
- 미국 예약주문
- 해외선물 현재가, 주문, 체결/잔고
- 해외 투자 정보, 뉴스, 경제지표
- 외환 환전
6. 금융상품
- 펀드찾기, 펀드 주문, 펀드체결잔고
- ELS청약상품, ELS청약/취소, ELS공지, ELS잔고
- 장내/장외채권, 주문, 체결/잔고
- 전자단기사채
- 연금 이전 및 배분 신청
7. 뱅킹
- 뱅킹홈
- 이체, 이체결과조회
- 종합잔고
- 스피드론
- 통합계좌개설
8. 환경설정
- 초기화면 설정
- 사용자 맞춤 메뉴 설정
- 화면 확대/축소 보기 설정
- 공인인증센터
- 통합보안센터
대신증권 CYBOS Touch 이용시 문의사항 및 건의사항은 대신증권홈페이지(//www.daishin.com)의 고객센터 > 고객문의를 이용하시거나, 고객감동센터 1588-4488로 문의해 주시기 바랍니다.
항상 대신증권을 이용해주시는 고객님께 감사드리며, 앞으로도 지속적인 업그레이드로 보다 나은 서비스를 제공해 드릴 수 있도록 노력하겠습니다.
[앱 접근권한에 대한 고지]
※ [정보통신망 이용촉진 및 정보보호 등에 관한 법률] 제22조의 2 신설 및 시행령 개정에 따라 대신증권 모바일 서비스 제공을 위하여 필요한 접근권한을 아래와 같이 안내해드립니다.
[필수적 접근권한]
- 저장공간 : 앱 사용을 위한 파일 저장/읽기 권한 (기기의 사진, 미디어파일)
- 전화 : 기기정보 및 상태 확인, 고객센터 연결을 위한 권한
- 설치된 앱 : 전자금융거래 사고 방지를 위해 단말에 설치된 앱 중 위협이 될 수 있는 항목에 한해 수집
[선택적 접근권한]
- 카메라 : 사진 찍기 기능에 대한 접근권한(비대면실명인증방식인 신분증 촬영 시에 사용)
- 위치정보 : 지점안내를 위한 내 위치 검색 권한
- 주소록 : 앱 소개 메시지 / 주식 현재가 / 이벤트 등 공유 시 주소록의 친구목록 접근 권한
- 마이크 : 챗봇 상담시 음성입력 또는 음성인식으로 종목선택을 위한 접근
권한
※ 선택적 접근권한의 허용에 동의하지 않아도 필수 서비스 이용이 가능하나, 필요한 일부 기능 사용에 제한이 있을 수 있습니다.
HTS #8092 특징주 포착(뉴스/차트 신호) 화면 예제 입니다 .
엑셀 내보내기를 제공하고 있어 수신 받은 내용을 #8092 와 비교 할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 | import sys from PyQt5.QtWidgets import * import win32com.client import ctypes import pandas as pd import os g_objCodeMgr = win32com.client.Dispatch('CpUtil.CpCodeMgr') g_objCpStatus = win32com.client.Dispatch('CpUtil.CpCybos') g_objCpTrade = win32com.client.Dispatch('CpTrade.CpTdUtil') gExcelFile = '8092.xlsx' def InitPlusCheck(): # 프로세스가 관리자 권한으로 실행 여부 if ctypes.windll.shell32.IsUserAnAdmin(): print('정상: 관리자권한으로 실행된 프로세스입니다.') else: print('오류: 일반권한으로 실행됨. 관리자 권한으로 실행해 주세요') return False # 연결 여부 체크 if (g_objCpStatus.IsConnect == 0): print("PLUS가 정상적으로 연결되지 않음. ") return False ''' # 주문 관련 초기화 if (g_objCpTrade.TradeInit(0) != 0): print("주문 초기화 실패") return False ''' return True # CpEvent: 실시간 이벤트 수신 클래스 class CpEvent: def set_params(self, client, name, caller): self.client = client # CP 실시간 통신 object self.name = name # 서비스가 다른 이벤트를 구분하기 위한 이름 self.caller = caller # callback 을 위해 보관 self.diccode = { 10: '외국계증권사창구첫매수', 11: '외국계증권사창구첫매도', 12: '외국인순매수', 13: '외국인순매도', 21: '전일거래량갱신', 22: '최근5일거래량최고갱신', 23: '최근5일매물대돌파', 24: '최근60일매물대돌파', 28: '최근5일첫상한가', 29: '최근5일신고가갱신', 30: '최근5일신저가갱신', 31: '상한가직전', 32: '하한가직전', 41: '주가 5MA 상향돌파', 42: '주가 5MA 하향돌파', 43: '거래량 5MA 상향돌파', 44: '주가데드크로스(5MA < 20MA)', 45: '주가골든크로스(5MA > 20MA)', 46: 'MACD 매수-Signal(9) 상향돌파', 47: 'MACD 매도-Signal(9) 하향돌파', 48: 'CCI 매수-기준선(-100) 상향돌파', 49: 'CCI 매도-기준선(100) 하향돌파', 50: 'Stochastic(10,5,5)매수- 기준선상향돌파', 51: 'Stochastic(10,5,5)매도- 기준선하향돌파', 52: 'Stochastic(10,5,5)매수- %K%D 교차', 53: 'Stochastic(10,5,5)매도- %K%D 교차', 54: 'Sonar 매수-Signal(9) 상향돌파', 55: 'Sonar 매도-Signal(9) 하향돌파', 56: 'Momentum 매수-기준선(100) 상향돌파', 57: 'Momentum 매도-기준선(100) 하향돌파', 58: 'RSI(14) 매수-Signal(9) 상향돌파', 59: 'RSI(14) 매도-Signal(9) 하향돌파', 60: 'Volume Oscillator 매수-Signal(9) 상향돌파', 61: 'Volume Oscillator 매도-Signal(9) 하향돌파', 62: 'Price roc 매수-Signal(9) 상향돌파', 63: 'Price roc 매도-Signal(9) 하향돌파', 64: '일목균형표매수-전환선 > 기준선상향교차', 65: '일목균형표매도-전환선 < 기준선하향교차', 66: '일목균형표매수-주가가선행스팬상향돌파', 67: '일목균형표매도-주가가선행스팬하향돌파', 68: '삼선전환도-양전환', 69: '삼선전환도-음전환', 70: '캔들패턴-상승반전형', 71: '캔들패턴-하락반전형', 81: '단기급락후 5MA 상향돌파', 82: '주가이동평균밀집-5%이내', 83: '눌림목재상승-20MA 지지' } def OnReceived(self): print(self.name) # 실시간 처리 - marketwatch : 특이 신호(차트, 외국인 순매수 등) if self.name == 'marketwatch': code = self.client.GetHeaderValue(0) name = g_objCodeMgr.CodeToName(code) cnt = self.client.GetHeaderValue(2) for i in range(cnt): item = {} newcancel = '' time = self.client.GetDataValue(0, i) h,m = divmod(time, 100) item['시간'] = '%02d:%02d' % (h,m) $업데이트$ = self.client.GetDataValue(1, i) item['코드'] = code item['종목명'] = name cate = self.client.GetDataValue(2, i) if ($업데이트$ == ord('c')): newcancel = '[취소]' if cate in self.diccode: item['특이사항'] = newcancel + self.diccode[cate] else: item['특이사항'] = newcancel + '' self.caller.listWatchData.$인서트$(0,item) print(item) # 실시간 처리 - marketnews : 뉴스 및 공시 정보 elif self.name == 'marketnews': item = {} $업데이트$ = self.client.GetHeaderValue(0) cont = '' if $업데이트$ == ord('D') : cont = '[삭제]' code = item['코드'] = self.client.GetHeaderValue(1) time = self.client.GetHeaderValue(2) h, m = divmod(time, 100) item['시간'] = '%02d:%02d' % (h, m) item['종목명'] = name = g_objCodeMgr.CodeToName(code) cate = self.client.GetHeaderValue(4) item['특이사항'] = cont + self.client.GetHeaderValue(5) print(item) self.caller.listWatchData.$인서트$(0, item) class CpPublish: def __init__(self, name, serviceID): self.name = name self.obj = win32com.client.Dispatch(serviceID) self.bIsSB = False def Subscribe(self, var, caller): if self.bIsSB: self.Unsubscribe() if (len(var) > 0): self.obj.SetInputValue(0, var) handler = win32com.client.WithEvents(self.obj, CpEvent) handler.set_params(self.obj, self.name, caller) self.obj.Subscribe() self.bIsSB = True def Unsubscribe(self): if self.bIsSB: self.obj.Unsubscribe() self.bIsSB = False # CpPBMarkeWatch: class CpPBMarkeWatch(CpPublish): def __init__(self): super().__init__('marketwatch', 'CpSysDib.CpMarketWatchS') # CpPBMarkeWatch: class CpPB8092news(CpPublish): def __init__(self): super().__init__('marketnews', 'Dscbo1.CpSvr8092S') # CpRpMarketWatch : 특징주 포착 통신 class CpRpMarketWatch: def __init__(self): self.objStockMst = win32com.client.Dispatch('CpSysDib.CpMarketWatch') self.objpbMarket = CpPBMarkeWatch() self.objpbNews = CpPB8092news() return def Request(self, code, caller): self.objpbMarket.Unsubscribe() self.objpbNews.Unsubscribe() self.objStockMst.SetInputValue(0, code) # 1: 종목 뉴스 2: 공시정보 10: 외국계 창구첫매수, 11:첫매도 12 외국인 순매수 13 순매도 rqField = '1,2,10,11,12,13' self.objStockMst.SetInputValue(1, rqField) self.objStockMst.SetInputValue(2, 0) # 시작 시간: 0 처음부터 ret = self.objStockMst.BlockRequest() if self.objStockMst.GetDibStatus() != 0: print('통신상태', self.objStockMst.GetDibStatus(), self.objStockMst.GetDibMsg1()) return False cnt = self.objStockMst.GetHeaderValue(2) # 수신 개수 for i in range(cnt): item = {} time = self.objStockMst.GetDataValue(0, i) h, m = divmod(time, 100) item['시간'] = '%02d:%02d' % (h, m) item['코드'] = self.objStockMst.GetDataValue(1, i) item['종목명'] = g_objCodeMgr.CodeToName(item['코드']) cate = self.objStockMst.GetDataValue(3, i) item['특이사항'] = self.objStockMst.GetDataValue(4, i) print(item) caller.listWatchData.append(item) self.objpbMarket.Subscribe(code, caller) self.objpbNews.Subscribe(code, caller) return True class MyWindow(QMainWindow): def __init__(self): super().__init__() # plus 상태 체크 if InitPlusCheck() == False: exit() self.listWatchData = [] self.objMarketWatch = CpRpMarketWatch() self.setWindowTitle("특징주 포착(#8092 Market-Watch") self.setGeometry(300, 300, 300, 180) nH = 20 btnPrint = QPushButton('Print', self) btnPrint.move(20, nH) btnPrint.clicked.connect(self.btnPrint_clicked) nH += 50 btnExcel = QPushButton('Excel 내보내기', self) btnExcel.move(20, nH) btnExcel.clicked.connect(self.btnExcel_clicked) nH += 50 btnExit = QPushButton('종료', self) btnExit.move(20, nH) btnExit.clicked.connect(self.btnExit_clicked) nH += 50 self.objMarketWatch.Request('*', self) def btnPrint_clicked(self): for item in self.listWatchData: print(item) return def btnExcel_clicked(self): if (len(self.listWatchData) == 0): print('데이터 없음') return df = pd.DataFrame(columns=['시간', '코드', '종목명', '특이사항']) for item in self.listWatchData: df.loc[len(df)] = item writer = pd.ExcelWriter(gExcelFile, engine='xlsxwriter') # Convert the dataframe to an XlsxWriter Excel object. df.to_excel(writer, sheet_name='Sheet1') # Close the Pandas Excel writer and output the Excel file. writer.save() os.startfile(gExcelFile) return def btnExit_clicked(self): exit() return if __name__ == "__main__": app = QApplication($시스.$argv) myWindow = MyWindow() myWindow.show() app.$이엑스이씨$_() | cs |