Exemplo n.º 1
0
def get_time(add_min, subject_code):
    # 현재 시간 정수형으로 return
    if d.get_mode() == d.REAL:  # 실제투자
        current_hour = time.localtime().tm_hour
        current_min = time.localtime().tm_min
        current_min += add_min
        if current_min >= 60:
            current_hour += 1
            current_min -= 60

        current_time = current_hour * 100 + current_min

    elif d.get_mode() == d.TEST:  # 테스트
        current_hour = int(str(calc.data[subject_code]['체결시간'][-1])[8:10])
        current_min = int(str(calc.data[subject_code]['체결시간'][-1])[10:12])
        current_min += add_min
        if current_min >= 60:
            current_hour += 1
            current_min -= 60

        current_time = current_hour * 100 + current_min

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

    return current_time
Exemplo n.º 2
0
def is_holiday(subject_code):
    if d.get_mode() is d.REAL:
        weekno = datetime.datetime.today().weekday()
        if weekno < 5:
            return False
        else:
            current_time = get_time(0)
            if current_time >= 0 and current_time <= 700:
                weekno -= 1

            if weekno < 5: return False

        return True
    elif d.get_mode() is d.TEST:
        _time = str(calc.data[subject_code]['체결시간'][-1])
        today = datetime.date(int(_time[:4]), int(_time[4:6]), int(_time[6:8]))
        weekno = datetime.datetime.weekday(today)
        if weekno < 5:
            return False
        else:
            current_time = get_time(0)
            if current_time >= 0 and current_time <= 700:
                weekno -= 1

            if weekno < 5: return False

        return True
    return False
Exemplo n.º 3
0
def is_trade_time(subject_code):
    if d.get_mode() is d.TEST: return True
    if d.get_mode() is d.TEST and calc.data[subject_code]['idx'] < 10:
        return True
    if is_end_time(3,
                   subject_code) is False or is_holiday(subject_code) is False:
        return True
    return False
Exemplo n.º 4
0
def is_end_time(add_min, subject_code):
    if d.get_mode() is d.REAL:
        if get_time(0) < int(subject.info[subject_code]['마감시간']) and get_time(
                add_min) >= int(subject.info[subject_code]['마감시간']):
            return True
    elif d.get_mode() is d.TEST:
        _time = str(calc.data[subject_code]['체결시간'][-1])
        current_hour = int(_time[-6:-4])
        current_min = int(_time[-4:-2])
        after_hour = current_hour
        after_min = current_min + add_min
        if after_min >= 60:
            after_hour += 1
            after_min -= 60

        current = current_hour * 100 + current_min
        after = after_hour * 100 + after_min

        if current < int(subject.info[subject_code]['마감시간']) and after >= int(
                subject.info[subject_code]['마감시간']):
            return True

    return False
Exemplo n.º 5
0
def is_it_OK(subject_code, current_price):
    mesu_medo_type = None
    false = {'신규주문': False}

    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]['상태'])
        print('신규 주분 가능상태 ㄴㄴ')
        return false

    if subject.info[subject_code]['반대매매'] == True:
        print("반대매매")
        return false

    ## waterfall code ##

    if subject.info[subject_code]['워터폴매매'] == False and subject.info[
            subject_code]['워터폴매매상태'] == '대기':
        #급락했을때
        if (calc.data[subject_code]['고가'][-80] - calc.data[subject_code]['저가']
            [-1]) / subject.info[subject_code]['단위'] > 85:

            subject.info[subject_code]['워터폴매매'] = True
            subject.info[subject_code]['워터폴매매상태'] = '매수대기'
            log.info("급락 확인!  워터폴 매수대기 상태로 변경")
            subject.info[subject_code]['워터폴매매틱'] = int(
                (calc.data[subject_code]['고가'][-80] -
                 calc.data[subject_code]['저가'][-1]) /
                subject.info[subject_code]['단위'] * 0.4)

        #급등했을때
        elif (calc.data[subject_code]['고가'][-1] - calc.data[subject_code]['저가']
              [-80]) / subject.info[subject_code]['단위'] > 85:

            subject.info[subject_code]['워터폴매매'] = True
            subject.info[subject_code]['워터폴매매상태'] = '매도대기'
            log.info("급등 확인! 워터폴 매도대기 상태로 변경")
            subject.info[subject_code]['워터폴매매틱'] = int(
                (calc.data[subject_code]['고가'][-1] -
                 calc.data[subject_code]['저가'][-80]) /
                subject.info[subject_code]['단위'] * 0.4)

        else:
            return false

    elif subject.info[subject_code]['워터폴매매'] == True:
        if subject.info[subject_code]['워터폴매매상태'] == '매도대기':
            #if is_it_blue_candle(subject_code) == True:
            #subject.info[subject_code]['워터폴매매틱'] = int(((calc.data[subject_code]['고가'][-5] - current_price) / subject.info[subject_code]['단위']) * 0.5 ) #급등한 격차의 반 * 0.7(보수적으로잡음)
            mesu_medo_type = '신규매도'
            #else:
            #    log.info("워터풀 매도 대기중으로 음봉이 나올때까지 대기합니다.")
            #    return false

        elif subject.info[subject_code]['워터폴매매상태'] == '매수대기':
            #if is_it_red_candle(subject_code) == True:
            #subject.info[subject_code]['워터폴매매틱'] = int(((current_price - calc.data[subject_code]['저가'][-5]) / subject.info[subject_code]['단위']) * 0.5 ) #급락한 격차의 반 * 0.7(보수적으로잡음)
            mesu_medo_type = '신규매수'
            #else:
            #    log.info("워터풀 매수 대기중으로 양봉이 나올때까지 대기합니다.")
            #    return false

    else:
        log.error("unknown error")
        return false

    if subject.info[subject_code]['워터폴매매틱'] < 5:
        log.info("워터폴 익절틱, 손절틱이 5틱 이하로 매매안합니다.")
        return false
    if subject.info[subject_code]['워터폴매매틱'] > 0:
        pass
        #log.info("워터폴매매틱 =%s" % subject.info[subject_code]['워터폴매매틱'])
    profit_tick = subject.info[subject_code]['워터폴매매틱']
    sonjal_tick = subject.info[subject_code]['워터폴매매틱']
    #profit_tick = 20
    # sonjal_tick = 15
    # contract_cnt = 2
    if d.get_mode() == d.REAL:  # 실제 투자 할때
        possible_contract_cnt = int(contract.my_deposit /
                                    subject.info[subject_code]['위탁증거금'])
        contract_cnt = int(contract.my_deposit / 1.2 /
                           subject.info[subject_code]['위탁증거금'])
        if contract.recent_trade_cnt == possible_contract_cnt:
            contract_cnt = possible_contract_cnt
        log.info("매매 예정 수량은 %s개 입니다." % contract_cnt)
        contract_cnt = 2
    else:
        contract_cnt = 2  # 테스트 돌릴때

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

    if mesu_medo_type == None:
        # print('매매타입이 없음')
        return false
    if contract_cnt == 0: return false

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

    if mesu_medo_type == '신규매수': subject.info[subject_code]['워터폴매매상태'] = '매수중'
    elif mesu_medo_type == '신규매도':
        subject.info[subject_code]['워터폴매매상태'] = '매도중'

    global timestamp

    # log.info('워터폴 시간 체크 진입 전')
    if timestamp == None:
        # log.info('워터폴 시간값이 없음')
        pass
    else:
        # log.info('워터폴 시간 값 : ' + str(timestamp))
        if abs(int(get_time(0, subject_code)) - int(timestamp)) >= 500:
            timestamp = get_time(0, subject_code)
            print('timestamp 갱신')
            pass
        else:
            # log.info('매매후 5분이 지나지 않아 매매포기')
            subject.info[subject_code]['워터폴매매상태'] = '대기'
            subject.info[subject_code]['워터폴매매'] = False
            return false
    timestamp = get_time(0, subject_code)

    return order_contents
Exemplo n.º 6
0
if __name__ == "__main__":
    log.init(os.path.dirname(os.path.abspath(__file__).replace('\\', '/')))
    res.init(os.path.dirname(os.path.abspath(__file__).replace('\\', '/')))

    d.mode = 0

    if len(sys.argv) == 1:
        print('실제투자(1), 테스트(2), DB Insert(3)')
        d.mode = int(input())

    else:
        d.mode = int(sys.argv[1])

    # cmd.init()
    if d.get_mode() == 1:

        try:
            kw = kiwoom.api()
        except Exception as err:
            body = str(err) + '\n'
            body = body + str(sys.exc_info()[0])
            gmail.send_email("[긴급] 해동이 작동중지.", body)

    elif d.get_mode() == 2:
        tester.init()

    elif d.get_mode() == 3:
        kw = dbinsert.api()

    else:
Exemplo n.º 7
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
Exemplo n.º 8
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
Exemplo n.º 9
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