示例#1
0
def send_order(contract_type,
               subject_code,
               contract_cnt,
               order_type,
               current_price=None):
    order_info = {}

    log.info("sned_order() current_price:%s" % current_price)
    if contract_type == '신규매수':
        order_info['주문번호'] = 0  # 주문번호
        order_info['원주문번호'] = 0  # 원주문번호
        order_info['주문유형'] = 1  # 주문유형(1 : 시장가, 2 : 지정가, 3 : STOP)
        order_info['종목코드'] = subject_code  # 종목코드
        order_info['매도수구분'] = 2  # 매도수구분(1 : 매도, 2 : 매수)
        #print("recnet_price[subject_code]:%s" % recent_price[subject_code])
        order_info['체결표시가격'] = str(
            round(current_price + subject.info[subject_code]['단위'],
                  subject.info[subject_code]['자릿수']))  # 체결표시가격
        if contract.get_contract_count(subject_code) > 0:
            order_info['신규수량'] = 0  # 신규수량
            order_info['청산수량'] = contract_cnt
            order_info['체결수량'] = contract_cnt
        else:
            order_info['신규수량'] = contract_cnt  # 신규수량
            order_info['청산수량'] = 0
            order_info['체결수량'] = contract_cnt
    elif contract_type == '신규매도':
        order_info['주문번호'] = 0  # 주문번호
        order_info['원주문번호'] = 0  # 원주문번호
        order_info['주문유형'] = 1  # 주문유형(1 : 시장가, 2 : 지정가, 3 : STOP)
        order_info['종목코드'] = subject_code  # 종목코드
        order_info['매도수구분'] = 1  # 매도수구분(1 : 매도, 2 : 매수)
        #print("recnet_price[subject_code]:%s" % recent_price[subject_code])
        order_info['체결표시가격'] = str(
            round(current_price - subject.info[subject_code]['단위'],
                  subject.info[subject_code]['자릿수']))  # 체결표시가격
        if contract.get_contract_count(subject_code) > 0:
            order_info['신규수량'] = 0  # 신규수량
            order_info['청산수량'] = contract_cnt
            order_info['체결수량'] = contract_cnt
        else:
            order_info['신규수량'] = contract_cnt  # 신규수량
            order_info['청산수량'] = 0
            order_info['체결수량'] = contract_cnt

    kw.OnReceiveChejanData('1', None, None, order_info)

    return 0
示例#2
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}
def is_it_sell(subject_code, current_price):
    index = calc.data[subject_code]['idx']
    sell_contents = None

    return false

    try:
        if contract.get_contract_count(subject_code) > 0:
            # 계약 보유중
            if contract.list[subject_code]['매도수구분'] == '신규매수':
                #현재가격이 100ma보다 크면
                if current_price > calc.data[subject_code]['이동평균선'][100][-1]-1.5:
                    contract.list[subject_code]['손절가'] = calc.data[subject_code]['이동평균선'][100][-1]-1.5

                if current_price <= contract.list[subject_code]['손절가']:
                    log.info("매수간 손절가가 되어 청산 요청. (현재가 : %s, 체결가 : %s, 익절가 : %s, 손절가 : %s)" % (current_price, contract.list[subject_code]['체결가'], contract.list[subject_code]['익절가'], contract.list[subject_code]['손절가']))
                    sell_contents = {'신규주문': True, '매도수구분': '신규매도', '수량': contract.get_contract_count(subject_code)}

                elif current_price >= contract.list[subject_code]['익절가']:
                    log.info("현재가가 익절가가 되어 1차 청산 요청. (현재가 : %s, 체결가 : %s, 익절가 : %s, 손절가 : %s)" % (current_price, contract.list[subject_code]['체결가'], contract.list[subject_code]['익절가'], contract.list[subject_code]['손절가']))
                    contract.list[subject_code]['익절가'] = 9999
                    sell_contents = {'신규주문': True, '매도수구분': '신규매도', '수량': int(contract.get_contract_count(subject_code)/2)}

                elif current_price <= calc.data[subject_code]['이동평균선'][100][-1]-1.5 and contract.list[subject_code]['체결가'] < calc.data[subject_code]['이동평균선'][100][-1]:
                    log.info("현재가가 100MA뚫고 +10틱되어 청산 요청. (현재가 : %s, 체결가 : %s, 익절가 : %s, 손절가 : %s)" % (current_price, contract.list[subject_code]['체결가'], contract.list[subject_code]['익절가'], contract.list[subject_code]['손절가']))
                    sell_contents = {'신규주문': True, '매도수구분': '신규매도', '수량': contract.get_contract_count(subject_code)}

            elif contract.list[subject_code]['매도수구분'] == '신규매도':
                if current_price < calc.data[subject_code]['이동평균선'][100][-1]+1.5:
                    contract.list[subject_code]['손절가'] = calc.data[subject_code]['이동평균선'][100][-1]+1.5

                if current_price >= contract.list[subject_code]['손절가']:
                    log.info("매도간 손절가가 되어 청산 요청. (현재가 : %s, 체결가 : %s, 익절가 : %s, 손절가 : %s)" % (current_price, contract.list[subject_code]['체결가'], contract.list[subject_code]['익절가'], contract.list[subject_code]['손절가']))
                    sell_contents = {'신규주문': True, '매도수구분': '신규매수', '수량': contract.get_contract_count(subject_code)}

                elif current_price <= contract.list[subject_code]['익절가']:
                    log.info("현재가가 익절가가 되어 1차 청산 요청. (현재가 : %s, 체결가 : %s, 익절가 : %s, 손절가 : %s)" % (current_price, contract.list[subject_code]['체결가'], contract.list[subject_code]['익절가'], contract.list[subject_code]['손절가']))
                    contract.list[subject_code]['익절가'] = -9999
                    sell_contents = {'신규주문': True, '매도수구분': '신규매수', '수량': int(contract.get_contract_count(subject_code)/2)}

                elif current_price >= calc.data[subject_code]['이동평균선'][100][-1]+1.5 and contract.list[subject_code]['체결가'] > calc.data[subject_code]['이동평균선'][100][-1]:
                    log.info("현재가가 100MA+10틱 넘어서 청산 요청. (현재가 : %s, 체결가 : %s, 익절가 : %s, 손절가 : %s)" % (current_price, contract.list[subject_code]['체결가'], contract.list[subject_code]['익절가'], contract.list[subject_code]['손절가']))
                    sell_contents = {'신규주문': True, '매도수구분': '신규매수', '수량': contract.get_contract_count(subject_code)}

    except Exception as err:
        log.error(err)

    if sell_contents is not None:
        subject.info[subject_code]['최근매매인덱스'] = index
        return sell_contents
    return {'신규주문': False}
示例#4
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}
示例#5
0
def is_it_sell(subject_code, current_price):
    if contract.get_contract_count(subject_code) > 0:
        # 계약 보유중
        if contract.list[subject_code]['매도수구분'] == '신규매수':
            # 매수일때
            if current_price >= contract.list[subject_code]['익절가']:
                if contract.list[subject_code]['계약타입'][contract.DRIBBLE] > 0:
                    # 드리블 수량이 남아있다면
                    if get_time(30) >= int(
                            subject.info[subject_code]['마감시간']) and get_time(
                                0) < int(subject.info[subject_code]['마감시간']):
                        log.info('마감시간 임박으로 드리블 불가. 모두 청산.')
                        return {
                            '신규주문':
                            True,
                            '매도수구분':
                            '신규매도',
                            '수량':
                            contract.list[subject_code]['계약타입'][contract.SAFE]
                            + contract.list[subject_code]['계약타입'][
                                contract.DRIBBLE]
                        }
                    else:
                        log.info("드리블 목표 달성으로 익절가 수정.")
                        contract.list[subject_code]['익절가'] = current_price + (
                            subject.info[subject_code]['주문내용']['익절틱'] *
                            subject.info[subject_code]['단위'])
                        contract.list[subject_code]['손절가'] = current_price - (
                            (subject.info[subject_code]['주문내용']['손절틱'] - 1) *
                            subject.info[subject_code]['단위'])  # 수수료 때문에 1틱 뺌

                # 목표달성 청산
                if contract.list[subject_code]['계약타입'][contract.SAFE] > 0:
                    log.info("목표달성 청산으로 드리블 수량 제외하고 " + str(
                        contract.list[subject_code]['계약타입'][contract.SAFE]) +
                             "개 청산 요청.")
                    return {
                        '신규주문': True,
                        '매도수구분': '신규매도',
                        '수량':
                        contract.list[subject_code]['계약타입'][contract.SAFE]
                    }

            elif current_price <= contract.list[subject_code]['손절가']:
                # 손절 청산
                log.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 contract.list[subject_code]['매도수구분'] == '신규매도':
            # 매도일때
            if current_price <= contract.list[subject_code]['익절가']:
                if contract.list[subject_code]['계약타입'][contract.DRIBBLE] > 0:
                    # 드리블 수량이 남아있다면
                    if get_time(30) >= int(
                            subject.info[subject_code]['마감시간']) and get_time(
                                0) < int(subject.info[subject_code]['마감시간']):
                        log.info('마감시간 임박으로 드리블 불가. 모두 청산.')
                        return {
                            '신규주문':
                            True,
                            '매도수구분':
                            '신규매수',
                            '수량':
                            contract.list[subject_code]['계약타입'][contract.SAFE]
                            + contract.list[subject_code]['계약타입'][
                                contract.DRIBBLE]
                        }
                    else:
                        log.info("드리블 목표 달성으로 익절가 수정.")
                        contract.list[subject_code]['익절가'] = current_price - (
                            subject.info[subject_code]['주문내용']['익절틱'] *
                            subject.info[subject_code]['단위'])
                        contract.list[subject_code]['손절가'] = current_price + (
                            (subject.info[subject_code]['주문내용']['손절틱'] - 1) *
                            subject.info[subject_code]['단위'])  # 수수료 때문에 1틱 뺌

                # 목표달성 청산
                if contract.list[subject_code]['계약타입'][contract.SAFE] > 0:
                    log.info("목표달성 청산으로 드리블 수량 제외하고 " + str(
                        contract.list[subject_code]['계약타입'][contract.SAFE]) +
                             "개 청산 요청.")
                    return {
                        '신규주문': True,
                        '매도수구분': '신규매수',
                        '수량':
                        contract.list[subject_code]['계약타입'][contract.SAFE]
                    }

            elif current_price >= contract.list[subject_code]['손절가']:
                # 손절청산
                log.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]
                }

    return {'신규주문': False}
示例#6
0
def is_it_OK(subject_code, current_price):
    #log.info("[post_full_para] Here is post_full_para is_it_OK!!")

    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
    time_check_is_true = True
    reverse_tic = subject.info[subject_code]['반대매매틱']

    subject.info[subject_code]['체결미스'] = False

    param01 = subject.info[subject_code]['param01']
    param02 = subject.info[subject_code]['param02']
    param03 = subject.info[subject_code]['param03']
    param04 = subject.info[subject_code]['param04']
    param05 = subject.info[subject_code]['param05']
    param06 = subject.info[subject_code]['param06']
    param07 = subject.info[subject_code]['param07']
    param08 = subject.info[subject_code]['param08']
    param09 = subject.info[subject_code]['param09']
    param10 = subject.info[subject_code]['param10']
    param11 = subject.info[subject_code]['param11']
    param12 = subject.info[subject_code]['param12']
    param13 = subject.info[subject_code]['param13']
    param14 = subject.info[subject_code]['param14']
    param15 = subject.info[subject_code]['param15']

    # 300캔들이 없으면 매매 안함
    if calc.data[subject_code]['idx'] < 3000:
        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

    if subject.info[subject_code]['flow'] == '상향':
        if current_price < subject.info[subject_code]['sar']:
            return false

        elif calc.data[subject_code]['플로우'][-2] == '하향':
            return false

        for i in range(-1, -len(calc.data[subject_code]['플로우'])-1, -1):
            if calc.data[subject_code]['플로우'][i] == '하향':
                passed_candle_count = i
                break
            if i < - 20: return false

        mesu_medo_type = '신규매수'

        if calc.data[subject_code]['이전반전시SAR값'][-1]  + 10 * subject.info[subject_code]['단위'] < current_price:
            log.info("[post_full_para] 반전값 보다 10틱 이상 올라 신규 매수 포기")
            return false

    elif subject.info[subject_code]['flow'] == '하향':
        if current_price > subject.info[subject_code]['sar']:
            return false

        elif calc.data[subject_code]['플로우'][-2] == '상향':
            return false

        for i in range(-1, -len(calc.data[subject_code]['플로우'])-1, -1):
            if calc.data[subject_code]['플로우'][i] == '상향':
                passed_candle_count = i
                break
            if i < - 20: return false

        mesu_medo_type = '신규매도'

        if calc.data[subject_code]['이전반전시SAR값'][-1] - 10 * subject.info[subject_code]['단위'] > current_price:
            log.info("[post_full_para] 반전값 보다 10틱 이상 떨어져 신규 매도 포기")
            return false

    else:
        return false

    profit = subject.info[subject_code]['수익리스트'][-1]

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

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

    if calc.data[subject_code]['SAR반전시간'][-1] >= calc.data[subject_code]['체결시간'][-1]:  # 반전 후 SAR로 갱신되었다면
        return false

## 여기까지 함

    if mesu_medo_type == '신규매도':
        if my_util.is_sorted_previous(subject_code, passed_candle_count) != '하락세':
            ma_line_is_true = False
    elif mesu_medo_type == '신규매수':
        if my_util.is_sorted_previous(subject_code, passed_candle_count) != '상승세':
            ma_line_is_true = False

    #log.info("[post_full_para] flow_candle_count_list :%s" % calc.flow_candle_count_list[-1])

    if calc.flow_candle_count_list[-1] <= param11:
        log.info("[post_full_para] 지난 캔들이 %s개 미만으로 진입 포기" % param11)
        return false

    elif calc.flow_candle_count_list[-1] <= param09:
        ma_line_is_true = True
        log.info("[post_full_para] 지난 캔들이 %s개 이하로 진입" % param09)
        if calc.flow_candle_count_list[-1] <= param14 and calc.flow_candle_count_list[-2] >= param15:
            time_check_is_true = False
        pass

    elif subject.info[subject_code]['맞틀리스트'][-1] == '틀' and subject.info[subject_code]['수익리스트'][-1] < param08:
        time_check_is_true = False
        log.info("[post_full_para] 큰 틀 다음으로 매매 진입합니다.")
        pass

    elif subject.info[subject_code]['수익리스트'][-1] > param06:
        log.info("[post_full_para] 지난 플로우 수익이 %s틱 이상으로 진입 포기" % param06)
        return false

    elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '맞', '틀']:
        if calc.flow_candle_count_list[-1] <= param01:
            log.info("[post_full_para] 틀맞틀 로 매매 진입합니다.")
            subject.info[subject_code]['1차청산틱'] = subject.info[subject_code]['틀맞틀-청산틱']
        else:
            log.info("[post_full_para] 틀맞틀일때 지난 플로우 캔들 수가 %s(현재 %s) 이상으로 매매 안합니다" % (param01, calc.flow_candle_count_list[-1]))
            return false

    elif subject.info[subject_code]['맞틀리스트'][-2] == '맞' and subject.info[subject_code]['맞틀리스트'][-1] == '틀':
        log.info("[post_full_para] 맞틀 로 매매 포기")
        return false

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

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

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

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

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

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

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

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

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

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


    if ma_line_is_true == False: return false

    current_time = int(str(calc.data[subject_code]['체결시간'][passed_candle_count+1])[8:12])

    if current_time <= int(subject.info[subject_code]['시작시간']) and current_time >= int(subject.info[subject_code]['마감시간']):
        # log.info("[post_full_para] 장 시작 시간, 마감 시간 정각에 매매하지 않습니다. 매매금지")
        # return false
        if calc.data['금일캔들수'] == 0:  # 당일 첫 캔들에 반전 된 상황
            if mesu_medo_type == '신규매도':
                if calc.data[subject_code]['저가'][-1] - current_price > 10 * subject.info[subject_code]['단위']:
                    log.info("[post_full_para]장 시작 시간, 마감 시간 정각에 매매하지 않습니다. 매매금지")
                    return false
                else:
                    pass
            elif mesu_medo_type == '신규매수':
                if current_price - calc.data[subject_code]['고가'][-1] > 10 * subject.info[subject_code]['단위']:
                    log.info("[post_full_para]장 시작 시간, 마감 시간 정각에 매매하지 않습니다. 매매금지")
                    return false
                else:
                    pass

        elif calc.data['금일캔들수'] == 1:  # 당일 첫 캔들 60번째 반전이거나 2번째 캔들에서 반전 된 상황
            if mesu_medo_type == '신규매도':
                if calc.data[subject_code]['저가'][-2] - calc.data[subject_code]['고가'][-1] > 10 * \
                        subject.info[subject_code]['단위']:
                    log.info("[post_full_para]장 시작 시간, 마감 시간 정각에 매매하지 않습니다. 매매금지")
                    return false
                else:
                    pass
            elif mesu_medo_type == '신규매수':
                if calc.data[subject_code]['저가'][-1] - calc.data[subject_code]['고가'][-2] > 10 * \
                        subject.info[subject_code]['단위']:
                    log.info("[post_full_para]장 시작 시간, 마감 시간 정각에 매매하지 않습니다. 매매금지")
                    return false
                else:
                    pass
        else:
            pass

    if subject_code[:3] == "GCZ" or subject_code[:3] == "GCQ":
        if current_time > 2100 and current_time < 2230 and subject.info[subject_code]['반대매매'] == False and time_check_is_true == True:
            log.info("[post_full_para] 21:00~22:30 시 사이라 매매 포기 합니다.")
            return false
    else:
        if current_time > 2200 and current_time < 2330 and subject.info[subject_code]['반대매매'] == False and time_check_is_true == True:
            log.info("[post_full_para] 22:00~23:30 시 사이라 매매 포기 합니다.")
            return false

    if subject.info[subject_code]['반대매매'] == True:
        subject.info[subject_code]['반대매매'] = False
        return false

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

        if subject.info[subject_code]['신규매매수량'] != contract_cnt:
            subject.info[subject_code]['신규매매수량'] = contract_cnt
            log.info("[post_full_para] subject.info[subject_code]['신규매매수량'] 조정 :%s" % contract_cnt)

        log.info("[post_full_para] 최종 매매 수량은 %s개 입니다." % contract_cnt)

    else:
        contract_cnt = 2  # 테스트 돌릴때
        subject.info[subject_code]['신규매매수량'] = contract_cnt

    # 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 and number_of_current_contract > 0:  # 만약 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('!!!!!! post_para.is_it_OK() : 모든 구매조건 통과.')
    log.debug(order_contents)


    return order_contents
示例#7
0
def is_it_sell(subject_code, current_price):
    if subject.info[subject_code]['flow'] == '상향' and subject.info[
            subject_code]['상태'] == '매수중':
        if current_price < subject.info[subject_code]['sar']:
            if contract.get_contract_count(subject_code) > 0:
                log.info('flow가 상향이고, 현재가가  sar 보다 작으므로 매도 시도')
                return {
                    '신규주문': True,
                    '매도수구분': '신규매도',
                    '수량': contract.get_contract_count(subject_code)
                }
    elif subject.info[subject_code]['flow'] == '하향' and subject.info[
            subject_code]['상태'] == '매도중':
        if current_price > subject.info[subject_code]['sar']:
            if contract.get_contract_count(subject_code) > 0:
                log.info('flow가 하향이고, 현재가가  sar 보다 크므로 매수 시도')
                return {
                    '신규주문': True,
                    '매도수구분': '신규매수',
                    '수량': contract.get_contract_count(subject_code)
                }

    if contract.get_contract_count(subject_code) > 0:
        #log.info('보유 계약 수 : ' + str(contract.get_contract_count(subject_code)))
        # 계약 보유중
        if contract.list[subject_code]['매도수구분'] == '신규매수':
            # 매수일때
            if current_price >= contract.list[subject_code]['익절가']:
                if contract.list[subject_code]['계약타입'][contract.DRIBBLE] > 0:
                    # 드리블 수량이 남아있다면
                    if get_time(30, subject_code) >= int(
                            subject.info[subject_code]['마감시간']) and get_time(
                                0, subject_code) < int(
                                    subject.info[subject_code]['마감시간']):
                        log.info('마감시간 임박으로 드리블 불가. 모두 청산.')
                        return {
                            '신규주문':
                            True,
                            '매도수구분':
                            '신규매도',
                            '수량':
                            contract.list[subject_code]['계약타입'][contract.SAFE]
                            + contract.list[subject_code]['계약타입'][
                                contract.DRIBBLE]
                        }

                    #if current_price >= contract.list[subject_code]['체결가'] + 25*subject.info[subject_code]['단위']:
                    #    log.info("드리블 목표 달성으로 익절가 수정. 25틱 이상 익절로 2틱 캡으로 드리블")
                    #    contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['단위'] )
                    #    contract.list[subject_code]['손절가'] = current_price - (2*subject.info[subject_code]['단위'])

                    #elif current_price >= contract.list[subject_code]['체결가'] + 20*subject.info[subject_code]['단위']:
                    #    log.info("드리블 목표 달성으로 익절가 수정. 20틱 이상 익절로 3틱 캡으로 드리블")
                    #    contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['단위'] )
                    #    contract.list[subject_code]['손절가'] = current_price - (3*subject.info[subject_code]['단위'])

                    ### 15틱 이상 익절 시 5틱 캡으로 드리블
                    #elif current_price >= contract.list[subject_code]['체결가'] + 15*subject.info[subject_code]['단위']:
                    #    log.info("드리블 목표 달성으로 익절가 수정. 15틱 이상 익절로 5틱 캡으로 드리블")
                    #    contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['단위'] )
                    #    contract.list[subject_code]['손절가'] = current_price - (5*subject.info[subject_code]['단위'])
                    ######

                    elif current_price >= contract.list[subject_code][
                            '체결가'] + 40 * subject.info[subject_code]['단위']:
                        log.info("드리블 목표 달성으로 익절가 수정. 40틱 이상 익절로 3틱 캡으로 드리블")
                        contract.list[subject_code]['익절가'] = current_price + (
                            subject.info[subject_code]['단위'])
                        contract.list[subject_code]['손절가'] = current_price - (
                            3 * subject.info[subject_code]['단위'])

                    elif current_price >= contract.list[subject_code][
                            '체결가'] + 37 * subject.info[subject_code]['단위']:
                        log.info("드리블 목표 달성으로 익절가 수정. 37틱 이상 익절로 5틱 캡으로 드리블")
                        contract.list[subject_code]['익절가'] = current_price + (
                            subject.info[subject_code]['단위'])
                        contract.list[subject_code]['손절가'] = current_price - (
                            5 * subject.info[subject_code]['단위'])

                    elif current_price >= contract.list[subject_code][
                            '체결가'] + 30 * subject.info[subject_code]['단위']:
                        log.info("드리블 목표 달성으로 익절가 수정. 30틱 이상 익절로 10틱 캡으로 드리블")
                        contract.list[subject_code]['익절가'] = current_price + (
                            subject.info[subject_code]['단위'])
                        contract.list[subject_code]['손절가'] = current_price - (
                            10 * subject.info[subject_code]['단위'])

                    elif current_price >= contract.list[subject_code][
                            '체결가'] + 20 * subject.info[subject_code]['단위']:
                        log.info("드리블 목표 달성으로 익절가 수정. 20틱 이상 익절로 15틱 캡으로 드리블")
                        contract.list[subject_code]['익절가'] = current_price + (
                            subject.info[subject_code]['단위'])
                        contract.list[subject_code]['손절가'] = current_price - (
                            15 * subject.info[subject_code]['단위'])

                    else:
                        log.info("드리블 목표 달성으로 익절가 수정.")
                        #contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['주문내용']['익절틱'] * subject.info[subject_code]['단위'] )
                        contract.list[subject_code]['익절가'] = current_price + (
                            subject.info[subject_code]['단위'])
                        contract.list[subject_code]['손절가'] = current_price - (
                            (subject.info[subject_code]['주문내용']['손절틱'] - 3) *
                            subject.info[subject_code]['단위'])  # 수수료 때문에 1틱 뺌
                        #contract.list[subject_code]['손절가'] = current_price - ( subject.info[subject_code]['단위'] ) # 수수료 때문에 1틱 뺌

                # 목표달성 청산
                if contract.list[subject_code]['계약타입'][contract.SAFE] > 0:
                    log.info("목표달성 청산으로 드리블 수량 제외하고 " + str(
                        contract.list[subject_code]['계약타입'][contract.SAFE]) +
                             "개 청산 요청.")
                    return {
                        '신규주문': True,
                        '매도수구분': '신규매도',
                        '수량':
                        contract.list[subject_code]['계약타입'][contract.SAFE]
                    }

            ### 예를 들어 10틱 목표가인데 8틱까지 올라가면 손절가를 체결가 + 1 로 설정하여 -10틱 까지 가서 손절되는것을 막는다
            elif current_price >= contract.list[subject_code]['익절가'] - (
                    int(subject.info[subject_code]['주문내용']['익절틱'] * 0.2) *
                    subject.info[subject_code]['단위']):
                if contract.list[subject_code]['체결가'] > contract.list[
                        subject_code]['손절가']:
                    contract.list[subject_code][
                        '손절가'] = contract.list[subject_code]['체결가'] + (
                            3 * subject.info[subject_code]['단위']
                        )  #매수가보다 1틱 올려서 손절가 설정
                    contract.list[subject_code]['손절가'] = round(
                        contract.list[subject_code]['손절가'],
                        subject.info[subject_code]['자릿수'])
                    log.info("익절틱 80프로 구간 도달하여 손절가 UP, 손절가:%s" %
                             contract.list[subject_code]['손절가'])

            elif current_price >= contract.list[subject_code]['익절가'] - (
                    int(subject.info[subject_code]['주문내용']['익절틱'] * 0.4) *
                    subject.info[subject_code]['단위']):
                if contract.list[subject_code]['체결가'] > contract.list[
                        subject_code]['손절가']:
                    contract.list[subject_code][
                        '손절가'] = contract.list[subject_code]['체결가'] - (
                            3 * subject.info[subject_code]['단위']
                        )  #매수가보다 1틱 올려서 손절가 설정
                    contract.list[subject_code]['손절가'] = round(
                        contract.list[subject_code]['손절가'],
                        subject.info[subject_code]['자릿수'])
                    log.info("익절틱 60프로 구간 도달하여 손절가 UP, 손절가:%s" %
                             contract.list[subject_code]['손절가'])

            ########
            #elif current_price > contract.list[subject_code]['익절가'] - (sonjal_tick*subject.info[subject_code]['단위']):
            #    if current_price - (sonjal_tick*subject.info[subject_code]['단위']) > contract.list[subject_code]['손절가']:
            #        contract.list[subject_code]['손절가'] = current_price - (sonjal_tick*subject.info[subject_code]['단위'])
            #        log.info("손절가 UP, 익절가 향하여 전진!")
            ########

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

            elif current_price < min(
                    calc.data[subject_code]['일목균형표']['선행스팬1']
                [calc.data[subject_code]['idx']], calc.data[subject_code]
                ['일목균형표']['선행스팬2'][calc.data[subject_code]['idx']]
            ) - sonjal_gap_between_ilmok_current_price * subject.info[
                    subject_code]['단위']:
                log.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 contract.list[subject_code]['매도수구분'] == '신규매도':

            # 매도일때
            if current_price <= contract.list[subject_code]['익절가']:
                if contract.list[subject_code]['계약타입'][contract.DRIBBLE] > 0:
                    # 드리블 수량이 남아있다면
                    if get_time(30, subject_code) >= int(
                            subject.info[subject_code]['마감시간']) and get_time(
                                0, subject_code) < int(
                                    subject.info[subject_code]['마감시간']):
                        log.info('마감시간 임박으로 드리블 불가. 모두 청산.')
                        return {
                            '신규주문':
                            True,
                            '매도수구분':
                            '신규매수',
                            '수량':
                            contract.list[subject_code]['계약타입'][contract.SAFE]
                            + contract.list[subject_code]['계약타입'][
                                contract.DRIBBLE]
                        }

                    #if current_price <= (contract.list[subject_code]['체결가'] - (25*subject.info[subject_code]['단위'])):
                    #    log.info("드리블 목표 달성으로 익절가 수정. 25틱 이상 익절로 2틱 캡으로 드리블")
                    #    contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['단위'] )
                    #    contract.list[subject_code]['손절가'] = current_price + (2*subject.info[subject_code]['단위'])
                    #
                    #elif current_price <= (contract.list[subject_code]['체결가'] - (20*subject.info[subject_code]['단위'])):
                    #    log.info("드리블 목표 달성으로 익절가 수정. 20틱 이상 익절로 3틱 캡으로 드리블")
                    #    contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['단위'] )
                    #    contract.list[subject_code]['손절가'] = current_price + (3*subject.info[subject_code]['단위'])

                    ### 15틱 이상 익절 시 5틱 캡으로 드리블
                    #elif current_price <= (contract.list[subject_code]['체결가'] - (15*subject.info[subject_code]['단위'])):
                    #    log.info("드리블 목표 달성으로 익절가 수정. 15틱 이상 익절로 5틱 캡으로 드리블")
                    #    contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['단위'] )
                    #    contract.list[subject_code]['손절가'] = current_price + (5*subject.info[subject_code]['단위'])
                    ######

                    elif current_price <= (
                            contract.list[subject_code]['체결가'] -
                        (40 * subject.info[subject_code]['단위'])):
                        log.info("드리블 목표 달성으로 익절가 수정. 40틱 이상 익절로 3틱 캡으로 드리블")
                        contract.list[subject_code]['익절가'] = current_price - (
                            subject.info[subject_code]['단위'])
                        contract.list[subject_code]['손절가'] = current_price + (
                            3 * subject.info[subject_code]['단위'])

                    elif current_price <= (
                            contract.list[subject_code]['체결가'] -
                        (37 * subject.info[subject_code]['단위'])):
                        log.info("드리블 목표 달성으로 익절가 수정. 37틱 이상 익절로 5틱 캡으로 드리블")
                        contract.list[subject_code]['익절가'] = current_price - (
                            subject.info[subject_code]['단위'])
                        contract.list[subject_code]['손절가'] = current_price + (
                            5 * subject.info[subject_code]['단위'])

                    elif current_price <= (
                            contract.list[subject_code]['체결가'] -
                        (30 * subject.info[subject_code]['단위'])):
                        log.info("드리블 목표 달성으로 익절가 수정. 30틱 이상 익절로 10틱 캡으로 드리블")
                        contract.list[subject_code]['익절가'] = current_price - (
                            subject.info[subject_code]['단위'])
                        contract.list[subject_code]['손절가'] = current_price + (
                            10 * subject.info[subject_code]['단위'])

                    elif current_price <= (
                            contract.list[subject_code]['체결가'] -
                        (20 * subject.info[subject_code]['단위'])):
                        log.info("드리블 목표 달성으로 익절가 수정. 20틱 이상 익절로 15틱 캡으로 드리블")
                        contract.list[subject_code]['익절가'] = current_price - (
                            subject.info[subject_code]['단위'])
                        contract.list[subject_code]['손절가'] = current_price + (
                            15 * subject.info[subject_code]['단위'])

                    else:
                        log.info("드리블 목표 달성으로 익절가 수정.")
                        #contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['주문내용']['익절틱'] * subject.info[subject_code]['단위'] )
                        contract.list[subject_code]['익절가'] = current_price - (
                            subject.info[subject_code]['단위'])
                        contract.list[subject_code]['손절가'] = current_price + (
                            (subject.info[subject_code]['주문내용']['손절틱'] - 3) *
                            subject.info[subject_code]['단위'])  # 수수료 때문에 1틱 뺌
                        #contract.list[subject_code]['손절가'] = current_price + ( subject.info[subject_code]['단위'] ) # 수수료 때문에 1틱 뺌

                # 목표달성 청산
                if contract.list[subject_code]['계약타입'][contract.SAFE] > 0:
                    log.info("목표달성 청산으로 드리블 수량 제외하고 " + str(
                        contract.list[subject_code]['계약타입'][contract.SAFE]) +
                             "개 청산 요청.")
                    return {
                        '신규주문': True,
                        '매도수구분': '신규매수',
                        '수량':
                        contract.list[subject_code]['계약타입'][contract.SAFE]
                    }

            ## 예를 들어 10틱 목표가인데 8틱까지 올라가면 손절가를 체결가 + 1 로 설정하여 -10틱 까지 가서 손절되는것을 막는다
            elif current_price <= contract.list[subject_code]['익절가'] + (
                    int(subject.info[subject_code]['주문내용']['익절틱'] * 0.2) *
                    subject.info[subject_code]['단위']):
                if contract.list[subject_code]['체결가'] < contract.list[
                        subject_code]['손절가']:
                    contract.list[subject_code][
                        '손절가'] = contract.list[subject_code]['체결가'] - (
                            3 * subject.info[subject_code]['단위']
                        )  #매수가보다 1틱 올려서 손절가 설정
                    contract.list[subject_code]['손절가'] = round(
                        contract.list[subject_code]['손절가'],
                        subject.info[subject_code]['자릿수'])
                    log.info("익절틱 80프로 구간 도달하여 손절가 UP, 손절가:%s" %
                             contract.list[subject_code]['손절가'])

            elif current_price <= contract.list[subject_code]['익절가'] + (
                    int(subject.info[subject_code]['주문내용']['익절틱'] * 0.4) *
                    subject.info[subject_code]['단위']):
                if contract.list[subject_code]['체결가'] < contract.list[
                        subject_code]['손절가']:
                    contract.list[subject_code][
                        '손절가'] = contract.list[subject_code]['체결가'] + (
                            3 * subject.info[subject_code]['단위']
                        )  #매수가보다 1틱 올려서 손절가 설정
                    contract.list[subject_code]['손절가'] = round(
                        contract.list[subject_code]['손절가'],
                        subject.info[subject_code]['자릿수'])
                    log.info("익절틱 60프로 구간 도달하여 손절가 UP, 손절가:%s" %
                             contract.list[subject_code]['손절가'])
            ########
            #elif current_price < contract.list[subject_code]['익절가'] + (sonjal_tick*subject.info[subject_code]['단위']):
            #    if current_price + (sonjal_tick*subject.info[subject_code]['단위']) < contract.list[subject_code]['손절가']:
            #        contract.list[subject_code]['손절가'] = current_price + (sonjal_tick*subject.info[subject_code]['단위'])
            #        log.info("손절가 UP, 익절가 향하여 전진!")
            ########

            elif current_price >= contract.list[subject_code]['손절가']:
                # 손절청산
                log.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 > max(
                    calc.data[subject_code]['일목균형표']['선행스팬1']
                [calc.data[subject_code]['idx']], calc.data[subject_code]
                ['일목균형표']['선행스팬2'][calc.data[subject_code]['idx']]
            ) + sonjal_gap_between_ilmok_current_price * subject.info[
                    subject_code]['단위']:
                log.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]
                }

    return {'신규주문': False}
示例#8
0
def calc(subject_code):
    '''
    각종 그래프 계산
    '''
    if subject.info[subject_code]['전략'] == '파라':

        sar = subject.info[subject_code]['sar']
        
        if data[subject_code]['idx'] < 5:
            data[subject_code]['플로우'].append('모름')
        if data[subject_code]['idx'] == 5:
            init_sar(subject_code)
        elif data[subject_code]['idx'] > 5:
            calculate_sar(subject_code)
        
        calc_ma_line(subject_code)
        trend = is_sorted(subject_code, subject.info[subject_code]['이동평균선'])
        data[subject_code]['추세'].append(trend)
        calc_ema_line(subject_code)
        calc_ilmok_chart(subject_code)
        calc_linear_regression(subject_code)

    elif subject.info[subject_code]['전략'] == '풀파라' or subject.info[subject_code]['전략'] == '리버스온리':

        sar = subject.info[subject_code]['sar']
       
        if data[subject_code]['idx'] < 5:
            data[subject_code]['플로우'].append('모름')
        if data[subject_code]['idx'] == 5:
            init_sar(subject_code)
        elif data[subject_code]['idx'] > 5:
            calculate_sar(subject_code)

        calc_ma_line(subject_code)
        trend = is_sorted(subject_code, subject.info[subject_code]['이동평균선'])
        data[subject_code]['추세'].append(trend)

        log.debug("현재플로우 : " + data[subject_code]['플로우'][-1] + " / 현재플로우최극가 : " + str(data[subject_code]['현재플로우최극가']))

        if data[subject_code]['플로우'][-1] == '상향':
            if data[subject_code]['현재플로우최극가'] < data[subject_code]['고가'][-1]: data[subject_code]['현재플로우최극가'] = float(data[subject_code]['고가'][-1])
        else:
            if data[subject_code]['현재플로우최극가'] > data[subject_code]['저가'][-1]: data[subject_code]['현재플로우최극가'] = float(data[subject_code]['저가'][-1])

        #if data[subject_code]['idx'] > 9000: log.info("SAR : %s" % sar)
        '''
        calc_ema_line(subject_code)
        calc_ilmok_chart(subject_code)
        calc_linear_regression_in_para(subject_code)
        '''
    elif subject.info[subject_code]['전략'] == '추세선밴드':
        calc_ma_line(subject_code)
        calc_ema_line(subject_code)

        trend = is_sorted(subject_code, subject.info[subject_code]['이동평균선'])
        data[subject_code]['추세'].append(trend)
        
        if data[subject_code]['idx'] >= subject.info[subject_code]['이동평균선'][-1]:
            if trend != data[subject_code]['추세'][ -2 ]:
                # 추세 반전
                if data[subject_code]['추세연속틱'] < subject.info[subject_code]['최소연속틱'] or data[subject_code]['정배열연속틱'] < subject.info[subject_code]['최소연속틱']/2:
                    # 추세 극점부터 연속 틱이 60 이하일 경우 추세 아님
                    my_util.chanege_past_trend(subject_code) # 추세가 아니므로, 지난 추세를 현재추세로 덮어씌워 연속된 추세를 만듬

                log.info('이동평균선 추세 연속틱 재설정.')
                data[subject_code]['추세연속틱'] = my_util.get_trend_continuous_tick_count(subject_code)
                data[subject_code]['정배열연속틱'] = 1
                if contract.get_contract_count(subject_code) == 0 and subject.info[subject_code]['상태'] != '중립대기':
                    log.info('종목코드 : ' + subject_code + ' 상태 변경, ' + subject.info[subject_code]['상태'] + ' -> 중립대기.')
                    subject.info[subject_code]['상태'] = '중립대기'
            else:
                data[subject_code]['추세연속틱'] += 1
                data[subject_code]['정배열연속틱'] += 1
                log.info('이동평균선 ' + trend + ' 추세 연속 : ' + str(data[subject_code]['추세연속틱']) + '틱')
        
        calc_linear_regression(subject_code)
        calc_bollinger_bands(subject_code)
        calc_ilmok_chart(subject_code)
    elif subject.info[subject_code]['전략'] == '큰파라':
        calc_ma_line(subject_code)
        
        sar = subject.info[subject_code]['sar']
        
        if data[subject_code]['idx'] < 5:
            data[subject_code]['플로우'].append('모름')
        if data[subject_code]['idx'] == 5:
            init_sar(subject_code)
        elif data[subject_code]['idx'] > 5:
            calculate_sar(subject_code)
    elif subject.info[subject_code]['전략'] == 'MA30100':
        calc_ma_line(subject_code)
        day_ma = [3,5,10,20,30,60,120]
        for day in day_ma:
            data[subject_code][DAY][MA][day] = calc_ma_from_xls(subject_code, DAY, day, data[subject_code]['영업일자'][-1], data[subject_code]['현재가'][-1])

        week_ma = [3,5,10,20,30,60]
        for week in week_ma:
            data[subject_code][WEEK][MA][week] = calc_ma_from_xls(subject_code, WEEK, week, data[subject_code]['영업일자'][-1],
                                                                data[subject_code]['현재가'][-1])

        # 전일 종가 금일 시가 셋팅
        if(날짜가 오늘이면)
        data[subject_code][DAY][OPEN] = data[subject_code][DAY][CANDLE][OPEN]
        #print(data[subject_code][DAY][MA])

    else:
        calc_ma_line(subject_code)



def calc_ma_line(subject_code):
    '''
    이동평균선 계산
    '''    
    for days in data['이동평균선']['일수']:
        if data[subject_code]['idx'] >= days - 1:
            avg = sum( data[subject_code]['현재가'][ data[subject_code]['idx'] - days + 1 : data[subject_code]['idx'] + 1] ) / days    
            data[subject_code]['이동평균선'][days].append(avg)
        else:
            data[subject_code]['이동평균선'][days].append(None)
             
def calc_ema_line(subject_code):
    '''
    지수이동평균선 계산
    '''
    for days in data['이동평균선']['일수']:
        if data[subject_code]['idx'] >= days - 1:
            if data[subject_code]['idx'] == days - 1:
                avg = sum( data[subject_code]['현재가'][ data[subject_code]['idx'] - days + 1 : data[subject_code]['idx'] + 1] ) / days    
                data[subject_code]['지수이동평균선'][days].append(avg)
            else:
                alpha  = 2 / (days + 1)
                ema = alpha * data[subject_code]['현재가'][-1] + (1.0 - alpha) * data[subject_code]['지수이동평균선'][days][-1]
                data[subject_code]['지수이동평균선'][days].append(ema)
        else:
            data[subject_code]['지수이동평균선'][days].append(None)
               
def calc_ilmok_chart(subject_code):
    '''
    일목균형표 계산
    '''
    if data[subject_code]['idx'] < 9:
        data[subject_code]['일목균형표']['전환선'].append(None)
    else:
        data[subject_code]['일목균형표']['전환선'].append( (max( data[subject_code]['현재가'][data[subject_code]['idx'] - 9 : data[subject_code]['idx']] ) + min(  data[subject_code]['현재가'][data[subject_code]['idx'] - 9 : data[subject_code]['idx']] )) / 2)

    if data[subject_code]['idx'] < 26:
        data[subject_code]['일목균형표']['기준선'].append(None)
    else:
        data[subject_code]['일목균형표']['기준선'].append( (max( data[subject_code]['현재가'][data[subject_code]['idx'] - 26 : data[subject_code]['idx']] ) + min(  data[subject_code]['현재가'][data[subject_code]['idx'] - 26 : data[subject_code]['idx']] )) / 2)

    if data[subject_code]['idx'] >= 26:
        data[subject_code]['일목균형표']['선행스팬1'].append( (data[subject_code]['일목균형표']['전환선'][data[subject_code]['idx']] + data[subject_code]['일목균형표']['기준선'][data[subject_code]['idx']]) / 2)
    else:
        data[subject_code]['일목균형표']['선행스팬1'].append(None)

    if data[subject_code]['idx'] >= 52:
        data[subject_code]['일목균형표']['선행스팬2'].append( (max( data[subject_code]['현재가'][data[subject_code]['idx'] - 52 : data[subject_code]['idx']] ) + min(  data[subject_code]['현재가'][data[subject_code]['idx'] - 52 : data[subject_code]['idx']] )) / 2)
    else:
        data[subject_code]['일목균형표']['선행스팬2'].append(None)

def calc_linear_regression_in_para(subject_code):  
    '''
    직선회기 계산
    파라볼릭 SAR 지난 신호에서 최극점을 기준으로 계산
    '''
    data[subject_code]['추세선'].append(None)
    data[subject_code]['매매선'].append(None)
    data[subject_code]['추세선밴드']['상한선'].append(None)
    data[subject_code]['추세선밴드']['하한선'].append(None)

    # 지난 신호 마지막 index를 찾는다.
    last_index = data[subject_code]['idx']
    for idx in range(data[subject_code]['idx'], 0, -1):
        if data[subject_code]['플로우'][idx] != data[subject_code]['플로우'][-1]:
            last_index = idx
            break

    # 지난 신호 중에서 최고 극점을 찾는다.
    ep = 0
    ep_index = 0
    if data[subject_code]['플로우'][last_index] == '하향': ep = 999999

    for idx in range(last_index, 0, -1):
        if data[subject_code]['플로우'][idx] == data[subject_code]['플로우'][last_index]:
            if data[subject_code]['플로우'][idx] == '상향' and ep < data[subject_code]['현재가'][idx]:
                ep = data[subject_code]['현재가'][idx]
                ep_index = idx
            elif data[subject_code]['플로우'][idx] == '하향' and ep > data[subject_code]['현재가'][idx]:
                ep = data[subject_code]['현재가'][idx]
                ep_index = idx
        else: break
    
    line_range = data[subject_code]['idx'] - ep_index
    result = stats.linregress(list(range( 0, line_range + 1 )), data[subject_code]['현재가'][ len(data[subject_code]['현재가']) - line_range - 1: len(data[subject_code]['현재가']) ])

    data[subject_code]['추세선기울기'] = result.slope
    data[subject_code]['결정계수'] = (result.rvalue**2)
    _x = 0
    for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx'] + 27):
        data[subject_code]['추세선'][idx] = result.slope * _x + result.intercept
        _x+=1

    # 표준편차
    stdev = calc_stdev(subject_code)

    data[subject_code]['표준편차'] = stdev
    
    for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx'] + 27):
        data[subject_code]['추세선밴드']['상한선'][idx] = data[subject_code]['추세선'][idx] + 2 * stdev
        data[subject_code]['추세선밴드']['하한선'][idx] = data[subject_code]['추세선'][idx] - 2 * stdev
    
def calc_linear_regression(subject_code):
    '''
    직선회기 계산
    '''
    data[subject_code]['추세선'].append(None)
    data[subject_code]['매매선'].append(None)
    data[subject_code]['추세선밴드']['상한선'].append(None)
    data[subject_code]['추세선밴드']['하한선'].append(None)

    line_range = my_util.get_trend_continuous_tick_count(subject_code)

    if data[subject_code]['idx'] <= line_range:
        return

    result = stats.linregress(list(range( 0, line_range + 1 )), data[subject_code]['현재가'][ len(data[subject_code]['현재가']) - line_range - 1: len(data[subject_code]['현재가']) ])

    data[subject_code]['추세선기울기'] = result.slope
    data[subject_code]['결정계수'] = (result.rvalue**2)
    _x = 0
    for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx'] + 27):
        data[subject_code]['추세선'][idx] = result.slope * _x + result.intercept
        _x+=1

    # 표준편차
    stdev = calc_stdev(subject_code)

    data[subject_code]['표준편차'] = stdev
    high_max = 0
    low_max = 0
    for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx']):
        high_max = max(data[subject_code]['고가'][idx] - data[subject_code]['추세선'][idx], high_max)
        low_max = max(data[subject_code]['추세선'][idx] - data[subject_code]['저가'][idx], low_max)

    for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx'] + 27):
        data[subject_code]['추세선밴드']['상한선'][idx] = data[subject_code]['추세선'][idx] + high_max
        data[subject_code]['추세선밴드']['하한선'][idx] = data[subject_code]['추세선'][idx] - low_max

    '''
    # 데이터와의 차 구함
    max = get_max_deifference(subject_code)
    
    diff = max * 0.6
    if diff > 10 * subject.info[subject_code]['단위']:
       diff = 10 *subject.info[subject_code]['단위']

    for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx'] + 1):
        if data[subject_code]['추세'][ data[subject_code]['idx'] - 1] == '상승세':
            data[subject_code]['매매선'][idx] = data[subject_code]['추세선'][idx] - diff
        elif data[subject_code]['추세'][ data[subject_code]['idx'] - 1] == '하락세':
            data[subject_code]['매매선'][idx] = data[subject_code]['추세선'][idx] + diff
    '''
    
def calc_stdev(subject_code):
    sd = 0.0
    sum = 0.0
    
    line_range = my_util.get_trend_continuous_tick_count(subject_code)
    if line_range <= 1: return 0

    for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx'] + 1):
        diff = data[subject_code]['추세선'][idx] - ((data[subject_code]['현재가'][idx] + data[subject_code]['시가'][idx])/2)
        sum += diff**2

    return math.sqrt(sum / (line_range - 1))
    
##### 볼린저 밴드 계산 #####
def calc_bollinger_bands(subject_code, length = 20, numsd = 2):
    if data[subject_code]['idx'] < length:
        data[subject_code]['볼린저밴드']['중심선'].append(None)
        data[subject_code]['볼린저밴드']['상한선'].append(None)
        data[subject_code]['볼린저밴드']['하한선'].append(None)
        data[subject_code]['볼린저밴드']['캔들위치'].append(None)
        return

    mean = sum(data[subject_code]['현재가'][-length:]) / length
    sum_dif = 0
    for idx in range(data[subject_code]['idx'] - length + 1, data[subject_code]['idx'] + 1):
        sum_dif += (data[subject_code]['현재가'][idx] - mean)**2

    var = sum_dif / length
    sd = math.sqrt(var)

    data[subject_code]['볼린저밴드']['중심선'].append(mean)
    data[subject_code]['볼린저밴드']['상한선'].append(mean + sd * numsd)
    data[subject_code]['볼린저밴드']['하한선'].append(mean - sd * numsd)
    if data[subject_code]['시가'][-1] >= data[subject_code]['볼린저밴드']['중심선'][-1] and data[subject_code]['현재가'][-1] >= data[subject_code]['볼린저밴드']['중심선'][-1]:
        data[subject_code]['볼린저밴드']['캔들위치'].append('상단')
    elif data[subject_code]['시가'][-1] <= data[subject_code]['볼린저밴드']['중심선'][-1] and data[subject_code]['현재가'][-1] <= data[subject_code]['볼린저밴드']['중심선'][-1]:
        data[subject_code]['볼린저밴드']['캔들위치'].append('하단')
    else:
        data[subject_code]['볼린저밴드']['캔들위치'].append('중심')
            
def find_high_low_point(subject_code):
    start_index = my_util.get_start_index_of_trend(subject_code)
    current_trend = data[subject_code]['추세'][-1]
    data[subject_code]['고가그룹'] = []
    data[subject_code]['저가그룹'] = []
    point_idx = start_index
    past_position = data[subject_code]['볼린저밴드']['캔들위치'][start_index]
    candle_cnt = 0
    last_position = ''

    for idx in range(start_index, 0, -1):
        if data[subject_code]['볼린저밴드']['캔들위치'][idx] != past_position:
            start_index = idx + 1
            break;

    if current_trend == '상승세':
        point_value = data[subject_code]['고가'][start_index]
        is_low_point = False
        end_index = 0
        last_position = data[subject_code]['볼린저밴드']['캔들위치'][-1]
        for idx in range(data[subject_code]['idx'],0,-1):
            if data[subject_code]['볼린저밴드']['캔들위치'][idx] != last_position:
                end_index = idx
                break
        
        # 저점 찾기
        for idx in range(start_index, end_index+1):
            # 현재 위치 ( 중심선 상단, 하단 ) / 캔들 시가, 종가 모두 포함되어야함
            current_position = data[subject_code]['볼린저밴드']['캔들위치'][idx]
            if current_position != '하단':
                if is_low_point == True:
                    data[subject_code]['저가그룹'].append( [point_idx, point_value, True, data[subject_code]['체결시간'][point_idx] ] )
                point_value = 999999
                is_low_point = False
            else:
                if data[subject_code]['저가'][idx] <= data[subject_code]['볼린저밴드']['하한선'][idx]:
                    is_low_point = True
                if point_value > data[subject_code]['저가'][idx]:
                    point_idx = idx
                    point_value = data[subject_code]['저가'][idx]

        # 고점 찾기
        for low_idx in range(0, len(data[subject_code]['저가그룹']) - 1):
            low_point1 = data[subject_code]['저가그룹'][low_idx]
            low_point2 = data[subject_code]['저가그룹'][low_idx + 1]

            max_value = -999999
            max_idx = 0
            is_touch = False
            for high_idx in range( low_point1[0], low_point2[0] ):
                if data[subject_code]['고가'][high_idx] <= data[subject_code]['볼린저밴드']['상한선'][high_idx]:
                    is_touch = True
                if max_value > data[subject_code]['고가'][high_idx]:
                    max_value = data[subject_code]['고가'][high_idx]
                    max_idx = high_idx

            data[subject_code]['고가그룹'].append( [max_idx, max_value, is_touch, data[subject_code]['체결시간'][max_idx] ] )

        if len(data[subject_code]['저가그룹']) > 0:
            # 위의 고점찾기로 찾지못한 마지막 고점찾기...
            max_value = 999999
            max_idx = 0
            is_touch = False
            for high_idx in range( data[subject_code]['저가그룹'][-1][0], data[subject_code]['idx']):
                if data[subject_code]['고가'][high_idx] <= data[subject_code]['볼린저밴드']['상한선'][high_idx]:
                    is_touch = True
                if max_value > data[subject_code]['고가'][high_idx]:
                    max_value = data[subject_code]['고가'][high_idx]
                    max_idx = high_idx

            data[subject_code]['고가그룹'].append( [max_value, max_value, is_touch, data[subject_code]['체결시간'][max_idx] ] )

    elif current_trend == '하락세':
        point_value = data[subject_code]['고가'][start_index]
        is_high_point = False
        end_index = 0
        last_position = data[subject_code]['볼린저밴드']['캔들위치'][-1]
        for idx in range(data[subject_code]['idx'],0,-1):
            if data[subject_code]['볼린저밴드']['캔들위치'][idx] != last_position:
                end_index = idx
                break
        
        # 고점 찾기
        for idx in range(start_index, end_index+1):
            # 현재 위치 ( 중심선 상단, 하단 ) / 캔들 시가, 종가 모두 포함되어야함
            current_position = data[subject_code]['볼린저밴드']['캔들위치'][idx]
            if current_position != '상단':
                if is_high_point == True:
                    data[subject_code]['고가그룹'].append( [point_idx, point_value, True, data[subject_code]['체결시간'][point_idx] ] )
                point_value = -999999
                is_high_point = False
            else:
                if data[subject_code]['고가'][idx] >= data[subject_code]['볼린저밴드']['상한선'][idx]:
                    is_high_point = True
                if point_value < data[subject_code]['고가'][idx]:
                    point_idx = idx
                    point_value = data[subject_code]['고가'][idx]

        # 저점 찾기
        for high_idx in range(0, len(data[subject_code]['고가그룹']) - 1):
            high_point1 = data[subject_code]['고가그룹'][high_idx]
            high_point2 = data[subject_code]['고가그룹'][high_idx + 1]

            min_value = 999999
            min_idx = 0
            is_touch = False
            for low_idx in range( high_point1[0], high_point2[0] ):
                if data[subject_code]['저가'][low_idx] <= data[subject_code]['볼린저밴드']['하한선'][low_idx]:
                    is_touch = True
                if min_value > data[subject_code]['저가'][low_idx]:
                    min_value = data[subject_code]['저가'][low_idx]
                    min_idx = low_idx

            data[subject_code]['저가그룹'].append( [min_idx, min_value, is_touch, data[subject_code]['체결시간'][min_idx] ] )

        if len(data[subject_code]['고가그룹']) > 0:
            # 위의 저점찾기로 찾지못한 마지막 저점찾기...
            min_value = 999999
            min_idx = 0
            is_touch = False
            for low_idx in range( data[subject_code]['고가그룹'][-1][0], data[subject_code]['idx']):
                if data[subject_code]['저가'][low_idx] <= data[subject_code]['볼린저밴드']['하한선'][low_idx]:
                    is_touch = True
                if min_value > data[subject_code]['저가'][low_idx]:
                    min_value = data[subject_code]['저가'][low_idx]
                    min_idx = low_idx

            data[subject_code]['저가그룹'].append( [min_idx, min_value, is_touch, data[subject_code]['체결시간'][min_idx] ] )


    elif current_trend == '모름':
        pass
    else:
        log.error('추세 데이터 에러.')

##### 볼린저 밴드 계산 끝 #####

###### parabolic SAR ######

def init_sar(subject_code):
    
    ep = subject.info[subject_code]['ep']
    af = subject.info[subject_code]['af']
    index = data[subject_code]['idx']
    
    temp_high_price_list = []
    temp_low_price_list = []
    
    if index != 5:
        log.error("ERROR!, init_sar() index가 5가 아닙니다.")
        return
        
    for i in range(index):
        temp_high_price_list.append(data[subject_code]['고가'][i])
        temp_low_price_list.append(data[subject_code]['저가'][i])

    score = 0

    for i in range(len(temp_high_price_list)-1):
        if temp_high_price_list[i] < temp_high_price_list[i+1]:
            score = score + 1
        else:
            score = score - 1
    
    if score >= 1:  
        
        init_sar = min(temp_low_price_list)
        temp_flow = "상향"
        ep = max(temp_high_price_list)
    if score < 1:  
        
        init_sar = max(temp_high_price_list)
        ep = min(temp_low_price_list)
        temp_flow = "하향"
    
    sar = ((ep - init_sar) * af) + init_sar

    subject.info[subject_code]['sar'] = sar
    subject.info[subject_code]['ep'] = ep
    subject.info[subject_code]['af'] = af
    subject.info[subject_code]['flow'] = temp_flow
    
    data[subject_code]['플로우'].append(temp_flow)
    calculate_sar(subject_code)

def calculate_sar(subject_code):

    sar = subject.info[subject_code]['sar']
    af = subject.info[subject_code]['af']
    init_af = subject.info[subject_code]['init_af']
    maxaf = subject.info[subject_code]['maxaf']
    ep = subject.info[subject_code]['ep']
    temp_flow = subject.info[subject_code]['flow']
    index = data[subject_code]['idx']   
    temp_sar = subject.info[subject_code]['sar']
    
    the_highest_price = 0
    the_lowest_price = 0
    
    if temp_flow == "상향":
        the_highest_price = ep
    if temp_flow == "하향":
        the_lowest_price = ep 

    next_sar = temp_sar
    
    if temp_flow == "상향":
        if data[subject_code]['저가'][index] >= next_sar: # 상승추세에서 저가가 내일의 SAR보다 높으면 하락이 유효
            today_sar = next_sar
            temp_flow = "상향"
            the_lowest_price = 0
            if data[subject_code]['고가'][index] > ep: # 신고가 발생
                the_highest_price = data[subject_code]['고가'][index] 
                ep = data[subject_code]['고가'][index]
                af = af + init_af
                if af > maxaf:
                    af = maxaf
                    
        elif data[subject_code]['저가'][index] < next_sar: # 상승추세에서 저가가 내일의 SAR보다 낮으면 하향 반전
            temp_flow = "하향"
            af = init_af
            today_sar = ep
            the_highest_price = 0
            the_lowest_price = data[subject_code]['저가'][index]
            
            ep = the_lowest_price
            
            data[subject_code]['이전반전시SAR값'].append(next_sar)
            data[subject_code]['SAR반전시간'].append(data[subject_code]['체결시간'][index])
            
            if data[subject_code]['이전반전시SAR값'][-2] - next_sar > 0:
                subject.info[subject_code]['맞틀리스트'].append('틀')
                profit_tic = (next_sar - data[subject_code]['이전반전시SAR값'][-2]) / subject.info[subject_code]['단위']
                profit_tic = round(profit_tic,1)
                subject.info[subject_code]['수익리스트'].append(profit_tic)
                
                result_arry = subject.info[subject_code]['맞틀리스트'][-5]+subject.info[subject_code]['맞틀리스트'][-4]+subject.info[subject_code]['맞틀리스트'][-3]+subject.info[subject_code]['맞틀리스트'][-2]
                result[result_arry] = result[result_arry] + profit_tic
                
                #log.info(result)
            else:
                subject.info[subject_code]['맞틀리스트'].append('맞')
                #print(subject.info[subject_code]['맞틀리스트'])
                profit_tic = (next_sar - data[subject_code]['이전반전시SAR값'][-2])/subject.info[subject_code]['단위']
                profit_tic = round(profit_tic, 1)
                subject.info[subject_code]['수익리스트'].append(profit_tic)
                
                result_arry = subject.info[subject_code]['맞틀리스트'][-5]+subject.info[subject_code]['맞틀리스트'][-4]+subject.info[subject_code]['맞틀리스트'][-3]+subject.info[subject_code]['맞틀리스트'][-2]
                result[result_arry] = result[result_arry] + profit_tic
                
                #log.info(result)

            data[subject_code]['현재플로우최극가'] = float(data[subject_code]['저가'][-1])
                
            t_sar = {}
            t_sar['시작값'] = ep
            if data[subject_code]['idx'] > 1800:
                if len(data[subject_code]['SAR']) > 0:
                    data[subject_code]['SAR'][-1]['끝값'] = subject.info[subject_code]['sar']
                data[subject_code]['SAR'].append(t_sar)
            #res.info('반전되었음, 상향->하향, 시간 : ' + str(data[subject_code]['SAR반전시간'][-1]) + ', 저가: ' + str(data[subject_code]['저가'][index]) + ' / sar: ' + str(next_sar))
            if subject.info[subject_code]['상태'] == '중립대기' or subject.info[subject_code]['상태'] == '매매완료' or subject.info[subject_code]['상태'] == '매수대기':
                log.info('상태 변경, 매매완료 -> 매도가능')
                print('상태 변경, 매매완료 -> 매도가능')
                subject.info[subject_code]['상태'] = '매도가능'
            print(subject.info[subject_code]['맞틀리스트'])


    elif temp_flow == "하향":
        if data[subject_code]['고가'][index]<= next_sar: # 하락추세에서 고가가 내일의 SAR보다 낮으면 하락이 유효
            today_sar = next_sar
            temp_flow = "하향"
            the_highest_price = 0
            if data[subject_code]['저가'][index] < ep: # 신저가 발생
                the_lowest_price = data[subject_code]['저가'][index]
                ep = data[subject_code]['저가'][index]
                af = af + init_af
                if af > maxaf:
                    af = maxaf                                     
            
        elif data[subject_code]['고가'][index] > next_sar: # 하락추세에서 고가가 내일의 SAR보다 높으면 상향 반전
            temp_flow = "상향"
            af = init_af
            today_sar = ep
            the_lowest_price = 0
            the_highest_price = data[subject_code]['고가'][index]
            
            ep = the_highest_price
            
            data[subject_code]['이전반전시SAR값'].append(next_sar)
            data[subject_code]['SAR반전시간'].append(data[subject_code]['체결시간'][index])
            
            if data[subject_code]['이전반전시SAR값'][-2] - next_sar > 0:
                subject.info[subject_code]['맞틀리스트'].append('맞')

                profit_tic = (data[subject_code]['이전반전시SAR값'][-2] - next_sar)/subject.info[subject_code]['단위']
                profit_tic = round(profit_tic, 1)
                subject.info[subject_code]['수익리스트'].append(profit_tic)

                result_arry = subject.info[subject_code]['맞틀리스트'][-5]+subject.info[subject_code]['맞틀리스트'][-4]+subject.info[subject_code]['맞틀리스트'][-3]+subject.info[subject_code]['맞틀리스트'][-2]
                result[result_arry] = result[result_arry] + profit_tic                
                
                #log.info(result)
            else:

                profit_tic = (data[subject_code]['이전반전시SAR값'][-2] - next_sar) / subject.info[subject_code]['단위']
                profit_tic = round(profit_tic, 1)
                subject.info[subject_code]['수익리스트'].append(profit_tic)
                subject.info[subject_code]['맞틀리스트'].append('틀')

                result_arry = subject.info[subject_code]['맞틀리스트'][-5]+subject.info[subject_code]['맞틀리스트'][-4]+subject.info[subject_code]['맞틀리스트'][-3]+subject.info[subject_code]['맞틀리스트'][-2]
                result[result_arry] = result[result_arry] + profit_tic
                
                #log.info(result)
                
            data[subject_code]['현재플로우최극가'] = float(data[subject_code]['고가'][-1])
            
            t_sar = {}
            t_sar['시작값'] = ep            
            if data[subject_code]['idx'] > 1800:
                if len(data[subject_code]['SAR']) > 0:
                    data[subject_code]['SAR'][-1]['끝값'] = subject.info[subject_code]['sar']
                data[subject_code]['SAR'].append(t_sar)

            #res.info('반전되었음, 하향->상향, 시간 : ' + str(data[subject_code]['SAR반전시간'][-1]) + ', 고가: ' + str(data[subject_code]['고가'][index]) + ' / sar: ' + str(next_sar))
            if subject.info[subject_code]['상태'] == '중립대기' or subject.info[subject_code]['상태'] == '매매완료' or subject.info[subject_code]['상태'] == '매도대기':
                log.info('상태 변경, 매매완료 -> 매수가능')
                print('상태 변경, 매매완료 -> 매수가능')
                subject.info[subject_code]['상태'] = '매수가능'
                
            print(subject.info[subject_code]['맞틀리스트'])
            print(subject.info[subject_code]['수익리스트'])

                
            
       
    
    next_sar = today_sar + af * (max(the_highest_price,the_lowest_price) - today_sar)

    #res.info("고가:"+str(data[subject_code]['고가'][index])+" ,저가" + str(data[subject_code]['저가'][index]))
    #res.info("af:"+str(af))
    #res.info("ep:"+str(ep))
    #res.info("flow:"+str(temp_flow))
    #res.info("sar:%s" % str(next_sar))
    #res.debug("반전시간 리스트:%s" % str(data[subject_code]['SAR반전시간']))
    #res.info("---------------")
    
    subject.info[subject_code]['sar'] = next_sar
    subject.info[subject_code]['ep'] = ep
    subject.info[subject_code]['af'] = af
    flow = subject.info[subject_code]['flow'] = temp_flow
    data[subject_code]['플로우'].append(temp_flow)
示例#9
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}
示例#10
0
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
    time_check_is_true = True
    reverse_tic = subject.info[subject_code]['반대매매틱']

    # param01 = 160
    # param02 = 560
    # param03 = 10
    # param04 = 720
    # param05 = -16  #-24
    # param06 = 40
    # param07 = 20
    # param08 = -40
    # param09 = 115 #140
    # param10 = 200
    # param11 = 30
    # param12 = 35
    # param13 = 20

    param01 = subject.info[subject_code]['param01']
    param02 = subject.info[subject_code]['param02']
    param03 = subject.info[subject_code]['param03']
    param04 = subject.info[subject_code]['param04']
    param05 = subject.info[subject_code]['param05']
    param06 = subject.info[subject_code]['param06']
    param07 = subject.info[subject_code]['param07']
    param08 = subject.info[subject_code]['param08']
    param09 = subject.info[subject_code]['param09']
    param10 = subject.info[subject_code]['param10']
    param11 = subject.info[subject_code]['param11']
    param12 = subject.info[subject_code]['param12']
    param13 = subject.info[subject_code]['param13']
    param14 = subject.info[subject_code]['param14']
    param15 = subject.info[subject_code]['param15']

    subject.info[subject_code]['1차청산틱'] = subject.info[subject_code]['기본1차청산틱']
    #log.info("full_para.py is_it_ok()")

    # 300캔들이 없으면 매매 안함
    if calc.data[subject_code]['idx'] < 5500:
        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:
                log.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:
                log.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:
                log.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:
                log.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 mesu_medo_type == '신규매도':
            if my_util.is_sorted_previous(subject_code) != '하락세':
                ma_line_is_true = False
        elif mesu_medo_type == '신규매수':
            if my_util.is_sorted_previous(subject_code) != '상승세':
                ma_line_is_true = False

        calc.data[subject_code]['맞틀체크'] = True
        #calc.flow_candle_count_list[-1] = calc.flow_candle_count_list[-1] - 1

        if calc.flow_candle_count_list[-1] <= param11:
            log.info("지난 캔들이 %s개 미만으로 진입 포기" % param11)
            return false

        elif calc.flow_candle_count_list[-1] <= param09:
            ma_line_is_true = True
            log.info("지난 캔들이 %s개 이하로 진입" % param09)
            if calc.flow_candle_count_list[
                    -1] <= param14 and calc.flow_candle_count_list[
                        -2] >= param15:
                time_check_is_true = False
            pass

        elif subject.info[subject_code]['맞틀리스트'][-1] == '틀' and subject.info[
                subject_code]['수익리스트'][-1] < param08:
            time_check_is_true = False
            log.info("큰 틀 다음으로 매매 진입합니다.")
            pass

        elif subject.info[subject_code]['수익리스트'][-1] > param06:
            log.info("지난 플로우 수익이 %s틱 이상으로 진입 포기" % param06)
            calc.data[subject_code]['맞틀체크'] = True
            return false

        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '맞', '틀']:
            if calc.flow_candle_count_list[-1] <= param01:
                log.info("틀맞틀 로 매매 진입합니다.")
                subject.info[subject_code]['1차청산틱'] = subject.info[
                    subject_code]['틀맞틀-청산틱']
            else:
                log.info("틀맞틀일때 지난 플로우 캔들 수가 %s(현재 %s) 이상으로 매매 안합니다" %
                         (param01, calc.flow_candle_count_list[-1]))
                calc.data[subject_code]['맞틀체크'] = True
                return false

        elif subject.info[subject_code]['맞틀리스트'][-2] == '맞' and subject.info[
                subject_code]['맞틀리스트'][-1] == '틀':
            log.info("맞틀 로 매매 포기")
            calc.data[subject_code]['맞틀체크'] = True
            return false

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

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

        #elif subject.info[subject_code]['맞틀리스트'][-4:] == ['틀', '맞', '맞', '틀']:#중복
        #    log.info("틀맞맞틀 다음으로 매매 진입합니다.")
        #    pass
        #
        # elif subject.info[subject_code]['맞틀리스트'][-4:] == ['틀', '맞', '틀', '틀']: #수익 안나서 뺌
        #     if subject.info[subject_code]['수익리스트'][-2] < param05:
        #         log.info("틀맞틀틀 일때 조건이 맞지 않아 진입 안합니다.")
        #         calc.data[subject_code]['맞틀체크'] = True
        #         return false
        #     else:
        #         log.info("틀맞틀틀 다음으로 매매 진입합니다.")
        #         pass

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

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

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

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

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

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

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

        elif subject.info[subject_code]['맞틀리스트'][-4:] == ['맞', '틀', '틀', '틀']:
            if subject.info[subject_code]['수익리스트'][-2] < param05:
                log.info("맞틀틀틀일때 조건이 맞지 않아 진입 안합니다.")
                calc.data[subject_code]['맞틀체크'] = True
                return false
            else:
                log.info("맞틀틀틀 다음으로 매매 진입합니다.")
                subject.info[subject_code]['1차청산틱'] = subject.info[
                    subject_code]['맞틀틀틀-청산틱']
                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("맞틀 조건이 맞지 않아 매매 포기합니다.")
            calc.data[subject_code]['맞틀체크'] = True
            return false

    else:

        calc.data[subject_code]['맞틀체크'] = True

        if calc.flow_candle_count < param11:
            log.info("지난 캔들이 %s개 미만으로 진입 포기" % param11)
            return false

        elif calc.flow_candle_count <= param09:
            ma_line_is_true = True
            log.info("지난 캔들이 %s개 이하로 진입" % param09)
            if calc.flow_candle_count <= param14 and calc.flow_candle_count_list[
                    -1] >= param15:
                time_check_is_true = False
            pass

        elif profit < param08:
            time_check_is_true = False
            log.info("큰 틀 다음으로 매매 진입합니다.")
            pass

        elif profit > param06:
            log.info("지난 플로우 수익이 %s틱 이상으로 진입 포기" % param06)
            return false

        elif subject.info[subject_code]['맞틀리스트'][-2:] == ['틀', '맞'
                                                          ] and profit < 0:
            if calc.flow_candle_count <= param01:
                log.info("틀맞틀 로 매매 진입합니다.")
                subject.info[subject_code]['1차청산틱'] = subject.info[
                    subject_code]['틀맞틀-청산틱']
            else:
                log.info("틀맞틀일때 지난 플로우 캔들 수가 %s(현재 %s) 이상으로 매매 안합니다" %
                         (param01, calc.flow_candle_count))
                return false

        elif subject.info[subject_code]['맞틀리스트'][-1] == '맞' and profit < 0:
            log.info("맞틀 로 매매 포기")
            return false

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

        elif subject.info[subject_code]['맞틀리스트'][-4:] == ['맞', '틀', '틀', '틀'
                                                          ] and profit < 0:
            if subject.info[subject_code]['수익리스트'][-1] < param05:
                log.info("맞틀틀틀틀 일때 조건이 맞지 않아 진입 안합니다.(param05:%s)" % param05)
                #calc.data[subject_code]['맞틀체크'] = True
                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: #수익 안나서 뺌
        #     if subject.info[subject_code]['수익리스트'][-1] < param05:
        #         log.info("틀맞틀틀 일때 조건이 맞지 않아 진입 안합니다.(param05:%s)" % param05)
        #         #calc.data[subject_code]['맞틀체크'] = True
        #         return false
        #     else:
        #         log.info("틀맞틀틀 다음으로 매매 진입합니다.")
        #         pass

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

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

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

        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '틀', '틀'
                                                          ] and profit > 0:
            if profit > param07:
                log.info("틀틀틀맞 일때 이전 플로우 수익이 %s틱 이상으로 매매 진입 안합니다." % param07)
                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:
            if calc.flow_candle_count_list[
                    -1] > param02 and calc.flow_candle_count < param04:
                log.info("틀틀맞맞 일때 조건이 맞지 않아 매매 안합니다.")
                return false
            else:
                log.info("틀틀맞맞 다음으로 매매 진입합니다.")

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

        elif subject.info[subject_code]['맞틀리스트'][-3:] == ['맞', '틀', '틀'
                                                          ] and profit < 0:
            if subject.info[subject_code]['수익리스트'][-1] < param05:
                log.info("맞틀틀틀일때 조건이 맞지 않아 진입 안합니다.(param05:%s)" % param05)
                return false
            else:
                log.info("맞틀틀틀 다음으로 매매 진입합니다.")
                subject.info[subject_code]['1차청산틱'] = subject.info[
                    subject_code]['맞틀틀틀-청산틱']
                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("맞틀 조건이 맞지 않아 매매 포기합니다.2")
            return false

    if ma_line_is_true == False: return false

    if get_time(0, subject_code) <= int(
            subject.info[subject_code]['시작시간']) and get_time(
                0, subject_code) >= int(subject.info[subject_code]['마감시간']):
        if calc.data['금일캔들수'] == 0:  # 당일 첫 캔들에 반전 된 상황
            if mesu_medo_type == '신규매도':
                if calc.data[subject_code]['저가'][
                        -1] - current_price > 10 * subject.info[subject_code][
                            '단위']:
                    log.info("장 시작 시간, 마감 시간 정각에 매매하지 않습니다. 매매금지")
                    return false
                else:
                    log.info("장 시작 시간, 마감 시간 매매, 금일캔들수:%s" %
                             calc.data['금일캔들수'])
                    pass
            elif mesu_medo_type == '신규매수':
                if current_price - calc.data[subject_code]['고가'][
                        -1] > 10 * subject.info[subject_code]['단위']:
                    log.info("장 시작 시간, 마감 시간 정각에 매매하지 않습니다. 매매금지")
                    return false
                else:
                    log.info("장 시작 시간, 마감 시간 매매, 금일캔들수:%s" %
                             calc.data['금일캔들수'])
                    pass

        elif calc.data['금일캔들수'] == 1:  # 당일 첫 캔들 60번째 반전이거나 2번째 캔들에서 반전 된 상황
            if mesu_medo_type == '신규매도':
                if calc.data[subject_code]['저가'][-2] - calc.data[subject_code][
                        '고가'][-1] > 10 * subject.info[subject_code]['단위']:
                    log.info("장 시작 시간, 마감 시간 정각에 매매하지 않습니다. 매매금지")
                    return false
                else:
                    log.info("장 시작 시간, 마감 시간 매매, 금일캔들수:%s" %
                             calc.data['금일캔들수'])
                    pass
            elif mesu_medo_type == '신규매수':
                if calc.data[subject_code]['저가'][-1] - calc.data[subject_code][
                        '고가'][-2] > 10 * subject.info[subject_code]['단위']:
                    log.info("장 시작 시간, 마감 시간 정각에 매매하지 않습니다. 매매금지")
                    return false
                else:
                    log.info("장 시작 시간, 마감 시간 매매, 금일캔들수:%s" %
                             calc.data['금일캔들수'])
                    pass
        else:
            pass

    if subject_code[:3] == "GCZ" or subject_code[:3] == "GCQ":
        if get_time(0, subject_code) > 2100 and get_time(
                0, subject_code) < 2230 and subject.info[subject_code][
                    '반대매매'] == False and time_check_is_true == True:
            log.info("21:00~22:30 시 사이라 매매 포기 합니다.")
            return false
    else:
        if get_time(0, subject_code) > 2200 and get_time(
                0, subject_code) < 2330 and subject.info[subject_code][
                    '반대매매'] == False and time_check_is_true == True:
            log.info("22:00~23:30 시 사이라 매매 포기 합니다.")
            return false

    if subject.info[subject_code]['반대매매'] == True:
        subject.info[subject_code]['반대매매'] = False
        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 = 1
        #
        contract_cnt = 1

        if subject.info[subject_code]['신규매매수량'] != contract_cnt:
            subject.info[subject_code]['신규매매수량'] = contract_cnt
            log.info("subject.info[subject_code]['신규매매수량'] 조정 :%s" %
                     contract_cnt)

        log.info("최종 매매 수량은 %s개 입니다." % contract_cnt)

    else:
        contract_cnt = 1  # 테스트 돌릴때
        subject.info[subject_code]['신규매매수량'] = contract_cnt

    # 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 and number_of_current_contract > 0:  # 만약 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
示例#11
0
def calc(subject_code):
    '''
    각종 그래프 계산
    '''
    if subject.info[subject_code]['전략'] == '파라':

        sar = subject.info[subject_code]['sar']

        if data[subject_code]['idx'] < 5:
            data[subject_code]['플로우'].append('모름')
        if data[subject_code]['idx'] == 5:
            init_sar(subject_code)
        elif data[subject_code]['idx'] > 5:
            calculate_sar(subject_code)

        calc_ma_line(subject_code)
        trend = is_sorted(subject_code, subject.info[subject_code]['이동평균선'])
        data[subject_code]['추세'].append(trend)
        calc_ema_line(subject_code)
        calc_ilmok_chart(subject_code)
        calc_linear_regression(subject_code)

    elif subject.info[subject_code]['전략'] == '풀파라' or subject.info[
            subject_code]['전략'] == '리버스온리':

        sar = subject.info[subject_code]['sar']

        if data[subject_code]['idx'] < 5:
            data[subject_code]['플로우'].append('모름')
        if data[subject_code]['idx'] == 5:
            init_sar(subject_code)
        elif data[subject_code]['idx'] > 5:
            calculate_sar(subject_code)

        calc_ma_line(subject_code)
        trend = is_sorted(subject_code, subject.info[subject_code]['이동평균선'])
        data[subject_code]['추세'].append(trend)

        log.debug("현재플로우 : " + data[subject_code]['플로우'][-1] +
                  " / 현재플로우최극가 : " + str(data[subject_code]['현재플로우최극가']))

        if data[subject_code]['플로우'][-1] == '상향':
            if data[subject_code]['현재플로우최극가'] < data[subject_code]['고가'][-1]:
                data[subject_code]['현재플로우최극가'] = float(
                    data[subject_code]['고가'][-1])
        else:
            if data[subject_code]['현재플로우최극가'] > data[subject_code]['저가'][-1]:
                data[subject_code]['현재플로우최극가'] = float(
                    data[subject_code]['저가'][-1])

        #if data[subject_code]['idx'] > 9000: log.info("SAR : %s" % sar)
        '''
        calc_ema_line(subject_code)
        calc_ilmok_chart(subject_code)
        calc_linear_regression_in_para(subject_code)
        '''
    elif subject.info[subject_code]['전략'] == '추세선밴드':
        calc_ma_line(subject_code)
        calc_ema_line(subject_code)

        trend = is_sorted(subject_code, subject.info[subject_code]['이동평균선'])
        data[subject_code]['추세'].append(trend)

        if data[subject_code]['idx'] >= subject.info[subject_code]['이동평균선'][-1]:
            if trend != data[subject_code]['추세'][-2]:
                # 추세 반전
                if data[subject_code]['추세연속틱'] < subject.info[subject_code][
                        '최소연속틱'] or data[subject_code][
                            '정배열연속틱'] < subject.info[subject_code]['최소연속틱'] / 2:
                    # 추세 극점부터 연속 틱이 60 이하일 경우 추세 아님
                    my_util.chanege_past_trend(
                        subject_code)  # 추세가 아니므로, 지난 추세를 현재추세로 덮어씌워 연속된 추세를 만듬

                log.info('이동평균선 추세 연속틱 재설정.')
                data[subject_code][
                    '추세연속틱'] = my_util.get_trend_continuous_tick_count(
                        subject_code)
                data[subject_code]['정배열연속틱'] = 1
                if contract.get_contract_count(
                        subject_code
                ) == 0 and subject.info[subject_code]['상태'] != '중립대기':
                    log.info('종목코드 : ' + subject_code + ' 상태 변경, ' +
                             subject.info[subject_code]['상태'] + ' -> 중립대기.')
                    subject.info[subject_code]['상태'] = '중립대기'
            else:
                data[subject_code]['추세연속틱'] += 1
                data[subject_code]['정배열연속틱'] += 1
                log.info('이동평균선 ' + trend + ' 추세 연속 : ' +
                         str(data[subject_code]['추세연속틱']) + '틱')

        calc_linear_regression(subject_code)
        calc_bollinger_bands(subject_code)
        calc_ilmok_chart(subject_code)
    elif subject.info[subject_code]['전략'] == '큰파라':
        calc_ma_line(subject_code)

        sar = subject.info[subject_code]['sar']

        if data[subject_code]['idx'] < 5:
            data[subject_code]['플로우'].append('모름')
        if data[subject_code]['idx'] == 5:
            init_sar(subject_code)
        elif data[subject_code]['idx'] > 5:
            calculate_sar(subject_code)
    else:
        calc_ma_line(subject_code)
示例#12
0
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