def push(self, subject_code, chart_type, time_unit, candle): try: s_time = time.time() self.data[subject_code][chart_type][time_unit][const.현재가].append( candle[const.현재가]) self.data[subject_code][chart_type][time_unit][const.시가].append( candle[const.시가]) self.data[subject_code][chart_type][time_unit][const.고가].append( candle[const.고가]) self.data[subject_code][chart_type][time_unit][const.저가].append( candle[const.저가]) self.data[subject_code][chart_type][time_unit][const.체결시간].append( candle[const.체결시간]) if const.영업일자 in candle: self.data[subject_code][chart_type][time_unit][ const.영업일자].append(candle[const.영업일자]) if const.거래량 in candle: self.data[subject_code][chart_type][time_unit][ const.거래량].append(candle[const.거래량]) self.data[subject_code][chart_type][time_unit][const.인덱스] += 1 self.calc(subject_code, chart_type, time_unit) self.running_time = self.running_time + (time.time() - s_time) except Exception as err: self.log.error(util.get_error_msg(err))
def get_strategy_var_from_config(self): stv = self.stv MODULE_PATH = os.path.dirname( os.path.abspath(__file__).replace('\\', '/')) try: # 전략 변수 Config 불러오기 config = configparser.RawConfigParser() config.read(MODULE_PATH + '/strategy_var.cfg') for subject_code in self.sbv.info.keys(): subject_symbol = subject_code[:2] if subject_symbol not in stv.info: stv.info[subject_symbol] = {} strategy = config.get(const.ST_CONFIG, subject_symbol) stv.info[subject_symbol][strategy] = {} stv.info[subject_symbol][strategy][const.차트] = [] stv.info[subject_symbol][strategy][const.차트변수] = {} stv.info[subject_symbol][strategy][const.차트변수][const.틱차트] = {} stv.info[subject_symbol][strategy][const.차트변수][const.분차트] = {} if strategy == const.파라: stv.info[subject_symbol][strategy][const.차트변수][ const.매매불가수익량] = config.get(subject_symbol, const.매매불가수익량) stv.info[subject_symbol][strategy][const.차트변수][const.청산단계별드리블틱] \ = json.loads(config.get(subject_symbol, const.청산단계별드리블틱)) # subject_symbol의 config 불러옴 chart_types = json.loads( config.get(subject_symbol, const.CHART_TYPE)) for chart_type in chart_types: type_ = chart_type.split('_')[0] time_unit = chart_type.split('_')[1] section_str = subject_symbol + '_' + chart_type stv.info[subject_symbol][strategy][ const.차트변수][type_][time_unit] = {} stv.info[subject_symbol][strategy][const.차트].append( [str(type_), str(time_unit)]) if strategy == const.파라: stv.info[subject_symbol][strategy][const.차트변수][type_][time_unit][const.이동평균선]\ = json.loads(config.get(section_str, const.이동평균선)) stv.info[subject_symbol][strategy][const.차트변수][type_][time_unit][const.INIT_AF]\ = config.getfloat(section_str, const.INIT_AF) stv.info[subject_symbol][strategy][const.차트변수][type_][time_unit][const.MAX_AF]\ = config.getfloat(section_str, const.MAX_AF) stv.info[subject_symbol][strategy][const.차트변수][type_][time_unit][const.초기캔들수]\ = config.getint(section_str, const.초기캔들수) except Exception as err: self.err_log.error(util.get_error_msg(err)) return stv
def get_contract_count(self, subject_code): try: if subject_code not in self.contract_list: return 0 return self.contract_list[subject_code]['보유수량'] except Exception as err: self.err_log.error(util.get_error_msg(err)) return 0
def set_input_value(self, sID, sValue): """ Tran 입력 값을 서버통신 전에 입력한다. :param sID: 아이템명 :param sValue: 입력 값 Ex) openApi.SetInputValue(“종목코드”, “000660”); openApi.SetInputValue(“계좌번호”, “5015123401”); """ try: self.log.debug("set_input_value(), sID: %s, sValue: %s" % (sID, sValue)) # rq_thread.set_input_value(sID, sValue) self.input_value.append([sID, sValue]) except Exception as err: self.log.error(util.get_error_msg(err))
def is_it_ok(self, chart, subject_code, current_price): global running_time s_time = time.time() try: 차트 = self.get_chart(subject_code) # 이거 왜 쓴거임? ''' 차트 미생성 ''' for chart_config in self.stv.info[subject_code][const.파라][차트]: chart_type = chart_config[0] time_unit = chart_config[1] if chart().data[subject_code][chart_type][time_unit][ '인덱스'] < self.stv.info[subject_code][const.파라][ const.차트변수][chart_type][time_unit][const.초기캔들수]: running_time = running_time + (time.time() - s_time) return const.false ''' 매매 불가 상태''' if chart.data[subject_code]['상태'] == '매수중' or chart.data[subject_code]['상태'] == '매도중' \ or chart.data[subject_code]['상태'] == '매매시도중' or chart.data[subject_code]['상태'] == '청산시도중': running_time = running_time + (time.time() - s_time) return const.false 매도수구분 = self.get_mesu_medo_type(subject_code, current_price, 차트[0]) if not (매도수구분 == const.매수 or 매도수구분 == const.매도): running_time = running_time + (time.time() - s_time) return const.false ''' 매매 가능으로 변경 ''' #if chart.data[subject_code]['상태'] == '대기': chart.data[subject_code]['상태'] = '매매가능' ''' 매매 불가 시간 ''' if 2100 < util.get_time(0, subject_code) < 2230: running_time = running_time + (time.time() - s_time) return const.false 수량 = self.get_buy_count(subject_code, current_price) order_contents = {'신규주문': True, '매도수구분': 매도수구분, '수량': 수량} running_time = running_time + (time.time() - s_time) return order_contents except Exception as err: self.err_log.error(util.get_error_msg(err)) running_time = running_time + (time.time() - s_time) return const.false
def calc(self, subject_code, chart_type, time_unit): try: if self.sbv.info[subject_code]['전략'] == const.파라: self.calc_ma_line(subject_code, chart_type, time_unit) #calc_ema_line(subject_code, chart_type, time_unit) #calc_ilmok_chart(subject_code, chart_type, time_unit) if self.data[subject_code][chart_type][time_unit]['인덱스'] < 5: self.data[subject_code][chart_type][time_unit][ '플로우'].append('모름') self.data[subject_code][chart_type][time_unit][ 'SAR'].append(0) elif self.data[subject_code][chart_type][time_unit][ '인덱스'] == 5: self.init_sar(subject_code, chart_type, time_unit) else: self.calc_sar(subject_code, chart_type, time_unit) except Exception as err: self.log.error(util.get_error_msg(err))
def remove_contract(self, order_info): try: profit = 0 remove_cnt = order_info['청산수량'] subject_code = order_info['종목코드'] c = self.contract_list[subject_code] if c['보유수량'] >= remove_cnt: c['보유수량'] -= remove_cnt if c['계약타입'][SAFE] > 0: # c['계약타입'][SAFE] - remove_cnt remove_cnt -= c['계약타입'][SAFE] if remove_cnt > 0: c['계약타입'][DRIBBLE] -= remove_cnt if c['보유수량'] <= 0: c['보유수량'] = 0 c['계약타입'][SAFE] = 0 c['계약타입'][DRIBBLE] = 0 else: self.err_log.info("보유 수량보다 많은 수의 계약을 삭제할수 없습니다.") remove_cnt -= c['보유수량'] c['보유수량'] = 0 c['계약타입'][SAFE] = 0 c['계약타입'][DRIBBLE] = 0 c['체결가'] = round(float(order_info['체결표시가격']), self.sbv.info[order_info['종목코드']]['자릿수']) if order_info['매도수구분'] == const.매수: profit = (remove_cnt * (c['체결가'] - order_info['체결표시가격']) ) * self.sbv.info[subject_code]['틱가치'] elif order_info['매도수구분'] == const.매도: profit = (remove_cnt * (order_info['체결표시가격'] - c.체결표시가격) ) * self.sbv.info[subject_code]['틱가치'] return profit except Exception as err: self.err_log.error(util.get_error_msg(err))
def comm_rq_data(self, sRQName, sTrCode, nPrevNext, sScreenNo): """ Tran을 서버로 송신한다. :param sRQName: 사용자구분 명 :param sTrCode: Tran명 입력 :param nPrevNext: 0:조회, 2:연속 :param sScreenNo: 4자리의 화면번호 Ex) openApi.CommRqData( “RQ_1”, “OPT00001”, 0, “0101”); :return: OP_ERR_SISE_OVERFLOW – 과도한 시세조회로 인한 통신불가 OP_ERR_RQ_STRUCT_FAIL – 입력 구조체 생성 실패 OP_ERR_RQ_STRING_FAIL – 요청전문 작성 실패 OP_ERR_NONE(0) – 정상처리 """ try: self.log.debug( "comm_rq_data(), sRQName: %s, sTrCode: %s, nPrevNext: %s, sScreenNo: %s" % (sRQName, sTrCode, nPrevNext, sScreenNo)) request_config = { "InputValue": self.input_value, "sRQName": sRQName, "sTrCode": sTrCode, "nPrevNext": nPrevNext, "sScreenNo": sScreenNo } self.input_value = [] self.req.append(request_config) now = time.localtime() if const.MODE == const.REAL and \ ((now.tm_wday == 5 and util.get_time(0, None) > 600) or (now.tm_wday == 6)): time.sleep(0.25) self.send_request() except Exception as err: self.log.error(util.get_error_msg(err))
def init_data(self, subject_code, common_data=None): try: s_time = time.time() subject_symbol = subject_code[:2] self.stv.info[subject_code] = self.stv.info[subject_symbol] self.sbv.info[subject_code] = self.sbv.info[subject_symbol] self.data[subject_code] = {} self.data[subject_code]['상태'] = '대기' if self.sbv.info[subject_code]['전략'] == const.파라: for chart_config in self.stv.info[subject_code][const.파라][ const.차트]: chart_type = chart_config[0] time_unit = chart_config[1] if chart_type == const.틱차트: if const.틱차트 not in self.data[subject_code]: self.data[subject_code][chart_type] = {} self.data[subject_code][chart_type][time_unit] = {} if common_data is None: self.data[subject_code][chart_type][time_unit][ const.현재가] = [] self.data[subject_code][chart_type][time_unit][ const.시가] = [] self.data[subject_code][chart_type][time_unit][ const.고가] = [] self.data[subject_code][chart_type][time_unit][ const.저가] = [] self.data[subject_code][chart_type][time_unit][ const.체결시간] = [] self.data[subject_code][chart_type][time_unit][ const.영업일자] = [] self.data[subject_code][chart_type][time_unit][ const.거래량] = [] self.data[subject_code][chart_type][time_unit][ const.인덱스] = -1 else: self.data[subject_code][chart_type][time_unit][ const.현재가] = common_data[subject_code][ chart_type][time_unit][const.현재가] self.data[subject_code][chart_type][time_unit][ const.시가] = common_data[subject_code][ chart_type][time_unit][const.시가] self.data[subject_code][chart_type][time_unit][ const.고가] = common_data[subject_code][ chart_type][time_unit][const.고가] self.data[subject_code][chart_type][time_unit][ const.저가] = common_data[subject_code][ chart_type][time_unit][const.저가] self.data[subject_code][chart_type][time_unit][ const.체결시간] = common_data[subject_code][ chart_type][time_unit][const.체결시간] self.data[subject_code][chart_type][time_unit][ const.영업일자] = [] self.data[subject_code][chart_type][time_unit][ const.거래량] = [] self.data[subject_code][chart_type][time_unit][ const.인덱스] = -1 self.data[subject_code][chart_type][time_unit][ const.현재가변동횟수] = 0 self.data[subject_code][chart_type][time_unit][ const.현재캔들] = {} self.data[subject_code][chart_type][time_unit][ const.임시캔들] = [] self.data[subject_code][chart_type][time_unit][ const.임시데이터] = [] self.data[subject_code][chart_type][time_unit][ const.임시틱] = [] self.data[subject_code][chart_type][time_unit][ const.차트타입] = chart_type self.data[subject_code][chart_type][time_unit][ const.시간단위] = time_unit self.data[subject_code][chart_type][time_unit][ const.이동평균선] = {} self.data[subject_code][chart_type][time_unit][ const.이동평균선][ const.일수] = self.stv.info[subject_code][ self.sbv.info[subject_code][const.전략]][ const.차트변수][chart_type][time_unit][ const.이동평균선] self.data[subject_code][chart_type][time_unit][ const.지수이동평균선] = {} for days in self.data[subject_code][chart_type][ time_unit][const.이동평균선][const.일수]: self.data[subject_code][chart_type][time_unit][ const.이동평균선][days] = [] self.data[subject_code][chart_type][time_unit][ const.지수이동평균선][days] = [] self.data[subject_code][chart_type][time_unit][ const.볼린저밴드] = {} self.data[subject_code][chart_type][time_unit][ const.볼린저밴드][const.중심선] = [] self.data[subject_code][chart_type][time_unit][ const.볼린저밴드][const.상한선] = [] self.data[subject_code][chart_type][time_unit][ const.볼린저밴드][const.하한선] = [] self.data[subject_code][chart_type][time_unit][ const.볼린저밴드][const.캔들위치] = [] self.data[subject_code][chart_type][time_unit][ const.일목균형표] = {} self.data[subject_code][chart_type][time_unit][ const.일목균형표][const.전환선] = [] self.data[subject_code][chart_type][time_unit][ const.일목균형표][const.기준선] = [] self.data[subject_code][chart_type][time_unit][ const.일목균형표][const.선행스팬1] = [] self.data[subject_code][chart_type][time_unit][ const.일목균형표][const.선행스팬2] = [] for i in range(0, 26): self.data[subject_code][chart_type][time_unit][ const.일목균형표][const.선행스팬1].append(None) self.data[subject_code][chart_type][time_unit][ const.일목균형표][const.선행스팬2].append(None) self.data[subject_code][chart_type][time_unit][ const.현재SAR] = 0 # 현재 SAR self.data[subject_code][chart_type][time_unit][ const.SAR] = [] self.data[subject_code][chart_type][time_unit][ const.EP] = 0 self.data[subject_code][chart_type][time_unit][ const.AF] = 0 self.data[subject_code][chart_type][time_unit][ const.현재플로우] = '' self.data[subject_code][chart_type][time_unit][ const.플로우] = [] self.data[subject_code][chart_type][time_unit][ const.지난플로우] = [ ] # [ {const.추세: '상향', const.시작SAR: 1209.3 const.마지막SAR: 1212.4 }, {const.추세: '하향', const.시작SAR: 1212.4 const.마지막SAR: 1211.0 } ] elif chart_type is const.분차트: self.data[subject_code][chart_type][time_unit][ const.현재가변동시간] = [] pass else: ''' self.data[subject_code][chart_type][time_unit][const.일목균형표] = {} self.data[subject_code][chart_type][time_unit][const.일목균형표][const.전환선] = [] self.data[subject_code][chart_type][time_unit][const.일목균형표][const.기준선] = [] self.data[subject_code][chart_type][time_unit][const.일목균형표][const.선행스팬1] = [] self.data[subject_code][chart_type][time_unit][const.일목균형표][const.선행스팬2] = [] for index in range(0, 26): self.data[subject_code][chart_type][time_unit][const.일목균형표][const.선행스팬1].append(None) self.data[subject_code][chart_type][time_unit][const.일목균형표][const.선행스팬2].append(None) ''' self.running_time = self.running_time + (time.time() - s_time) except Exception as err: self.log.error(util.get_error_msg(err))
def add_contract(self, order_info): try: subject_code = order_info['종목코드'] if subject_code in self.contract_list: # 가지고 있는 계약이면 c = self.contract_list[subject_code] self.log.info( '%s 종목은 이미 %s계약 보유 중 입니다' % (subject_code, self.contract_list[subject_code]['보유수량'])) self.log.info('%s 종목 신규 계약 %d개 추가 합니다.' % (subject_code, int(order_info['신규수량']))) # 정확한 체결가를 위해 체결가 다시 계산 c['체결가'] = ((c['체결가'] * c['보유수량']) + (order_info['체결표시가격']\ * int(order_info['신규수량']))) / (c['보유수량'] + int(order_info['신규수량'])) c['체결가'] = round(float(order_info['체결표시가격']), self.sbv.info[order_info['종목코드']]['자릿수']) if self.sbv.info[subject_code]['상태'] == '매매시도중' or self.sbv.info[subject_code]['상태'] == '매수중' \ or self.sbv.info[subject_code]['상태'] == '매도중': if c['계약타입'][SAFE] > c['계약타입'][DRIBBLE]: safe_num = int(int(order_info['신규수량']) / 2) dribble_num = int(order_info['신규수량']) - safe_num else: dribble_num = int(int(order_info['신규수량']) / 2) safe_num = int(order_info['신규수량']) - dribble_num c['계약타입'][SAFE] += safe_num c['계약타입'][DRIBBLE] += dribble_num c['보유수량'] = c['보유수량'] + safe_num + dribble_num self.log.info('종목코드 : ' + subject_code + ', 목표달성청산수량 ' + str(safe_num) + '개, 드리블수량 ' + str(dribble_num) + '개 추가.') else: self.err_log.log("%s 상태 이상으로 계약 추가를 수행하지 못하였습니다." % subject_code) else: # 신규 계약 이면 self.log.info("%s 신규 계약 추가: %s" % (subject_code, order_info)) self.contract_list[subject_code] = {} c = self.contract_list[subject_code] safe_num = int(int(order_info['신규수량']) / 2) dribble_num = int(order_info['신규수량']) - safe_num c['보유수량'] = int(order_info['신규수량']) c['계약타입'] = {} c['계약타입'][SAFE] = safe_num c['계약타입'][DRIBBLE] = dribble_num c['체결가'] = float(order_info['체결표시가격']) c['매도수구분'] = order_info['매도수구분'] c['전략'] = self.sbv.info[subject_code]['전략'] if self.sbv.info[subject_code]['전략'] == '파라': order_info['익절틱'], order_info['손절틱'] = self.get_loss_cut( self.sbv.info[subject_code]['전략']) c['익절가'] = [] c['손절가'] = [] if order_info['매도수구분'] == const.매도: for i in range(len(order_info['익절틱'])): c['익절가'].append(c['체결가'] - order_info['익절틱'][i] * self.sbv.info[subject_code]['단위']) for i in range(len(order_info['손절틱'])): c['손절가'].append(c['체결가'] + order_info['손절틱'][i] * self.sbv.info[subject_code]['단위']) elif order_info['매도수구분'] == const.매수: for i in range(len(order_info['익절틱'])): c['익절가'] = c['체결가'] + order_info['익절틱'][i] * \ self.sbv.info[subject_code]['단위'] for i in range(len(order_info['손절틱'])): c['손절가'] = c['체결가'] - order_info['손절틱'][i] * \ self.sbv.info[subject_code]['단위'] self.log.info('신규계약 추가, 종목코드 : ' + subject_code + ', 목표달성청산수량 ' + str(safe_num) + '개, 드리블수량 ' + str(dribble_num) + '개 추가.') except Exception as err: self.err_log.error(util.get_error_msg(err))
def is_it_sell(self, cm, subject_code, current_price): s_time = time.time() try: if not (self.chart.data[subject_code]['상태'] == '매수중' or self.chart.data[subject_code]['상태'] == '매도중'): self.running_time = self.running_time + (time.time() - s_time) return const.false 차트 = self.get_chart(self.chart, subject_code) 계약 = cm.get_contract_list(subject_code) #매도수구분 = const.매매없음 수량 = 0 보유수량 = cm.get_contract_count(subject_code) 차트변수 = self.stv.info[subject_code][const.파라]['차트변수'] ''' 반전시 청산 ''' if 계약.매도수구분 == const.매수: if current_price < 차트[0][const.현재SAR]: 매도수구분 = const.매도 수량 = 보유수량 차트[0]['현재플로우'] = const.하향 # 플로우 즉시 반영 차트[0][ const. 현재SAR] = const.ZERO # 다음 캔들이되어 SAR이 계산되기 전에 새로운 매매가 들어가는 것을 방지 elif 계약.매도수구분 == const.매도: if current_price > 차트[0][const.현재SAR]: 매도수구분 = const.매수 수량 = 보유수량 차트[0]['현재플로우'] = const.상향 # 플로우 즉시 반영 차트[0][ const. 현재SAR] = const.INFINITY # 다음 캔들이되어 SAR이 계산되기 전에 새로운 매매가 들어가는 것을 방지 ''' 손절가 및 청산가에 청산 ''' if 계약.매도수구분 == const.매수: for 청산단계 in range(len(계약.손절가)): 손절가 = 계약.손절가[청산단계] if current_price <= 손절가: 매도수구분 = const.매도 if 청산단계 == 0: # 손절가, 전체 청산 수량 = 보유수량 elif 청산단계 > 0 and 보유수량 >= 2: # n차청산 if 청산단계 == 1: 수량 = 보유수량 / 2 elif 청산단계 == 2: 수량 = (보유수량 + 1) / 2 else: 수량 = 보유수량 for 청산단계 in range(len(계약.익절가)): 익절가 = 계약.익절가[청산단계] if current_price >= 익절가: if 청산단계 == 0: # 익절가, 전체 청산 매도수구분 = const.매도 수량 = 보유수량 elif 청산단계 > 0 and 보유수량 >= 2: # n차청산 계약.익절가[청산단계] = 계약.익절가[청산단계] + 차트변수[ const.청산단계별드리블틱][청산단계] 계약.손절가[청산단계] = 계약.손절가[청산단계] + 차트변수[ const.청산단계별드리블틱][청산단계] elif 계약.매도수구분 == const.매도: for 청산단계 in range(len(계약.손절가)): 손절가 = 계약.손절가[청산단계] if current_price >= 손절가: 매도수구분 = const.매도 if 청산단계 == 0: # 손절가, 전체 청산 수량 = 보유수량 elif 청산단계 > 0 and 보유수량 >= 2: # n차청산 if 청산단계 == 1: 수량 = 보유수량 / 2 elif 청산단계 == 2: 수량 = (보유수량 + 1) / 2 else: 수량 = 보유수량 for 청산단계 in range(len(계약.익절가)): 익절가 = 계약.익절가[청산단계] if current_price <= 익절가: if 청산단계 == 0: # 익절가, 전체 청산 매도수구분 = const.매도 수량 = 보유수량 elif 청산단계 > 0 and 보유수량 >= 2: # n차청산 계약.익절가[청산단계] = 계약.익절가[청산단계] - 차트변수[ const.청산단계별드리블틱][청산단계] 계약.손절가[청산단계] = 계약.손절가[청산단계] - 차트변수[ const.청산단계별드리블틱][청산단계] 수량 = int(수량) if 수량 is 0: return const.false order_info = {'신규주문': True, '매도수구분': 매도수구분, '수량': 수량} self.running_time = self.running_time + (time.time() - s_time) return order_info except Exception as err: self.err_log.error(util.get_error_msg(err)) self.running_time = self.running_time + (time.time() - s_time) return const.false
def get_mesu_medo_type(self, subject_code, 현재가, 차트): print("차트 : " + str(차트)) try: 차트변수 = self.stv.info[subject_code][const.파라][const.차트변수] 차트타입 = 차트[const.차트타입] 시간단위 = 차트[const.시간단위] 매도수구분 = const.매매없음 현재플로우 = 차트[const.현재플로우] 지난플로우 = 차트[const.현재플로우][:5] i = 차트['인덱스'] if (현재플로우 == const.상향 and 차트[const.플로우][-1] != 차트[const.플로우][-2]) or \ (현재플로우 == const.하향 and 현재가 > 차트[const.현재SAR]): 매도수구분 = const.매수 차트[const.현재플로우] = const.상향 # 현재 플로우 즉시 반영 차트[const.현재SAR] = const.ZERO elif (현재플로우 == const.하향 and 차트[const.플로우][-1] != 차트[const.플로우][-2]) or \ (현재플로우 == const.상향 and 현재가 < 차트[const.현재SAR]): 매도수구분 = const.매도 차트['현재플로우'] = const.하향 # 현재 플로우 즉시 반영 차트[const.현재SAR] = const.INFINITY ''' 반전시 매매''' if (차트['현재플로우'] == const.상향 and util.is_sorted(self.chart, self.stv, subject_code, 차트타입, 시간단위) != const.상승세) or \ (차트['현재플로우'] == const.하향 and util.is_sorted(self.chart, self.stv, subject_code, 차트타입, 시간단위) != const.하락세): ''' 이동평균선 안맞을 시 매매 안함 ''' self.log.debug('이동평균선 방향이 현재 플로우와 맞지 않아 매매 안함.') return const.매매없음 ''' 이전 플로우 수익이 매매불가수익량 이상일 때 매매 안함 ''' if (지난플로우[0][const.추세] == const.상향 and (지난플로우[0][const.마지막SAR] - 지난플로우[0][const.시작SAR])*self.sbv.info[subject_code]['틱가치'] >= 차트변수[const.매매불가수익량]) or \ (지난플로우[0][const.추세] == const.하향 and (지난플로우[0][const.시작SAR] - 지난플로우[0][const.마지막SAR])*self.sbv.info[subject_code]['틱가치'] >= 차트변수[const.매매불가수익량]): self.log.debug("이전 플로우 수익이 %s틱 이상이므로 현재 플로우는 넘어갑니다." % 차트변수[const.매매불가수익량]) return const.false ''' 틀, 틀, 틀, 틀 이후 매매 안함 ''' 맞틀리스트 = [] for 플로우 in 지난플로우: if (플로우[const.추세] == const.상향 and (플로우[const.마지막SAR] - 플로우[const.시작SAR]) > 0) or \ (플로우[const.추세] == const.하향 and (플로우[const.마지막SAR] - 플로우[const.시작SAR]) < 0): 맞틀리스트.append(const.맞) else: 맞틀리스트.append(const.틀) if 차트['현재플로우'] != 차트[const.플로우]: ''' 반전되었으나, 캔들이 완성되지 않아 아직 SAR 계산은 이루어지지 않음 ''' if (차트[const.플로우][-1] == const.상향 and (현재가 - 차트[const.SAR][-1]) > 0) \ or (차트[const.플로우][-1] == const.하향 and (현재가 - 차트[const.SAR][-1]) < 0): 맞틀리스트.append(const.맞) else: 맞틀리스트.append(const.틀) if 맞틀리스트[-5:] == [const.틀, const.틀, const.틀, const.틀, const.틀]: self.log.debug("틀 5회 연속으로 매매 안함.") return const.false elif 맞틀리스트[-4:] == [const.맞, const.틀, const.틀, const.틀]: self.log.debug("[맞, 틀, 틀, 틀]로 매매 안함.") return const.false elif 맞틀리스트[-3:] == [const.맞, const.틀, const.틀]: self.log.debug("[맞, 틀, 틀]로 매매 안함.") return const.false return 매도수구분 except Exception as err: self.err_log.error(util.get_error_msg(err)) return const.매매없음
def OnReceiveChejanData(self, sGubun, nItemCnt, sFidList, o_info=None): """ 체결데이터를 받은 시점을 알려준다. :type o_info: object :param sGubun: 체결구분 - 0:주문체결통보, 1:잔고통보, 3:특이신호 :param nItemCnt: 아이템갯수 :param sFidList: 데이터리스트 - 데이터 구분은 ‘;’ 이다. """ self.log.debug("onReceiveChejanData (%s, %s, %s)" % (sGubun, nItemCnt, sFidList)) try: if sGubun == '1': order_info = {} if const.MODE == const.REAL: # 실제투자 order_info['주문번호'] = int( self.ocx.dynamicCall("GetChejanData(int)", 9203)) # 주문번호 order_info['원주문번호'] = int( self.ocx.dynamicCall("GetChejanData(int)", 904)) # 원주문번호 order_info['주문유형'] = int( self.ocx.dynamicCall( "GetChejanData(int)", 906)) # 주문유형(1 : 시장가, 2 : 지정가, 3 : STOP) order_info['종목코드'] = self.ocx.dynamicCall( "GetChejanData(int)", 9001) # 종목코드 order_info['매도수구분'] = int( self.ocx.dynamicCall("GetChejanData(int)", 907)) # 매도수구분(1 : 매도, 2 : 매수) order_info['체결표시가격'] = self.ocx.dynamicCall( "GetChejanData(int)", 13331) # 체결표시가격 order_info['신규수량'] = self.ocx.dynamicCall( "GetChejanData(int)", 13327) # 신규수량 order_info['청산수량'] = self.ocx.dynamicCall( "GetChejanData(int)", 13328) # 청산수량 order_info['체결수량'] = self.ocx.dynamicCall( "GetChejanData(int)", 911) # 체결수량 self.get_my_deposit_info() elif const.MODE == const.TEST: # 테스트 order_info = o_info order_info['체결표시가격'] = round( float(order_info['체결표시가격']), self.subject_var.info[order_info['종목코드']]['자릿수']) add_cnt = int(order_info['신규수량']) remove_cnt = int(order_info['청산수량']) ''' 청산 체결 ''' if remove_cnt > 0: msg = '청산주문 체결 [%s]' % order_info self.res.info(msg) 수익 = self.contract_manager.remove_contract(order_info) self.누적수익 += 수익 self.telepot.send_message('%s, 체결수익 : %s, 누적수익 : %s' % (msg, 수익, self.누적수익)) ''' 신규 매매 체결 ''' if add_cnt > 0: msg = '신규주문 체결 [%s]' % order_info self.res.info('신규주문 체결 [%s]' % order_info) self.contract_manager.add_contract(order_info) self.telepot.send_message(msg) except Exception as err: self.log.error(util.get_error_msg(err))
def OnReceiveTrData(self, sScrNo, sRQName, sTrCode, sRecordName, sPreNext, candle=None): """ Tran 수신시 이벤트 서버통신 후 데이터를 받은 시점을 알려준다. :param py: 화면번호 :param sRQName: 사용자구분 명 :param sTrCode: Tran 명 :param sRecordName: Record 명 :param sPreNext: 연속조회 유무 :param nDataLength: 1.0.0.1 버전 이후 사용하지 않음. :param sErrorCode: 1.0.0.1 버전 이후 사용하지 않음. :param sMessage: 1.0.0.1 버전 이후 사용하지 않음. :param sSplmMsg: 1.0.0.1 버전 이후 사용하지 않음. """ self.log.debug("current thread : %s" % threading.current_thread().__class__.__name__) self.log.debug( "onReceiveTrData, sScrNo : %s, sRQName : %s, sTrCode : %s, sRecordName : %s, sPreNext : %s" % (sScrNo, sRQName, sTrCode, sRecordName, sPreNext)) try: if sRQName == '상품별현재가조회': self.log.debug("onRecieveTrData: 상품별현재가조회") for i in range(20): subject_code = self.ocx.dynamicCall( "GetCommData(QString, QString, int, QString)", sTrCode, sRecordName, i, '종목코드n').strip() # 현재가 = 틱의 종가 subject_symbol = subject_code[:2] self.log.debug("상품별현재가조회, 종목코드 : %s" % subject_code) if subject_symbol in self.subject_var.info: self.log.debug( "금일 %s의 종목코드는 %s 입니다." % (self.subject_var.info[subject_symbol]["종목명"], subject_code)) self.subject_var.info[ subject_code] = self.subject_var.info[ subject_symbol] self.strategy_var.info[ subject_code] = self.strategy_var.info[ subject_symbol] del self.subject_var.info[subject_symbol] del self.strategy_var.info[subject_symbol] self.chart_manager.init_data(subject_code) # 초기 데이터 요청 for chart_config in self.strategy_var.info[ subject_code][self.subject_var.info[ subject_code]['전략']][const.차트]: type_ = chart_config[0] time_unit = chart_config[1] self.log.debug("chart_config : %s" % chart_config) if type_ == const.틱차트: self.request_tick_info(subject_code, time_unit, "") elif type_ == const.분차트: self.request_min_info(subject_code, time_unit, "") elif '해외선물옵션틱차트조회' in sRQName: params = sRQName.split('_') chart_type = const.틱차트 time_unit = params[2] subject_code = params[1] self.log.debug("해외선물옵션틱차트조회 params : %s" % params) if subject_code in self.subject_var.info: if const.MODE is const.REAL: data_str = self.ocx.dynamicCall( "GetCommFullData(QString, QString, int)", sTrCode, sRecordName, 0) chart_data = self.chart_manager.data[subject_code][ chart_type][time_unit] # 차트 타입과 시간단위에 맞는 차트 불러옴 if len(chart_data['임시데이터']) == 0: ''' 가장 처음 데이터가 수신 되었을 때 ''' self.log.debug("데이터 수신 시작. 차트구분 : %s, 시간단위 : %s" % (chart_type, time_unit)) chart_data['임시데이터'] = data_str.split() chart_data['현재가변동횟수'] = int(chart_data['임시데이터'][0]) chart_data['현재캔들'] = {} chart_data['현재캔들'][const.현재가] = float( chart_data['임시데이터'][1]) chart_data['현재캔들']['거래량'] = int( chart_data['임시데이터'][2]) chart_data['현재캔들'][const.체결시간] = str( chart_data['임시데이터'][3]) chart_data['현재캔들'][const.시가] = float( chart_data['임시데이터'][4]) chart_data['현재캔들'][const.고가] = float( chart_data['임시데이터'][5]) chart_data['현재캔들'][const.저가] = float( chart_data['임시데이터'][6]) chart_data['현재캔들']['영업일자'] = str( chart_data['임시데이터'][7]) chart_data['임시캔들'] = [ ] # 초기 데이터 수신 중 완성된 캔들을 임시로 저장하고, 수신이 완료된 후 Push if chart_data['현재가변동횟수'] == int(time_unit): self.log.debug( "수신 된 첫 캔들이 이미 완성된 캔들이므로, 임시 캔들에 추가함.") chart_data['임시캔들'].append(chart_data['현재캔들']) self.chart_manager.init_current_candle( subject_code, chart_type, time_unit) for tick in chart_data['임시틱']: ''' 첫 번째 데이터 수신 전 해당 차트로부터 들어온 Tick들 처리 ''' if chart_data['현재가변동횟수'] == 0: chart_data['현재캔들'][const.시가] = tick[0] chart_data['현재가변동횟수'] += 1 if tick[0] < chart_data['현재캔들'][const.저가]: chart_data['현재캔들'][const.저가] = tick[0] if tick[0] > chart_data['현재캔들'][const.고가]: chart_data['현재캔들'][const.고가] = tick[0] if chart_data['현재가변동횟수'] == time_unit: chart_data['현재캔들'][const.체결시간] = tick[1] chart_data['현재캔들'][const.현재가] = tick[0] chart_data['현재가변동횟수'] = 0 if chart_data['인덱스'] == -1: chart_data['임시캔들'].append( chart_data['현재캔들']) else: self.chart_manager.push( subject_code, chart_type, time_unit, chart_data['현재캔들']) else: ''' 데이터 수신 중간 ''' self.log.debug("데이터 수신 중. 차트구분 : %s, 시간단위 : %s" % (chart_type, time_unit)) chart_data['임시데이터'] = chart_data[ '임시데이터'] + data_str.split()[1:] if len(chart_data['임시데이터'] ) / 7 > self.strategy_var.info[subject_code][ self.subject_var.info[subject_code]['전략']][ const.차트변수][chart_type][time_unit][ const.초기캔들수]: ''' 데이터 수신 완료 ''' self.log.debug("데이터 수신 완료. 차트구분 : %s, 시간단위 : %s" % (chart_type, time_unit)) current_idx = len(chart_data['임시데이터']) - 7 candle = {} while current_idx > 8: candle[const.현재가] = float( chart_data['임시데이터'][current_idx]) candle['거래량'] = int( chart_data['임시데이터'][current_idx + 1]) candle[const.체결시간] = str( chart_data['임시데이터'][current_idx + 2]) candle[const.시가] = float( chart_data['임시데이터'][current_idx + 3]) candle[const.고가] = float( chart_data['임시데이터'][current_idx + 4]) candle[const.저가] = float( chart_data['임시데이터'][current_idx + 5]) candle['영업일자'] = str( chart_data['임시데이터'][current_idx + 6]) current_idx -= 7 self.chart_manager.push( subject_code, chart_type, time_unit, candle) if len(chart_data['임시캔들']) > 0: self.log.debug("데이터 수신 중 완성된 임시캔들들 Push.") for candle in chart_data['임시캔들']: self.chart_manager.push( subject_code, chart_type, time_unit, candle) isEnd = True for chart_config in self.strategy_var.info[ subject_code][self.subject_var.info[ subject_code]['전략']][const.차트]: chart_type = chart_config[0] time_unit = chart_config[1] if self.chart_manager.data[subject_code][chart_type][time_unit]['인덱스'] < \ self.strategy_var.info[subject_code][self.subject_var.info[subject_code]['전략']][const.차트변수][chart_type][time_unit][const.초기캔들수]: isEnd = False break if isEnd: self.chart_manager.data[subject_code][ '상태'] = '매매가능' else: self.request_tick_info(subject_code, time_unit, sPreNext) elif const.MODE is const.TEST: pass elif sRQName == '미결제잔고내역조회': order_info = {} contract_cnt = int( self.ocx.dynamicCall( "GetCommData(QString, QString, int, QString)", sTrCode, sRecordName, 1, '매도수량')) if contract_cnt is 0: contract_cnt = int( self.ocx.dynamicCall( "GetCommData(QString, QString, int, QString)", sTrCode, sRecordName, 1, '매수수량')) order_info['매도수구분'] = const.매수 else: order_info['매도수구분'] = const.매도 if contract_cnt is 0: return order_info['종목코드'] = self.ocx.dynamicCall( "GetCommData(QString, QString, int, QString)", sTrCode, sRecordName, 0, '종목코드').strip() order_info['신규수량'] = contract_cnt order_info['체결표시가격'] = self.ocx.dynamicCall( "GetCommData(QString, QString, int, QString)", sTrCode, sRecordName, 0, '평균단가').strip() self.log.debug("미결제잔고내역조회 : %s", order_info) ''' if self.state == '매매가능': return self.state = '매매가능' order_info = {} order_contents = {} contract_cnt = int( self.ocx.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRecordName, 1, '매도수량')) if contract_cnt is 0: contract_cnt = int( self.ocx.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRecordName, 1, '매수수량')) order_contents['매도수구분'] = '신규매수' else: order_contents['매도수구분'] = '신규매도' if contract_cnt is 0: return order_info['종목코드'] = self.ocx.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRecordName, 0, '종목코드').strip() order_info['신규수량'] = contract_cnt order_info['체결표시가격'] = self.ocx.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRecordName, 0, '평균단가').strip() order_contents['익절틱'] = self.subject_var.info[order_info['종목코드']]['익절틱'] order_contents['손절틱'] = self.subject_var.info[order_info['종목코드']]['손절틱'] contract.add_contract(order_info, order_contents) ''' elif sRQName == "예수금및증거금현황조회": self.account_pwd_input = True self.contract_manager.예수금 = int( self.ocx.dynamicCall( "GetCommData(QString, QString, int, QString)", sTrCode, sRecordName, 0, '주문가능금액').strip()) self.log.debug('예수금 현황 : ' + str(self.contract_manager.예수금)) except Exception as err: self.log.error(util.get_error_msg(err))
def calc_strategy_var(self, _cur_array): try: cur_array = _cur_array[:] # 전략 변수 Config 불러오기 config = configparser.RawConfigParser() config.read(const.CONFIG_PATH + '/tester_var.cfg') stv = strategy_var.Strategy_Var() for subject_code in self.sbv.info.keys(): subject_symbol = subject_code[:2] if subject_symbol not in stv.info: stv.info[subject_symbol] = {} strategy = config.get(const.ST_CONFIG, subject_symbol) stv.info[subject_symbol][strategy] = {} stv.info[subject_symbol][strategy][const.차트] = [] stv.info[subject_symbol][strategy][const.차트변수] = {} stv.info[subject_symbol][strategy][const.차트변수][const.틱차트] = {} stv.info[subject_symbol][strategy][const.차트변수][const.분차트] = {} if strategy == const.파라: stv.info[subject_symbol][strategy][const.차트변수][ const.매매불가수익량] = self.get_divide_value( json.loads( config.get(subject_symbol, const.매매불가수익량)), cur_array.pop(0)) tmp_list = json.loads( config.get(subject_symbol, const.청산단계별드리블틱)) stv.info[subject_symbol][strategy][const.차트변수][ const.청산단계별드리블틱] = [] for list in tmp_list: stv.info[subject_symbol][strategy][const.차트변수][ const.청산단계별드리블틱].append( self.get_divide_value(list, cur_array.pop(0))) ## subject_symbol의 config 불러옴 chart_types = json.loads( config.get(subject_symbol, const.CHART_TYPE)) for chart_type in chart_types: type = chart_type.split('_')[0] time_unit = chart_type.split('_')[1] section_str = subject_symbol + '_' + chart_type stv.info[subject_symbol][strategy][ const.차트변수][type][time_unit] = {} stv.info[subject_symbol][strategy][const.차트].append( [str(type), str(time_unit)]) if strategy == const.파라: tmp_list = json.loads( config.get(section_str, const.이동평균선)) stv.info[subject_symbol][strategy][ const.차트변수][type][time_unit][const.이동평균선] = [] for list in tmp_list: stv.info[subject_symbol][strategy][const.차트변수][ type][time_unit][const.이동평균선].append( self.get_divide_value( list, cur_array.pop(0))) stv.info[subject_symbol][strategy][const.차트변수][type][ time_unit][const.INIT_AF] = self.get_divide_value( json.loads( config.get(section_str, const.INIT_AF)), cur_array.pop(0)) stv.info[subject_symbol][strategy][const.차트변수][type][ time_unit][const.MAX_AF] = self.get_divide_value( json.loads( config.get(section_str, const.MAX_AF)), cur_array.pop(0)) stv.info[subject_symbol][strategy][const.차트변수][type][ time_unit][const.초기캔들수] = self.get_divide_value( json.loads(config.get(section_str, const.초기캔들수)), cur_array.pop(0)) return stv except Exception as err: self.err_log.error(util.get_error_msg(err))
def create_simulater_var_table(self): try: max_array = [] cur_array = [] # 전략 변수 Config 불러오기 config = configparser.RawConfigParser() config.read(const.CONFIG_PATH + '/tester_var.cfg') for subject_code in self.sbv.info.keys(): subject_symbol = subject_code[:2] strategy = config.get(const.ST_CONFIG, subject_symbol) if strategy == const.파라: tmp_list = json.loads(config.get(subject_symbol, const.매매불가수익량)) max_array.append( self.calc_divide_count(tmp_list[0], tmp_list[1], tmp_list[2])) cur_array.append(0) tmp_list = json.loads( config.get(subject_symbol, const.청산단계별드리블틱)) for list in tmp_list: max_array.append( self.calc_divide_count(list[0], list[1], list[2])) cur_array.append(0) ## subject_symbol의 config 불러옴 chart_types = json.loads( config.get(subject_symbol, const.CHART_TYPE)) for chart_type in chart_types: type = chart_type.split('_')[0] time_unit = chart_type.split('_')[1] section_str = subject_symbol + '_' + chart_type if strategy == const.파라: tmp_list = json.loads( config.get(section_str, const.이동평균선)) for list in tmp_list: max_array.append( self.calc_divide_count(list[0], list[1], list[2])) cur_array.append(0) tmp_list = json.loads( config.get(section_str, const.INIT_AF)) max_array.append( self.calc_divide_count(tmp_list[0], tmp_list[1], tmp_list[2])) cur_array.append(0) tmp_list = json.loads( config.get(section_str, const.MAX_AF)) max_array.append( self.calc_divide_count(tmp_list[0], tmp_list[1], tmp_list[2])) cur_array.append(0) tmp_list = json.loads( config.get(section_str, const.초기캔들수)) max_array.append( self.calc_divide_count(tmp_list[0], tmp_list[1], tmp_list[2])) cur_array.append(0) return max_array, cur_array except Exception as err: self.err_log.error(util.get_error_msg(err)) return None, None
def set_simulate_config(self, subject_code): try: # 전략 변수 Config 불러오기 config = configparser.RawConfigParser() config.read(const.CONFIG_PATH + '/tester_var.cfg') stv = strategy_var() for subject_code in self.sbv.info.keys(): subject_symbol = subject_code[:2] if subject_symbol not in stv.info: stv.info[subject_symbol] = {} strategy = config.get(const.ST_CONFIG, subject_symbol) stv.info[subject_symbol][strategy] = {} stv.info[subject_symbol][strategy][const.차트] = [] stv.info[subject_symbol][strategy][const.차트변수] = {} stv.info[subject_symbol][strategy][const.차트변수][const.틱차트] = {} stv.info[subject_symbol][strategy][const.차트변수][const.분차트] = {} if strategy == const.파라: stv.info[subject_symbol][strategy][const.차트변수][ const.매매불가수익량] = config.get(subject_symbol, const.매매불가수익량) stv.info[subject_symbol][strategy][const.차트변수][ const.청산단계별드리블틱] = json.loads( config.get(subject_symbol, const.청산단계별드리블틱)) ## subject_symbol의 config 불러옴 chart_types = json.loads( config.get(subject_symbol, const.CHART_TYPE)) for chart_type in chart_types: type_str = chart_type.split('_')[0] time_unit = chart_type.split('_')[1] section_str = subject_symbol + '_' + chart_type stv.info[subject_symbol][strategy][ const.차트변수][type_str][time_unit] = {} stv.info[subject_symbol][strategy][const.차트].append( [str(type_str), str(time_unit)]) if strategy == const.파라: stv.info[subject_symbol][strategy][const.차트변수][ type_str][time_unit][const.이동평균선] = json.loads( config.get(section_str, const.이동평균선)) stv.info[subject_symbol][strategy][ const.차트변수][type_str][time_unit][ const.INIT_AF] = config.getfloat( section_str, const.INIT_AF) stv.info[subject_symbol][strategy][ const.차트변수][type_str][time_unit][ const.MAX_AF] = config.getfloat( section_str, const.MAX_AF) stv.info[subject_symbol][strategy][const.차트변수][ type_str][time_unit][const.초기캔들수] = config.getint( section_str, const.초기캔들수) except Exception as err: self.err_log.error(util.get_error_msg(err))
def init_data(self, subject_code): try: s_time = time.time() self.data[subject_code] = {} self.data[subject_code]['상태'] = '대기' if self.sbv.info[subject_code]['전략'] == const.파라: for chart_config in self.stv.info[subject_code][const.파라][ const.차트]: chart_type = chart_config[0] time_unit = chart_config[1] if chart_type == const.틱차트: if const.틱차트 not in self.data[subject_code]: self.data[subject_code][chart_type] = {} self.data[subject_code][chart_type][time_unit] = {} if const.MODE == const.REAL: self.data[subject_code][chart_type][time_unit][ const.현재가] = [] self.data[subject_code][chart_type][time_unit][ const.시가] = [] self.data[subject_code][chart_type][time_unit][ const.고가] = [] self.data[subject_code][chart_type][time_unit][ const.저가] = [] self.data[subject_code][chart_type][time_unit][ const.체결시간] = [] self.data[subject_code][chart_type][time_unit][ '영업일자'] = [] self.data[subject_code][chart_type][time_unit][ '거래량'] = [] self.data[subject_code][chart_type][time_unit][ '인덱스'] = -1 elif const.MODE == const.TEST: self.data[subject_code][chart_type][ time_unit] = common_data[subject_code][ chart_type][time_unit] self.data[subject_code][chart_type][time_unit][ '인덱스'] = 0 self.data[subject_code][chart_type][time_unit][ '현재가변동횟수'] = 0 self.data[subject_code][chart_type][time_unit][ '현재캔들'] = {} self.data[subject_code][chart_type][time_unit][ '임시캔들'] = [] self.data[subject_code][chart_type][time_unit][ '임시데이터'] = [] self.data[subject_code][chart_type][time_unit][ '임시틱'] = [] self.data[subject_code][chart_type][time_unit][ '차트타입'] = chart_type self.data[subject_code][chart_type][time_unit][ '시간단위'] = time_unit self.data[subject_code][chart_type][time_unit][ const.이동평균선] = {} self.data[subject_code][chart_type][time_unit][ const.이동평균선]['일수'] = self.stv.info[subject_code][ self.sbv.info[subject_code]['전략']][const.차트변수][ chart_type][time_unit][const.이동평균선] self.data[subject_code][chart_type][time_unit][ '지수이동평균선'] = {} for days in self.data[subject_code][chart_type][ time_unit][const.이동평균선]['일수']: self.data[subject_code][chart_type][time_unit][ const.이동평균선][days] = [] self.data[subject_code][chart_type][time_unit][ '지수이동평균선'][days] = [] self.data[subject_code][chart_type][time_unit][ '볼린저밴드'] = {} self.data[subject_code][chart_type][time_unit][ '볼린저밴드']['중심선'] = [] self.data[subject_code][chart_type][time_unit][ '볼린저밴드']['상한선'] = [] self.data[subject_code][chart_type][time_unit][ '볼린저밴드']['하한선'] = [] self.data[subject_code][chart_type][time_unit][ '볼린저밴드']['캔들위치'] = [] self.data[subject_code][chart_type][time_unit][ '일목균형표'] = {} self.data[subject_code][chart_type][time_unit][ '일목균형표']['전환선'] = [] self.data[subject_code][chart_type][time_unit][ '일목균형표']['기준선'] = [] self.data[subject_code][chart_type][time_unit][ '일목균형표']['선행스팬1'] = [] self.data[subject_code][chart_type][time_unit][ '일목균형표']['선행스팬2'] = [] for index in range(0, 26): self.data[subject_code][chart_type][time_unit][ '일목균형표']['선행스팬1'].append(None) self.data[subject_code][chart_type][time_unit][ '일목균형표']['선행스팬2'].append(None) self.data[subject_code][chart_type][time_unit][ '현재SAR'] = 0 # 현재 SAR self.data[subject_code][chart_type][time_unit][ 'SAR'] = [] self.data[subject_code][chart_type][time_unit][ 'EP'] = 0 self.data[subject_code][chart_type][time_unit][ 'AF'] = 0 self.data[subject_code][chart_type][time_unit][ '현재플로우'] = '' self.data[subject_code][chart_type][time_unit][ '플로우'] = [] self.data[subject_code][chart_type][time_unit][ '지난플로우'] = [ ] # [ {'추세': '상향', '시작SAR': 1209.3 '마지막SAR': 1212.4 }, {'추세': '하향', '시작SAR': 1212.4 '마지막SAR': 1211.0 } ] elif chart_type is const.분차트: self.data[subject_code][chart_type][time_unit][ '현재가변동시간'] = [] pass else: ''' self.data[subject_code][chart_type][time_unit]['일목균형표'] = {} self.data[subject_code][chart_type][time_unit]['일목균형표']['전환선'] = [] self.data[subject_code][chart_type][time_unit]['일목균형표']['기준선'] = [] self.data[subject_code][chart_type][time_unit]['일목균형표']['선행스팬1'] = [] self.data[subject_code][chart_type][time_unit]['일목균형표']['선행스팬2'] = [] for index in range(0, 26): self.data[subject_code][chart_type][time_unit]['일목균형표']['선행스팬1'].append(None) self.data[subject_code][chart_type][time_unit]['일목균형표']['선행스팬2'].append(None) ''' self.running_time = self.running_time + (time.time() - s_time) except Exception as err: self.log.error(util.get_error_msg(err))
def proc(self): global running_time ''' 테스트 진입 종목코드, 시작일, 종료일 받아옴 ''' dbm = db_manager.DBManager() subject_symbol = '' start_date = '' end_date = '' self.log.info('종목코드를 입력하세요. [ ex) GC ]') subject_symbol = input() if subject_symbol not in self.sbv.info: self.log.info('잘못된 종목코드입니다.') self.proc() return self.log.info('시작일을 입력하세요.') start_date = input() if len(start_date) != 8: self.log.info('잘못된 시작일입니다.') self.proc() return self.log.info('종료일을 입력하세요.') end_date = input() if len(end_date) != 8: self.log.info('잘못된 종료일입니다.') self.proc() return ''' 입력 종료 ''' try: ''' 해당 종목 테이블 가져옴 ''' _tables = dbm.get_table_list(subject_symbol) tables = [] for table_name in _tables: print(table_name[0], start_date, end_date) if dbm.is_matched_table(table_name[0], start_date, end_date): tables.append(table_name[0]) data = {} for table_name in tables: data[table_name] = {} data[table_name][const.틱차트] = {} data[table_name][const.틱차트]['60'] = {} data[table_name][const.틱차트]['60'][const.체결시간] = [] data[table_name][const.틱차트]['60'][const.시가] = [] data[table_name][const.틱차트]['60'][const.고가] = [] data[table_name][const.틱차트]['60'][const.저가] = [] data[table_name][const.틱차트]['60'][const.현재가] = [] self.log.info('%s 월물 테이블 내용 수신 시작.' % table_name) temp = dbm.request_tick_candle(table_name, '60', start_date, end_date) for candle in temp: data[table_name][const.틱차트]['60'][const.체결시간].append( candle[const.체결시간]) data[table_name][const.틱차트]['60'][const.시가].append( candle[const.시가]) data[table_name][const.틱차트]['60'][const.고가].append( candle[const.고가]) data[table_name][const.틱차트]['60'][const.저가].append( candle[const.저가]) data[table_name][const.틱차트]['60'][const.현재가].append( candle[const.현재가]) print(data[table_name]) ''' TODO: 현재 1가지 차트로만 고정 추후 여러 차트 가능하게 확장 예정 ''' self.start_date = start_date self.end_date = end_date self.subject_symbol = subject_symbol ''' 상단까지가 우리가 입력한 날짜에 맞는 테이블을 틱_60으로만 가져오는 코드 ''' with mp.Manager() as manager: result = manager.list() common_data = manager.dict(data) while True: # self.log.info("DB 데이터를 설정된 차트에 맞는 캔들 데이터로 변환합니다.") # data[subject_code] -> ctm.common_data에 setting # tester_var.cfg에서 subject_symbol에 맞는 chart_type, time_unit을 가져와서 계산한다. self.log.info("총 테스트 횟수를 계산합니다.") total_count = 1 stv_table, cur_table = self.create_simulater_var_table( ) # 총 테스트 횟수 계산 for cnt in stv_table: total_count *= (cnt + 1) self.log.info("총 %s번의 테스트." % total_count) label = subprocess.check_output( ["git", "describe", "--always"]) # current git hash procs = [] stv = self.calc_strategy_var(cur_table) self.log.info("tables data : %s" % tables) self.log.info("common data : %s" % common_data) print("original common data id : %s" % id(common_data)) print("original result id : %s" % id(result)) # 차트 수신 if len(common_data.keys()) == 0: for subject_code in tables: common_data[subject_code] = manager.dict() for strategy in stv.info[subject_symbol]: for chart_config in stv.info[subject_symbol][ strategy][const.차트]: self.log.info('chart config : %s' % chart_config) self.log.info('subject_code : %s' % subject_code) if chart_config[0] not in common_data[ subject_code].keys(): common_data[subject_code][ chart_config[0]] = manager.dict() if chart_config[1] not in common_data[ subject_code][ chart_config[0]].keys(): common_data[subject_code][ chart_config[0]][chart_config[ 1]] = manager.dict() common_data[subject_code][ chart_config[0]][chart_config[1]][ const.현재가] = manager.list() common_data[subject_code][ chart_config[0]][chart_config[1]][ const.고가] = manager.list() common_data[subject_code][ chart_config[0]][chart_config[1]][ const.저가] = manager.list() common_data[subject_code][ chart_config[0]][chart_config[1]][ const.시가] = manager.list() common_data[subject_code][ chart_config[0]][chart_config[1]][ const.체결시간] = manager.list() #data[subject_code] = dbm.request_tick_candle(subject_code, chart_config[1]) for candle in data[subject_code][:100]: common_data[subject_code][ chart_config[0]][chart_config[ 1]][const.현재가].append( candle[const.현재가]) common_data[subject_code][ chart_config[0]][chart_config[ 1]][const.고가].append( candle[const.고가]) common_data[subject_code][ chart_config[0]][chart_config[ 1]][const.저가].append( candle[const.저가]) common_data[subject_code][ chart_config[0]][chart_config[ 1]][const.시가].append( candle[const.시가]) common_data[subject_code][ chart_config[0]][chart_config[ 1]][const.체결시간].append( candle[const.체결시간]) for i in range(0, 2): stv = self.calc_strategy_var(cur_table) ''' 해당 부분에서 Multiprocessing으로 테스트 시작 ''' process = mp.Process(target=simulate, args=( stv, common_data, result, )) procs.append(process) process.start() if self.increase_the_number_of_digits( stv_table, cur_table) == False: break for process in procs: process.join() print(result) self.log.info("[테스트 결과]") ''' 이 부분에 result를 수익별로 sorting ''' ''' 상위 N개의 결과 보여 줌 ''' print(len(result)) for i in range(0, min(len(result), 10)): self.log.info(result[i]) # 더 디테일하게 변경 ''' ''' self.log.info("테스트 정상 종료") break ''' ''' self.log.info("해당 코드의 Git Hash : %s" % label) while True: self.log.info( "Database에 넣을 결과 Index를 입력해주세요.(종료 : -1)") idx = input() if idx == '-1': break self.log.info( "저장하신 결과에 대한 코드를 나중에 확인하시기 위해선, 코드를 변경하시기 전에 Commit을 해야 합니다." ) ''' 해당 index의 결과를 stv를 정렬해서, 결과 DB에 저장. ''' self.log.info( "Config를 변경하여 계속 테스트 하시려면 아무키나 눌러주세요.(종료 : exit)") cmd = input() if cmd == 'exit': break self.log.info('테스트 종료.') except Exception as err: self.err_log.error(util.get_error_msg(err))