Esempio n. 1
0
    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))
Esempio n. 2
0
    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
Esempio n. 3
0
 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
Esempio n. 4
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))
Esempio n. 5
0
    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
Esempio n. 6
0
    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))
Esempio n. 7
0
    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))
Esempio n. 8
0
    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))
Esempio n. 9
0
    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))
Esempio n. 10
0
    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))
Esempio n. 11
0
    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
Esempio n. 12
0
    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.매매없음
Esempio n. 13
0
    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))
Esempio n. 14
0
    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))
Esempio n. 15
0
    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))
Esempio n. 16
0
    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
Esempio n. 17
0
    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))
Esempio n. 18
0
    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))
Esempio n. 19
0
    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))