Beispiel #1
0
def is_it_sell(subject_code, current_price):
    index = calc.data[subject_code]['idx']
    if contract.get_contract_count(subject_code) > 0:
        # 계약 보유중
        if contract.list[subject_code]['매도수구분'] == '신규매수':
            # 매수일때
            if current_price <= contract.list[subject_code]['손절가']:
                res.info("손절가가 되어 " + str(contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.")
                return {'신규주문':True, '매도수구분':'신규매도', '수량':contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]}
            elif calc.data[subject_code]['플로우'][-1] == '상향' and subject.info[subject_code]['sar'] > current_price:
                res.info("하향 반전되어 " + str(contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.")
                return {'신규주문':True, '매도수구분':'신규매도', '수량':contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]}
            elif current_price > contract.list[subject_code]['익절가']:
                contract.list[subject_code]['익절가'] = current_price + subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위']
                contract.list[subject_code]['손절가'] = current_price - subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위']
        elif contract.list[subject_code]['매도수구분'] == '신규매도':
            # 매도일때
            if current_price >= contract.list[subject_code]['손절가']:
                res.info("손절가가 되어 " + str(contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.")
                return {'신규주문':True, '매도수구분':'신규매수', '수량':contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]}
            elif calc.data[subject_code]['플로우'][-1] == '하향' and subject.info[subject_code]['sar'] < current_price:
                res.info("상향 반전되어 " + str(contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.")
                return {'신규주문':True, '매도수구분':'신규매수', '수량':contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]}
            elif current_price < contract.list[subject_code]['익절가']:
                contract.list[subject_code]['익절가'] = current_price - subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위']
                contract.list[subject_code]['손절가'] = current_price + subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위']
    return {'신규주문':False}
Beispiel #2
0
def is_it_OK(subject_code, current_price):
    profit_tick = 10
    loss_tick = 10
    mesu_medo_type = ''
    contract_cnt = 2
    index = calc.data[subject_code]['idx']
    false = {'신규주문':False}

    if calc.data[subject_code]['idx'] < 300:
        return false

    state = subject.info[subject_code]['상태']
    if state == '매수중' or state == '매도중': return false

    elif state == '매매완료':
        if subject.info[subject_code]['flow'] == '하향' and subject.info[subject_code]['sar'] < current_price:
            subject.info[subject_code]['상태'] = '매수가능'
        elif subject.info[subject_code]['flow'] == '상향' and subject.info[subject_code]['sar'] > current_price:
            subject.info[subject_code]['상태'] = '매도가능'
    elif state == '매수가능' or state == '매도가능':
        if state == '매수가능' and my_util.is_sorted(subject_code) == '상승세':
                res.info('종목(' + subject_code + ') 현재 상승세이므로 매수 시도.')
                mesu_medo_type = '신규매수'
                profit_tick = subject.info[subject_code]['익절틱']
                loss_tick = subject.info[subject_code]['손절틱']
                contract_cnt = 2
        elif state == '매도가능' and my_util.is_sorted(subject_code) == '하락세':
                res.info('종목(' + subject_code + ') 현재 하락세이므로 매도 시도.')
                mesu_medo_type = '신규매도'
                profit_tick = subject.info[subject_code]['익절틱']
                loss_tick = subject.info[subject_code]['손절틱']
                contract_cnt = 2
        else:
            subject.info[subject_code]['상태'] = '매매완료' 
            return false
    else: return false
    
    order_contents = {'신규주문':True, '매도수구분':mesu_medo_type, '익절틱':profit_tick, '손절틱':loss_tick, '수량':contract_cnt}
    '''
    res.info('##### 주문 예정 #####')
    res.info(order_contents)
    chart.draw(subject_code)
    input()
    '''
    
    return order_contents
Beispiel #3
0
def is_it_sell(subject_code, current_price):

    false = {'신규주문': False}
    try:
        if subject.info[subject_code]['워터폴매매'] == False: return false
        if contract.get_contract_count(subject_code) > 0:
            # 계약 보유중
            # log.debug("종목코드(" + subject_code + ") is_it_sell() / 보유 계약 : " + str(contract.get_contract_count(subject_code)))
            if contract.list[subject_code]['매도수구분'] == '신규매수':
                # 매수일때

                if current_price <= contract.list[subject_code]['손절가']:
                    res.info("워터폴 손절가가 되어 " + str(
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE])
                             + "개 청산 요청.")
                    waterfall_init(subject_code)
                    return {
                        '신규주문':
                        True,
                        '매도수구분':
                        '신규매도',
                        '수량':
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE]
                    }

                elif current_price > contract.list[subject_code]['익절가']:
                    res.info("워터폴 익절가가 되어 " + str(
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE])
                             + "개 청산 요청.")
                    waterfall_init(subject_code)
                    return {
                        '신규주문':
                        True,
                        '매도수구분':
                        '신규매도',
                        '수량':
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE]
                    }

            elif contract.list[subject_code]['매도수구분'] == '신규매도':
                # 매도일때

                if current_price >= contract.list[subject_code]['손절가']:
                    res.info("워터폴 손절가가 되어 " + str(
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE])
                             + "개 청산 요청.")
                    waterfall_init(subject_code)
                    return {
                        '신규주문':
                        True,
                        '매도수구분':
                        '신규매수',
                        '수량':
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE]
                    }

                elif current_price < contract.list[subject_code]['익절가']:
                    res.info("워터폴 익절가가 되어 " + str(
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE])
                             + "개 청산 요청.")
                    waterfall_init(subject_code)
                    return {
                        '신규주문':
                        True,
                        '매도수구분':
                        '신규매수',
                        '수량':
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE]
                    }

    except Exception as err:
        log.error(err)

    return {'신규주문': False}
Beispiel #4
0
def calculate(subject_code):
    init_af = subject.info[subject_code]['init_af']
    af = subject.info[subject_code]['af']
    max_af = subject.info[subject_code]['maxaf']
        
    '''
    # Difference of High and Low
    differences = []
    for idx in range(0, len(list['현재가'])):
        differences.append(list['고가'][idx] - list['저가'][idx])
    
    # STDEV of differences
    stDev = self.standard_deviation(list)
    sarArr = [None] * len(list['현재가'])

    # Find first non-NA value
    beg = 1;
    for idx in range(0, len(list['현재가'])):
        if list['고가'][idx] == 0 or list['저가'][idx] == 0:
            sarArr[idx] = 0
            beg += 1
        else:
            break
    '''        
    # Initialize values needed by the routine
    sig0 = subject.info[subject_code]['flow']
    sig1 = subject.info[subject_code]['flow']
    ep = subject.info[subject_code]['ep']
    prev_sar = subject.info[subject_code]['sar']
    
    # Local extreme
    lmin = min(calc.data[subject_code]['저가'][-2], calc.data[subject_code]['저가'][-1])
    lmax = max(calc.data[subject_code]['고가'][-2], calc.data[subject_code]['고가'][-1])

    #res.info('시가: ' + str(list['시가'][-1]) + ' 고가: ' + str(list['고가'][-1]) + ' 저가: ' + str(list['저가'][-1]) + ' 현재가: ' + str(list['현재가'][-1]))
    # Create signal and extreme price vectors
    if sig1 == '상향':
        # Previous buy signal
        new_sar = prev_sar + (ep - prev_sar) * af;

        if calc.data[subject_code]['저가'][-1] >= new_sar:
            sig0 = '상향'
        else:
            sig0 = '하향'    # New signal
            res.info('상향->하향 반전, list[저가][-1] = ' + str(calc.data[subject_code]['저가'][-1]) + ', sarArr[-1] = ' + str(new_sar))
            res.info('체결시간(' + str(calc.data[subject_code]['체결시간'][-1])[-6:-4] + ':' + str(calc.data[subject_code]['체결시간'][-1])[-4:-2] + ':' + str(calc.data[subject_code]['체결시간'][-1])[-2:] + ')')
        subject.info[subject_code]['ep'] = max(lmax, ep)  # New extreme price
        
    else:
        # Previous sell signal
        new_sar = prev_sar + (ep - prev_sar) * af;
        if calc.data[subject_code]['고가'][-1] < new_sar:
            sig0 = '하향'
        else:
            sig0 = '상향'   # New signal
            res.info('하향->상향 반전, list[고가][-1] = ' + str(calc.data[subject_code]['고가'][-1]) + ', sarArr[-1] = ' + str(new_sar))
            res.info('체결시간(' + str(calc.data[subject_code]['체결시간'][-1])[-6:-4] + ':' + str(calc.data[subject_code]['체결시간'][-1])[-4:-2] + ':' + str(calc.data[subject_code]['체결시간'][-1])[-2:] + ')')
        subject.info[subject_code]['ep'] = min(lmin, ep)  # New extreme price

    # Calculate acceleration factor (af) and stop-and-reverse (sar) vector
            
    # No signal change
    if sig0 == sig1:
        # Initial calculations 
        new_sar = prev_sar + (ep - prev_sar) * af;
        
        # Current buy signal 
        if sig0 == '상향':
            if subject.info[subject_code]['ep'] > ep:
                subject.info[subject_code]['af'] = min(max_af, af + init_af)

            if new_sar > lmin:
                new_sar = lmin  # Determine sar value
                    
        # Current sell signal
        else:
            if subject.info[subject_code]['ep'] < ep:
                subject.info[subject_code]['af'] = min(max_af, af + init_af)
                    
            if new_sar <= lmax:
                new_sar = lmax  # Determine sar value
            
    else: # New signal
        subject.info[subject_code]['af'] = subject.info[subject_code]['init_af']   # reset acceleration factor */
        subject.info[subject_code]['flow'] = sig0
        '''
        if sig0 == '상향':
            subject.info[subject_code]['ep'] = lmax
            new_sar = lmin
        else:
            subject.info[subject_code]['ep'] = lmin
            new_sar = lmax
        '''
        new_sar = subject.info[subject_code]['ep']  # set sar value
    
    res.info('캔들(' + str(calc.data[subject_code]['체결시간'][-1]) + '), SAR = ' + str(new_sar))
    #subject.info[subject_code]['sar'] = round(new_sar, subject.info[subject_code]['자릿수'])
    subject.info[subject_code]['sar'] = new_sar
Beispiel #5
0
def is_it_sell(subject_code, current_price):
    index = calc.data[subject_code]['idx']

    # if 1446 < get_time(0, subject_code) < 1447:
    # log.info('%s : current_price : %s sar : %s' % (str(calc.data[subject_code]['체결시간'][-1])[4:14], current_price, subject.info[subject_code]['sar']))

    try:
        #first_chungsan = 70
        first_chungsan = subject.info[subject_code]['1차청산틱']
        first_chungsan_dribble = 2

        second_chungsan = 999
        second_chungsan_dribble = 15

        sar_before_reverse_tic = 0

        # log.debug("종목코드(" + subject_code + ") is_it_sell() 진입.")
        # log.debug("종목코드(" + subject_code + ") 현재 Flow : " + subject.info[subject_code]['flow'] + " / SAR : " + str(subject.info[subject_code]['sar']))
        if contract.get_contract_count(subject_code) > 0:
            # 계약 보유중
            # log.debug("종목코드(" + subject_code + ") is_it_sell() / 보유 계약 : " + str(contract.get_contract_count(subject_code)))
            if contract.list[subject_code]['매도수구분'] == '신규매수':
                # 매수일때
                if subject.info[subject_code]['반대매매'] == True:
                    if current_price <= float(
                            contract.list[subject_code]['체결가']) - (
                                subject.info[subject_code]['리버스손절틱'] *
                                subject.info[subject_code]['단위']):
                        res.info("반대매매 리버스 손절가가 되어 " +
                                 str(contract.list[subject_code]['계약타입'][
                                     contract.SAFE] +
                                     contract.list[subject_code]['계약타입'][
                                         contract.DRIBBLE]) + "개 청산 요청.")
                        return {
                            '신규주문':
                            True,
                            '매도수구분':
                            '신규매도',
                            '수량':
                            contract.list[subject_code]['계약타입'][contract.SAFE]
                            + contract.list[subject_code]['계약타입'][
                                contract.DRIBBLE]
                        }

                if calc.data[subject_code]['현재플로우최극가'] - (
                        subject.info[subject_code]['손절틱'] *
                        subject.info[subject_code]['단위']) > current_price:
                    res.info("손절가가 되어 " + str(
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE])
                             + "개 청산 요청.")
                    return {
                        '신규주문':
                        True,
                        '매도수구분':
                        '신규매도',
                        '수량':
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE]
                    }

                elif current_price <= contract.list[subject_code]['손절가']:

                    if contract.get_contract_count(
                            subject_code
                    ) == subject.info[subject_code]['신규매매수량']:
                        # 1차 청산일 때

                        # contract_num = int((contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) / 2)
                        contract_num = int(
                            (contract.list[subject_code]['계약타입'][contract.SAFE]
                             + contract.list[subject_code]['계약타입'][
                                 contract.DRIBBLE]))
                        if contract_num < 1: return {'신규주문': False}
                        res.info("손절가가 되어 " + str(contract_num) +
                                 "개 청산 요청. 현재가:%s, 손절가:%s" %
                                 (current_price,
                                  contract.list[subject_code]['손절가']))
                        contract.list[subject_code]['손절가'] = current_price - subject.info[subject_code]['손절틱'] * \
                                                             subject.info[subject_code]['단위']
                        return {
                            '신규주문': True,
                            '매도수구분': '신규매도',
                            '수량': contract_num
                        }
                    else:
                        # 1차 청산 이후 청산일 때
                        res.info("손절가가 되어 " +
                                 str(contract.list[subject_code]['계약타입'][
                                     contract.SAFE] +
                                     contract.list[subject_code]['계약타입'][
                                         contract.DRIBBLE]) + "개 청산 요청.")
                        return {
                            '신규주문':
                            True,
                            '매도수구분':
                            '신규매도',
                            '수량':
                            contract.list[subject_code]['계약타입'][contract.SAFE]
                            + contract.list[subject_code]['계약타입'][
                                contract.DRIBBLE]
                        }
                elif calc.data[subject_code]['플로우'][
                        -1] == '상향' and subject.info[subject_code][
                            'sar'] > current_price:
                    if subject.info[subject_code]['반대매매'] == False:
                        res.info("하향 반전되어 " + str(contract.list[subject_code]
                                                  ['계약타입'][contract.SAFE] +
                                                  contract.list[subject_code]
                                                  ['계약타입'][contract.DRIBBLE]) +
                                 "개 청산 요청. 현재가:%s" % current_price)
                        return {
                            '신규주문':
                            True,
                            '매도수구분':
                            '신규매도',
                            '수량':
                            contract.list[subject_code]['계약타입'][contract.SAFE]
                            + contract.list[subject_code]['계약타입'][
                                contract.DRIBBLE]
                        }

                elif calc.data[subject_code]['플로우'][
                        -1] == '하향' and subject.info[subject_code][
                            'sar'] < current_price:
                    if subject.info[subject_code]['반대매매'] == True:
                        res.info("상향 반전되어 " + str(contract.list[subject_code]
                                                  ['계약타입'][contract.SAFE] +
                                                  contract.list[subject_code]
                                                  ['계약타입'][contract.DRIBBLE]) +
                                 "개 청산 요청. 현재가:%s" % current_price)
                        return {
                            '신규주문':
                            True,
                            '매도수구분':
                            '신규매도',
                            '수량':
                            contract.list[subject_code]['계약타입'][contract.SAFE]
                            + contract.list[subject_code]['계약타입'][
                                contract.DRIBBLE]
                        }

                ##heejun add 18.01.27
                elif subject.info[subject_code]['flow'] == '하향' and calc.data[subject_code]['플로우'][-2] == '상향' and \
                        subject.info[subject_code]['반대매매'] == False \
                        and subject.info[subject_code]['sar'] > current_price:
                    res.info("청산 타이밍 한번 놓쳤습니다.")
                    subject.info[subject_code]['체결미스'] = True
                    res.info("하향 반전되어 " + str(
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE])
                             + "개 청산 요청. 현재가:%s" % current_price)
                    return {
                        '신규주문':
                        True,
                        '매도수구분':
                        '신규매도',
                        '수량':
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE]
                    }

                ##

                elif current_price > contract.list[subject_code]['익절가']:
                    contract.list[subject_code]['익절가'] = current_price + subject.info[subject_code]['익절틱'] * \
                                                         subject.info[subject_code]['단위']
                    # contract.list[subject_code]['손절가'] = current_price - subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위']
                    contract.list[subject_code]['손절가'] = current_price - subject.info[subject_code]['손절틱'] * \
                                                         subject.info[subject_code]['단위']
                    log.info("종목코드(" + subject_code + ") 익절가 갱신.")
                elif current_price - float(contract.list[subject_code]['체결가']) >= first_chungsan * \
                        subject.info[subject_code]['단위'] and contract.get_contract_count(subject_code) == \
                        subject.info[subject_code]['신규매매수량']:
                    if contract.list[subject_code]['손절가'] < current_price - first_chungsan_dribble * \
                            subject.info[subject_code]['단위']:
                        contract.list[subject_code][
                            '손절가'] = current_price - first_chungsan_dribble * subject.info[
                                subject_code]['단위']
                        contract.list[subject_code]['손절가'] = round(
                            contract.list[subject_code]['손절가'],
                            subject.info[subject_code]['자릿수'])

                        res.info(
                            "1차 청산 드리블 중 %s, 현재가: %s ,시간: %s" %
                            (contract.list[subject_code]['손절가'], current_price,
                             str(calc.data[subject_code]['체결시간'][-1])[8:14]))
                        log.info(
                            "1차 청산 드리블 중 %s, 현재가: %s, 시간: %s" %
                            (contract.list[subject_code]['손절가'], current_price,
                             str(calc.data[subject_code]['체결시간'][-1])[8:14]))
                elif current_price - float(contract.list[subject_code]['체결가']) >= second_chungsan * \
                        subject.info[subject_code]['단위'] and contract.get_contract_count(subject_code) == int(
                    subject.info[subject_code]['신규매매수량'] - int(subject.info[subject_code]['신규매매수량'] / 2)):
                    if contract.list[subject_code]['손절가'] < current_price - second_chungsan_dribble * \
                            subject.info[subject_code]['단위']:
                        contract.list[subject_code][
                            '손절가'] = current_price - second_chungsan_dribble * subject.info[
                                subject_code]['단위']

                        res.info("2차 청산 드리블 중 %s" %
                                 contract.list[subject_code]['손절가'])
                        log.info("2차 청산 드리블 중 %s" %
                                 contract.list[subject_code]['손절가'])
                        # return {'신규주문':True, '매도수구분':'신규매도', '수량':int((contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]+1)/2)}
            elif contract.list[subject_code]['매도수구분'] == '신규매도':
                # 매도일때
                if subject.info[subject_code]['반대매매'] == True:
                    if current_price >= float(
                            contract.list[subject_code]['체결가']) + (
                                subject.info[subject_code]['리버스손절틱'] *
                                subject.info[subject_code]['단위']):
                        res.info("반대매매 리버스 손절가가 되어 " +
                                 str(contract.list[subject_code]['계약타입'][
                                     contract.SAFE] +
                                     contract.list[subject_code]['계약타입'][
                                         contract.DRIBBLE]) + "개 청산 요청.")
                        return {
                            '신규주문':
                            True,
                            '매도수구분':
                            '신규매수',
                            '수량':
                            contract.list[subject_code]['계약타입'][contract.SAFE]
                            + contract.list[subject_code]['계약타입'][
                                contract.DRIBBLE]
                        }

                if calc.data[subject_code]['현재플로우최극가'] + (
                        subject.info[subject_code]['손절틱'] *
                        subject.info[subject_code]['단위']) < current_price:
                    res.info("손절가가 되어 " + str(
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE])
                             + "개 청산 요청.")
                    return {
                        '신규주문':
                        True,
                        '매도수구분':
                        '신규매수',
                        '수량':
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE]
                    }

                elif current_price >= contract.list[subject_code]['손절가']:

                    if contract.get_contract_count(
                            subject_code
                    ) == subject.info[subject_code]['신규매매수량']:
                        # 1차 청산일 때

                        # contract_num = int((contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) / 2)
                        contract_num = int(
                            (contract.list[subject_code]['계약타입'][contract.SAFE]
                             + contract.list[subject_code]['계약타입'][
                                 contract.DRIBBLE]))
                        if contract_num < 1: return {'신규주문': False}
                        res.info("손절가가 되어 " + str(contract_num) +
                                 "개 청산 요청. 현재가:%s, 손절가:%s" %
                                 (current_price,
                                  contract.list[subject_code]['손절가']))
                        contract.list[subject_code]['손절가'] = current_price + subject.info[subject_code]['손절틱'] * \
                                                             subject.info[subject_code]['단위']
                        return {
                            '신규주문': True,
                            '매도수구분': '신규매수',
                            '수량': contract_num
                        }
                    else:
                        # 1차 청산 이후 청산 일 때
                        res.info("손절가가 되어 " +
                                 str(contract.list[subject_code]['계약타입'][
                                     contract.SAFE] +
                                     contract.list[subject_code]['계약타입'][
                                         contract.DRIBBLE]) + "개 청산 요청.")
                        return {
                            '신규주문':
                            True,
                            '매도수구분':
                            '신규매수',
                            '수량':
                            contract.list[subject_code]['계약타입'][contract.SAFE]
                            + contract.list[subject_code]['계약타입'][
                                contract.DRIBBLE]
                        }

                elif calc.data[subject_code]['플로우'][
                        -1] == '하향' and subject.info[subject_code][
                            'sar'] < current_price:
                    if subject.info[subject_code]['반대매매'] == False:
                        res.info("상향 반전되어 " + str(contract.list[subject_code]
                                                  ['계약타입'][contract.SAFE] +
                                                  contract.list[subject_code]
                                                  ['계약타입'][contract.DRIBBLE]) +
                                 "개 청산 요청. 현재가: %s" % current_price)
                        return {
                            '신규주문':
                            True,
                            '매도수구분':
                            '신규매수',
                            '수량':
                            contract.list[subject_code]['계약타입'][contract.SAFE]
                            + contract.list[subject_code]['계약타입'][
                                contract.DRIBBLE]
                        }

                elif calc.data[subject_code]['플로우'][
                        -1] == '상향' and subject.info[subject_code][
                            'sar'] > current_price:
                    if subject.info[subject_code]['반대매매'] == True:
                        res.info("하향 반전되어 " + str(contract.list[subject_code]
                                                  ['계약타입'][contract.SAFE] +
                                                  contract.list[subject_code]
                                                  ['계약타입'][contract.DRIBBLE]) +
                                 "개 청산 요청. 현재가:%s" % current_price)
                        return {
                            '신규주문':
                            True,
                            '매도수구분':
                            '신규매수',
                            '수량':
                            contract.list[subject_code]['계약타입'][contract.SAFE]
                            + contract.list[subject_code]['계약타입'][
                                contract.DRIBBLE]
                        }

                ##heejun add 18.01.27
                elif subject.info[subject_code]['flow'] == '상향' and calc.data[subject_code]['플로우'][-2] == '하향' and \
                        subject.info[subject_code]['반대매매'] == False \
                        and subject.info[subject_code]['sar'] < current_price:
                    res.info("청산 타이밍 한번 놓쳤습니다.")
                    subject.info[subject_code]['체결미스'] = True
                    res.info("상향 반전되어 " + str(
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE])
                             + "개 청산 요청. 현재가:%s" % current_price)
                    return {
                        '신규주문':
                        True,
                        '매도수구분':
                        '신규매수',
                        '수량':
                        contract.list[subject_code]['계약타입'][contract.SAFE] +
                        contract.list[subject_code]['계약타입'][contract.DRIBBLE]
                    }
                ##

                elif current_price < contract.list[subject_code]['익절가']:
                    contract.list[subject_code]['익절가'] = current_price - subject.info[subject_code]['익절틱'] * \
                                                         subject.info[subject_code]['단위']
                    # contract.list[subject_code]['손절가'] = current_price + subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위']
                    contract.list[subject_code]['손절가'] = current_price + subject.info[subject_code]['손절틱'] * \
                                                         subject.info[subject_code]['단위']
                    log.debug("종목코드(" + subject_code + ") 익절가 갱신.")
                elif (float(contract.list[subject_code]['체결가']) - current_price) >= first_chungsan * \
                        subject.info[subject_code]['단위'] and contract.get_contract_count(subject_code) == \
                        subject.info[subject_code]['신규매매수량']:  # int(contract.get_contract_count(subject_code) / 2) > 0:
                    if contract.list[subject_code]['손절가'] > current_price + first_chungsan_dribble * \
                            subject.info[subject_code]['단위']:
                        contract.list[subject_code]['손절가'] = current_price + first_chungsan_dribble * \
                                                             subject.info[subject_code]['단위']
                        contract.list[subject_code]['손절가'] = round(
                            contract.list[subject_code]['손절가'],
                            subject.info[subject_code]['자릿수'])
                        res.info(
                            "1차 청산 드리블 중 %s, 현재가: %s ,시간: %s" %
                            (contract.list[subject_code]['손절가'], current_price,
                             str(calc.data[subject_code]['체결시간'][-1])[8:14]))
                        log.info(
                            "1차 청산 드리블 중 %s, 현재가: %s, 시간: %s" %
                            (contract.list[subject_code]['손절가'], current_price,
                             str(calc.data[subject_code]['체결시간'][-1])[8:14]))
                elif (float(contract.list[subject_code]['체결가']) - current_price) >= second_chungsan * \
                        subject.info[subject_code]['단위'] and contract.get_contract_count(subject_code) == int(
                    subject.info[subject_code]['신규매매수량'] - int(subject.info[subject_code]['신규매매수량'] / 2)):
                    if contract.list[subject_code]['손절가'] > current_price + second_chungsan_dribble * \
                            subject.info[subject_code]['단위']:
                        contract.list[subject_code]['손절가'] = current_price + second_chungsan_dribble * \
                                                             subject.info[subject_code]['단위']
                        res.info("2차 청산 드리블 중 %s" %
                                 contract.list[subject_code]['손절가'])
                        log.info("2차 청산 드리블 중 %s" %
                                 contract.list[subject_code]['손절가'])
                        # return {'신규주문':True, '매도수구분':'신규매수', '수량':int((contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]+1)/2)}

    except Exception as err:
        log.error(err)

    return {'신규주문': False}
def is_it_OK(subject_code, current_price):
    global previous_profit
    global temp_index
    start_price = subject.info[subject_code]['시가']
    profit = 0
    profit_tick = subject.info[subject_code]['익절틱']
    sonjal_tick = subject.info[subject_code]['손절틱']
    mesu_medo_type = None
    false = {'신규주문': False}
    ma_line_is_true = True
    reverse_tic = subject.info[subject_code]['반대매매틱']

    # 300캔들이 없으면 매매 안함
    if calc.data[subject_code]['idx'] < 300:
        return false

    if subject.info[subject_code]['상태'] == '매수중' or subject.info[subject_code]['상태'] == '매도중' or \
                    subject.info[subject_code]['상태'] == '청산시도중' or subject.info[subject_code]['상태'] == '매매시도중':
        log.debug('신규 주문 가능상태가 아니므로 매매 불가. 상태 : ' + subject.info[subject_code]['상태'])
        return false

    # log.debug("종목코드(" + subject_code + ")  현재 Flow : " + subject.info[subject_code]['flow'] + " / SAR : " + str(subject.info[subject_code]['sar']) + " / 추세 : " + my_util.is_sorted(subject_code))
    # 여기서 상향/하향계산은 2개로 나뉨 1. 캐들만들고 있을때~! 2. 캔들 완성시!!
    # calc를 통해서 calc.push -> calc를 통해 여러가지 계산을 하는데 이때 flow를 저장 즉, 실데이터가 딱 들어오면 바로 계산끝
    if subject.info[subject_code]['flow'] == '상향':
        if current_price < subject.info[subject_code]['sar']:
            # 여기에 들어온건 상향일때 현재가격이 sar보다 작아져 하향반전을 이룰때
            log.debug("종목코드(" + subject_code + ") 하향 반전.")
            profit = current_price - calc.data[subject_code]['이전반전시SAR값'][-1]
            if len(calc.data[subject_code]['SAR반전시간']) > 0 and calc.data[subject_code]['SAR반전시간'][-1] == \
                    calc.data[subject_code]['체결시간'][-1]:  # 반전 후 SAR로 갱신되었다면
                profit = current_price - calc.data[subject_code]['이전반전시SAR값'][-2]

            if my_util.is_sorted(subject_code) == '하락세':
                mesu_medo_type = '신규매도'
            else:
                res.info("이동평균선이 맞지 않아 매수 포기합니다.")
                ma_line_is_true = False
                mesu_medo_type = '신규매도'
                # return false

        elif calc.data[subject_code]['플로우'][-2] == '하향':
            # 하향으로 진행하던 플로가 상향으로 상향 반전될때! ex)리스트[-1]은 리스트의 가장 마지막 항목이다
            log.debug("종목코드(" + subject_code + ") 상향 반전.")
            profit = calc.data[subject_code]['이전반전시SAR값'][-1] - current_price
            if len(calc.data[subject_code]['SAR반전시간']) > 0 and calc.data[subject_code]['SAR반전시간'][-1] == \
                    calc.data[subject_code]['체결시간'][-1]:  # 반전 후 SAR로 갱신되었다면
                profit = calc.data[subject_code]['이전반전시SAR값'][-2] - current_price

            if my_util.is_sorted(subject_code) == '상승세':
                mesu_medo_type = '신규매수'

            else:
                res.info("이동평균선이 맞지 않아 매수 포기합니다.")
                ma_line_is_true = False
                mesu_medo_type = '신규매수'
                # return false
        else:
            return false

    elif subject.info[subject_code]['flow'] == '하향':
        if current_price > subject.info[subject_code]['sar']:
            log.debug("종목코드(" + subject_code + ") 상향 반전.")
            profit = calc.data[subject_code]['이전반전시SAR값'][-1] - current_price
            if len(calc.data[subject_code]['SAR반전시간']) > 0 and calc.data[subject_code]['SAR반전시간'][-1] == \
                    calc.data[subject_code]['체결시간'][-1]:  # 반전 후 SAR로 갱신되었다면
                profit = calc.data[subject_code]['이전반전시SAR값'][-2] - current_price

            if my_util.is_sorted(subject_code) == '상승세':
                mesu_medo_type = '신규매수'

            else:
                res.info("이동평균선이 맞지 않아 매수 포기합니다.")
                ma_line_is_true = False
                mesu_medo_type = '신규매수'
                # return false

        elif calc.data[subject_code]['플로우'][-2] == '상향':
            log.debug("종목코드(" + subject_code + ") 하향 반전.")
            profit = current_price - calc.data[subject_code]['이전반전시SAR값'][-1]
            if len(calc.data[subject_code]['SAR반전시간']) > 0 and calc.data[subject_code]['SAR반전시간'][-1] == \
                    calc.data[subject_code]['체결시간'][-1]:  # 반전 후 SAR로 갱신되었다면
                profit = current_price - calc.data[subject_code]['이전반전시SAR값'][-2]

            if my_util.is_sorted(subject_code) == '하락세':
                mesu_medo_type = '신규매도'

            else:
                res.info("이동평균선이 맞지 않아 매수 포기합니다.")
                ma_line_is_true = False
                mesu_medo_type = '신규매도'
                # return false
        else:
            return false
    else:
        return false

    profit = profit / subject.info[subject_code]['단위']

    if len(subject.info[subject_code]['맞틀리스트']) < 5:
        return false

    if subject.info[subject_code]['반대매매'] == True:
        subject.info[subject_code]['반대매매'] = False
        log.info("반대대대 False로 변경.")

    if len(calc.data[subject_code]['SAR반전시간']) > 0 and calc.data[subject_code]['SAR반전시간'][-1] == \
            calc.data[subject_code]['체결시간'][-1]:  # 반전 후 SAR로 갱신되었다면

        if subject.info[subject_code]['맞틀리스트'][-2] == '맞' and subject.info[subject_code]['맞틀리스트'][-1] == '틀':
            if subject.info[subject_code]['수익리스트'][-2] > 70:
                log.info("지지난 플로우가 70이상 수익으로 진입안합니다.")
                return false
            else:
                pass

        if subject.info[subject_code]['수익리스트'][-1] > 160:
            if mesu_medo_type == '신규매도':
                mesu_medo_type = '신규매수'
            elif mesu_medo_type == '신규매수':
                mesu_medo_type = '신규매도'
            log.info("[%s] 반대매매 조건이 맞아 반대 매매 진입합니다.(전 플로우 160틱 이상 수익)(1)" % mesu_medo_type)
            ma_line_is_true = True
            subject.info[subject_code]['반대매매'] = True

        elif subject.info[subject_code]['맞틀리스트'][-4:] == ['틀','틀', '틀', '틀']:
            if subject.info[subject_code]['수익리스트'][-2] < subject.info[subject_code]['수익리스트'][-1] and subject.info[subject_code]['수익리스트'][-2] < -15:
                log.info("틀틀틀틀일때 조건이 맞지 않아 진입 안합니다.")
                return false
            else:
                log.info("틀틀틀틀 다음으로 매매 진입합니다.")
                pass

        elif subject.info[subject_code]['맞틀리스트'][-4:] == ['틀','맞', '맞', '틀']:
            log.info("틀맞맞틀 다음으로 매매 진입합니다.")
            pass

        elif subject.info[subject_code]['맞틀리스트'][-4:] == ['틀','맞', '틀', '틀']:
            log.info("틀맞틀틀 다음으로 매매 진입합니다.")
            pass

        elif subject.info[subject_code]['맞틀리스트'][-4:] == ['맞','틀', '틀', '맞']:
            if subject.info[subject_code]['수익리스트'][-1] > 10:
                log.info("이전 플로우 수익이 10틱 이상으로 매매 진입 안합니다.")
                return false
            else:
                log.info("맞틀틀맞 다음으로 매매 진입합니다.")
                pass

        elif subject.info[subject_code]['맞틀리스트'][-4:] == ['틀', '틀', '틀', '맞']:
            if subject.info[subject_code]['수익리스트'][-3] < -10:
                log.info("이전 플로우 수익이 10틱 이하로 매매 진입 안합니다.")
                return false
            else:
                log.info("틀틀틀맞 다음으로 매매 진입합니다.")
                pass

        elif subject.info[subject_code]['맞틀리스트'][-4:] == ['맞', '맞', '맞', '틀']:
            log.info("맞맞맞틀 다음으로 매매 진입합니다.")
            pass

        elif subject.info[subject_code]['맞틀리스트'][-4:] == ['틀', '틀', '맞', '맞']:
            log.info("틀틀맞맞 다음으로 매매 진입합니다.")
            pass

        elif subject.info[subject_code]['맞틀리스트'][-4:] == ['맞', '맞', '틀', '틀']:
            if subject.info[subject_code]['수익리스트'][-4] < subject.info[subject_code]['수익리스트'][-3]:
                log.info("맞맞틀틀일때 조건이 맞지 않아 진입 안합니다.")
                return false
            else:
                log.info("맞맞틀틀 다음으로 매매 진입합니다.")
                pass

        elif subject.info[subject_code]['맞틀리스트'][-4:] == ['맞', '틀', '틀', '틀']:
            if subject.info[subject_code]['수익리스트'][-2] < -10:
                log.info("맞틀틀틀일때 조건이 맞지 않아 진입 안합니다.")
                return false
            else:
                log.info("맞틀틀틀 다음으로 매매 진입합니다.")
                pass

        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '맞', '틀']:
            if subject.info[subject_code]['수익리스트'][-2] > 70:
                log.info("지지난 플로우가 70이상 수익으로 진입안합니다.")
                return false
            else:
                log.info("틀맞틀 다음으로 매매 진입합니다.")
                pass

        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['맞', '틀', '맞'] and profit > reverse_tic:
            if mesu_medo_type == '신규매도':
                mesu_medo_type = '신규매수'
            elif mesu_medo_type == '신규매수':
                mesu_medo_type = '신규매도'
            log.info("[%s] 반대매매 조건이 맞아 반대 매매 진입합니다." % mesu_medo_type)
            ma_line_is_true = True
            subject.info[subject_code]['반대매매'] = True

        else:
            log.info("맞틀 조건이 맞지 않아 매매 포기합니다.")
            return false

    else:

        if subject.info[subject_code]['맞틀리스트'][-1] == '맞' and profit < 0:
            if subject.info[subject_code]['수익리스트'][-1] > 70:
                log.info("지지난 플로우가 70이상 수익으로 진입안합니다.")
                return false
            else:
                pass

        if profit > 160:
            if mesu_medo_type == '신규매도':
                mesu_medo_type = '신규매수'
            elif mesu_medo_type == '신규매수':
                mesu_medo_type = '신규매도'
            log.info("[%s] 반대매매 조건이 맞아 반대 매매 진입합니다.(전 플로우 160틱 이상 수익)4" % mesu_medo_type)
            ma_line_is_true = True
            subject.info[subject_code]['반대매매'] = True

        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '틀', '틀'] and profit < 0:
            if subject.info[subject_code]['수익리스트'][-1] < profit and subject.info[subject_code]['수익리스트'][-1] < -15:
                log.info("틀틀틀틀일때 조건이 맞지 않아 진입 안합니다.")
                return false
            else:
                log.info("틀틀틀틀 다음으로 매매 진입합니다.")
                pass

        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '맞', '맞'] and profit < 0:
            log.info("틀맞맞틀 다음으로 매매 진입합니다.")
            pass

        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '맞', '틀'] and profit < 0:
            log.info("틀맞틀틀 다음으로 매매 진입합니다.")
            pass

        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['맞', '틀', '틀'] and profit > 0:
            if profit > 10:
                log.info("이전 플로우 수익이 10틱 이상으로 매매 진입 안합니다.")
                return false
            else:
                log.info("맞틀틀맞 다음으로 매매 진입합니다.")
                pass

        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '틀', '틀'] and profit > 0:
            if subject.info[subject_code]['수익리스트'][-2] < -10:
                log.info("이전 플로우 수익이 10틱 이하로 매매 진입 안합니다.")
                return false
            else:
                log.info("틀틀틀맞 다음으로 매매 진입합니다.")
                pass


        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['맞', '맞', '맞'] and profit < 0:
            log.info("맞맞맞틀 다음으로 매매 진입합니다.")
            pass

        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '틀', '맞'] and profit > 0:
            log.info("틀틀맞맞 다음으로 매매 진입합니다.")
            pass

        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['맞','맞', '틀'] and profit < 0:
            if subject.info[subject_code]['수익리스트'][-3] < subject.info[subject_code]['수익리스트'][-2]:
                log.info("맞맞틀틀일때 조건이 맞지 않아 진입 안합니다.")
                return false
            else:
                log.info("맞맞틀틀 다음으로 매매 진입합니다.")
                pass

        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['맞', '틀', '틀'] and profit < 0:
            if subject.info[subject_code]['수익리스트'][-1] < -10:
                log.info("맞틀틀틀일때 조건이 맞지 않아 진입 안합니다.")
                return false
            else:
                log.info("맞틀틀틀 다음으로 매매 진입합니다.")
                pass

        elif subject.info[subject_code]['맞틀리스트'][-2:] == ['틀', '맞'] and profit < 0:
            if subject.info[subject_code]['수익리스트'][-1] > 70:
                log.info("지지난 플로우가 70이상 수익으로 진입안합니다.")
                return false
            else:
                log.info("틀맞틀 다음으로 매매 진입합니다.")
                pass


        elif subject.info[subject_code]['맞틀리스트'][-2:] == ['맞', '틀'] and profit > reverse_tic:
            if mesu_medo_type == '신규매도':
                mesu_medo_type = '신규매수'
            elif mesu_medo_type == '신규매수':
                mesu_medo_type = '신규매도'
            log.info("[%s] 반대매매 조건이 맞아 반대 매매 진입합니다." % mesu_medo_type)
            ma_line_is_true = True
            subject.info[subject_code]['반대매매'] = True


        else:
            log.info("맞틀 조건이 맞지 않아 매매 포기합니다.")
            return false

    if ma_line_is_true == False: return false

    #if get_time(0, subject_code) > 2100 and get_time(0, subject_code) < 2230 and subject.info[subject_code][
    #    '반대매매'] == False:
    #    log.info("21:00~22:30 시 사이라 매매 포기 합니다.")
    #    return false
    if d.get_mode() == d.REAL:  # 실제 투자 할때
        if get_time(0, subject_code) > 2200 and get_time(0, subject_code) < 2330 and subject.info[subject_code]['반대매매'] == False:
            log.info("21:00~22:30 시 사이라 매매 포기 합니다.")
            return false
        elif get_time(0, subject_code) == int(subject.info[subject_code]['시작시간']) or get_time(0, subject_code) == int(
                subject.info[subject_code]['마감시간']):
            log.info("장 시작 시간, 마감 시간 정각에 매매하지 않습니다. 매매금지")
            return false
    else:
        if subject == "GCG18":
            if get_time(0, subject_code) > 2200 and get_time(0, subject_code) < 2330 and subject.info[subject_code]['반대매매'] == False:
                log.info("21:00~22:30 시 사이라 매매 포기 합니다.")
                return false
        else:
            if get_time(0, subject_code) > 2100 and get_time(0, subject_code) < 2230 and subject.info[subject_code]['반대매매'] == False:
                log.info("21:00~22:30 시 사이라 매매 포기 합니다.")
                return false
        if get_time(0, subject_code) == int(subject.info[subject_code]['시작시간']) or get_time(0, subject_code) == int(
            subject.info[subject_code]['마감시간']):
            log.info("장 시작 시간, 마감 시간 정각에 매매하지 않습니다. 매매금지")
            return false




    if d.get_mode() == d.REAL:  # 실제 투자 할때
        possible_contract_cnt = int(contract.my_deposit / subject.info[subject_code]['위탁증거금'])
        log.info("possible_contract_cnt %s개 입니다." % possible_contract_cnt)
        contract_cnt = int(contract.my_deposit / 1.2 / subject.info[subject_code]['위탁증거금'])
        log.info("contract_cnt %s개 입니다." % contract_cnt)
        if contract.recent_trade_cnt == possible_contract_cnt:
            contract_cnt = possible_contract_cnt
        log.info("매매 예정 수량은 %s개 입니다." % contract_cnt)
        if contract_cnt == 0:
            contract_cnt = 2
        #
        contract_cnt = 2


    else:
        contract_cnt = 2  # 테스트 돌릴때

    if contract_cnt > 1:
        subject.info[subject_code]['신규매매수량'] = contract_cnt
    elif contract_cnt == 1:
        subject.info[subject_code]['신규매매수량'] = 2

    # heejun add `17.8.16
    number_of_current_contract = int(contract.get_contract_count(subject_code))
    if number_of_current_contract > 0 and subject.info[subject_code]['반대매매'] == False:
        return false  # 계약을 가지고 있으면서 반대매매가 아니면 추가매매 금지

    if subject.info[subject_code]['반대매매'] == True:  # 만약 1계약이 1차 청산되고 1계약만 드리블 중 반전되었다면 나머지 한계약만 추가 리버스파라 매매 진입
        contract_cnt = contract_cnt - number_of_current_contract
        log.debug("반대매매 True 로 계약수 조정, 계약수: %s개" % contract_cnt)
    ######################

    log.debug("종목코드(" + subject_code + ") 신규 매매 계약 수 " + str(contract_cnt))

    ######
    #contract_cnt = 0
    if contract_cnt == 0: return false


    order_contents = {'신규주문': True, '매도수구분': mesu_medo_type, '익절틱': profit_tick, '손절틱': sonjal_tick, '수량': contract_cnt}
    subject.info[subject_code]['주문내용'] = order_contents
    log.debug('para.is_it_OK() : 모든 구매조건 통과.')
    log.debug(order_contents)
    return order_contents