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
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
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
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
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
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:
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
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
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