def send_order(contract_type, subject_code, contract_cnt, order_type, current_price=None): order_info = {} log.info("sned_order() current_price:%s" % current_price) if contract_type == '신규매수': order_info['주문번호'] = 0 # 주문번호 order_info['원주문번호'] = 0 # 원주문번호 order_info['주문유형'] = 1 # 주문유형(1 : 시장가, 2 : 지정가, 3 : STOP) order_info['종목코드'] = subject_code # 종목코드 order_info['매도수구분'] = 2 # 매도수구분(1 : 매도, 2 : 매수) #print("recnet_price[subject_code]:%s" % recent_price[subject_code]) order_info['체결표시가격'] = str( round(current_price + subject.info[subject_code]['단위'], subject.info[subject_code]['자릿수'])) # 체결표시가격 if contract.get_contract_count(subject_code) > 0: order_info['신규수량'] = 0 # 신규수량 order_info['청산수량'] = contract_cnt order_info['체결수량'] = contract_cnt else: order_info['신규수량'] = contract_cnt # 신규수량 order_info['청산수량'] = 0 order_info['체결수량'] = contract_cnt elif contract_type == '신규매도': order_info['주문번호'] = 0 # 주문번호 order_info['원주문번호'] = 0 # 원주문번호 order_info['주문유형'] = 1 # 주문유형(1 : 시장가, 2 : 지정가, 3 : STOP) order_info['종목코드'] = subject_code # 종목코드 order_info['매도수구분'] = 1 # 매도수구분(1 : 매도, 2 : 매수) #print("recnet_price[subject_code]:%s" % recent_price[subject_code]) order_info['체결표시가격'] = str( round(current_price - subject.info[subject_code]['단위'], subject.info[subject_code]['자릿수'])) # 체결표시가격 if contract.get_contract_count(subject_code) > 0: order_info['신규수량'] = 0 # 신규수량 order_info['청산수량'] = contract_cnt order_info['체결수량'] = contract_cnt else: order_info['신규수량'] = contract_cnt # 신규수량 order_info['청산수량'] = 0 order_info['체결수량'] = contract_cnt kw.OnReceiveChejanData('1', None, None, order_info) return 0
def is_it_sell(subject_code, current_price): index = calc.data[subject_code]['idx'] if contract.get_contract_count(subject_code) > 0: # 계약 보유중 if contract.list[subject_code]['매도수구분'] == '신규매수': # 매수일때 if current_price <= contract.list[subject_code]['손절가']: res.info("손절가가 되어 " + str(contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") return {'신규주문':True, '매도수구분':'신규매도', '수량':contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]} elif calc.data[subject_code]['플로우'][-1] == '상향' and subject.info[subject_code]['sar'] > current_price: res.info("하향 반전되어 " + str(contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") return {'신규주문':True, '매도수구분':'신규매도', '수량':contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]} elif current_price > contract.list[subject_code]['익절가']: contract.list[subject_code]['익절가'] = current_price + subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위'] contract.list[subject_code]['손절가'] = current_price - subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위'] elif contract.list[subject_code]['매도수구분'] == '신규매도': # 매도일때 if current_price >= contract.list[subject_code]['손절가']: res.info("손절가가 되어 " + str(contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") return {'신규주문':True, '매도수구분':'신규매수', '수량':contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]} elif calc.data[subject_code]['플로우'][-1] == '하향' and subject.info[subject_code]['sar'] < current_price: res.info("상향 반전되어 " + str(contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") return {'신규주문':True, '매도수구분':'신규매수', '수량':contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]} elif current_price < contract.list[subject_code]['익절가']: contract.list[subject_code]['익절가'] = current_price - subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위'] contract.list[subject_code]['손절가'] = current_price + subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위'] return {'신규주문':False}
def is_it_sell(subject_code, current_price): index = calc.data[subject_code]['idx'] sell_contents = None return false try: if contract.get_contract_count(subject_code) > 0: # 계약 보유중 if contract.list[subject_code]['매도수구분'] == '신규매수': #현재가격이 100ma보다 크면 if current_price > calc.data[subject_code]['이동평균선'][100][-1]-1.5: contract.list[subject_code]['손절가'] = calc.data[subject_code]['이동평균선'][100][-1]-1.5 if current_price <= contract.list[subject_code]['손절가']: log.info("매수간 손절가가 되어 청산 요청. (현재가 : %s, 체결가 : %s, 익절가 : %s, 손절가 : %s)" % (current_price, contract.list[subject_code]['체결가'], contract.list[subject_code]['익절가'], contract.list[subject_code]['손절가'])) sell_contents = {'신규주문': True, '매도수구분': '신규매도', '수량': contract.get_contract_count(subject_code)} elif current_price >= contract.list[subject_code]['익절가']: log.info("현재가가 익절가가 되어 1차 청산 요청. (현재가 : %s, 체결가 : %s, 익절가 : %s, 손절가 : %s)" % (current_price, contract.list[subject_code]['체결가'], contract.list[subject_code]['익절가'], contract.list[subject_code]['손절가'])) contract.list[subject_code]['익절가'] = 9999 sell_contents = {'신규주문': True, '매도수구분': '신규매도', '수량': int(contract.get_contract_count(subject_code)/2)} elif current_price <= calc.data[subject_code]['이동평균선'][100][-1]-1.5 and contract.list[subject_code]['체결가'] < calc.data[subject_code]['이동평균선'][100][-1]: log.info("현재가가 100MA뚫고 +10틱되어 청산 요청. (현재가 : %s, 체결가 : %s, 익절가 : %s, 손절가 : %s)" % (current_price, contract.list[subject_code]['체결가'], contract.list[subject_code]['익절가'], contract.list[subject_code]['손절가'])) sell_contents = {'신규주문': True, '매도수구분': '신규매도', '수량': contract.get_contract_count(subject_code)} elif contract.list[subject_code]['매도수구분'] == '신규매도': if current_price < calc.data[subject_code]['이동평균선'][100][-1]+1.5: contract.list[subject_code]['손절가'] = calc.data[subject_code]['이동평균선'][100][-1]+1.5 if current_price >= contract.list[subject_code]['손절가']: log.info("매도간 손절가가 되어 청산 요청. (현재가 : %s, 체결가 : %s, 익절가 : %s, 손절가 : %s)" % (current_price, contract.list[subject_code]['체결가'], contract.list[subject_code]['익절가'], contract.list[subject_code]['손절가'])) sell_contents = {'신규주문': True, '매도수구분': '신규매수', '수량': contract.get_contract_count(subject_code)} elif current_price <= contract.list[subject_code]['익절가']: log.info("현재가가 익절가가 되어 1차 청산 요청. (현재가 : %s, 체결가 : %s, 익절가 : %s, 손절가 : %s)" % (current_price, contract.list[subject_code]['체결가'], contract.list[subject_code]['익절가'], contract.list[subject_code]['손절가'])) contract.list[subject_code]['익절가'] = -9999 sell_contents = {'신규주문': True, '매도수구분': '신규매수', '수량': int(contract.get_contract_count(subject_code)/2)} elif current_price >= calc.data[subject_code]['이동평균선'][100][-1]+1.5 and contract.list[subject_code]['체결가'] > calc.data[subject_code]['이동평균선'][100][-1]: log.info("현재가가 100MA+10틱 넘어서 청산 요청. (현재가 : %s, 체결가 : %s, 익절가 : %s, 손절가 : %s)" % (current_price, contract.list[subject_code]['체결가'], contract.list[subject_code]['익절가'], contract.list[subject_code]['손절가'])) sell_contents = {'신규주문': True, '매도수구분': '신규매수', '수량': contract.get_contract_count(subject_code)} except Exception as err: log.error(err) if sell_contents is not None: subject.info[subject_code]['최근매매인덱스'] = index return sell_contents return {'신규주문': False}
def is_it_sell(subject_code, current_price): false = {'신규주문': False} try: if subject.info[subject_code]['워터폴매매'] == False: return false if contract.get_contract_count(subject_code) > 0: # 계약 보유중 # log.debug("종목코드(" + subject_code + ") is_it_sell() / 보유 계약 : " + str(contract.get_contract_count(subject_code))) if contract.list[subject_code]['매도수구분'] == '신규매수': # 매수일때 if current_price <= contract.list[subject_code]['손절가']: res.info("워터폴 손절가가 되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") waterfall_init(subject_code) return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } elif current_price > contract.list[subject_code]['익절가']: res.info("워터폴 익절가가 되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") waterfall_init(subject_code) return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } elif contract.list[subject_code]['매도수구분'] == '신규매도': # 매도일때 if current_price >= contract.list[subject_code]['손절가']: res.info("워터폴 손절가가 되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") waterfall_init(subject_code) return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } elif current_price < contract.list[subject_code]['익절가']: res.info("워터폴 익절가가 되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") waterfall_init(subject_code) return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } except Exception as err: log.error(err) return {'신규주문': False}
def is_it_sell(subject_code, current_price): if contract.get_contract_count(subject_code) > 0: # 계약 보유중 if contract.list[subject_code]['매도수구분'] == '신규매수': # 매수일때 if current_price >= contract.list[subject_code]['익절가']: if contract.list[subject_code]['계약타입'][contract.DRIBBLE] > 0: # 드리블 수량이 남아있다면 if get_time(30) >= int( subject.info[subject_code]['마감시간']) and get_time( 0) < int(subject.info[subject_code]['마감시간']): log.info('마감시간 임박으로 드리블 불가. 모두 청산.') return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } else: log.info("드리블 목표 달성으로 익절가 수정.") contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['주문내용']['익절틱'] * subject.info[subject_code]['단위']) contract.list[subject_code]['손절가'] = current_price - ( (subject.info[subject_code]['주문내용']['손절틱'] - 1) * subject.info[subject_code]['단위']) # 수수료 때문에 1틱 뺌 # 목표달성 청산 if contract.list[subject_code]['계약타입'][contract.SAFE] > 0: log.info("목표달성 청산으로 드리블 수량 제외하고 " + str( contract.list[subject_code]['계약타입'][contract.SAFE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] } elif current_price <= contract.list[subject_code]['손절가']: # 손절 청산 log.info("손절가가 되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } elif contract.list[subject_code]['매도수구분'] == '신규매도': # 매도일때 if current_price <= contract.list[subject_code]['익절가']: if contract.list[subject_code]['계약타입'][contract.DRIBBLE] > 0: # 드리블 수량이 남아있다면 if get_time(30) >= int( subject.info[subject_code]['마감시간']) and get_time( 0) < int(subject.info[subject_code]['마감시간']): log.info('마감시간 임박으로 드리블 불가. 모두 청산.') return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } else: log.info("드리블 목표 달성으로 익절가 수정.") contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['주문내용']['익절틱'] * subject.info[subject_code]['단위']) contract.list[subject_code]['손절가'] = current_price + ( (subject.info[subject_code]['주문내용']['손절틱'] - 1) * subject.info[subject_code]['단위']) # 수수료 때문에 1틱 뺌 # 목표달성 청산 if contract.list[subject_code]['계약타입'][contract.SAFE] > 0: log.info("목표달성 청산으로 드리블 수량 제외하고 " + str( contract.list[subject_code]['계약타입'][contract.SAFE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] } elif current_price >= contract.list[subject_code]['손절가']: # 손절청산 log.info("손절가가 되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } return {'신규주문': False}
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_sell(subject_code, current_price): if subject.info[subject_code]['flow'] == '상향' and subject.info[ subject_code]['상태'] == '매수중': if current_price < subject.info[subject_code]['sar']: if contract.get_contract_count(subject_code) > 0: log.info('flow가 상향이고, 현재가가 sar 보다 작으므로 매도 시도') return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.get_contract_count(subject_code) } elif subject.info[subject_code]['flow'] == '하향' and subject.info[ subject_code]['상태'] == '매도중': if current_price > subject.info[subject_code]['sar']: if contract.get_contract_count(subject_code) > 0: log.info('flow가 하향이고, 현재가가 sar 보다 크므로 매수 시도') return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.get_contract_count(subject_code) } if contract.get_contract_count(subject_code) > 0: #log.info('보유 계약 수 : ' + str(contract.get_contract_count(subject_code))) # 계약 보유중 if contract.list[subject_code]['매도수구분'] == '신규매수': # 매수일때 if current_price >= contract.list[subject_code]['익절가']: if contract.list[subject_code]['계약타입'][contract.DRIBBLE] > 0: # 드리블 수량이 남아있다면 if get_time(30, subject_code) >= int( subject.info[subject_code]['마감시간']) and get_time( 0, subject_code) < int( subject.info[subject_code]['마감시간']): log.info('마감시간 임박으로 드리블 불가. 모두 청산.') return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } #if current_price >= contract.list[subject_code]['체결가'] + 25*subject.info[subject_code]['단위']: # log.info("드리블 목표 달성으로 익절가 수정. 25틱 이상 익절로 2틱 캡으로 드리블") # contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['단위'] ) # contract.list[subject_code]['손절가'] = current_price - (2*subject.info[subject_code]['단위']) #elif current_price >= contract.list[subject_code]['체결가'] + 20*subject.info[subject_code]['단위']: # log.info("드리블 목표 달성으로 익절가 수정. 20틱 이상 익절로 3틱 캡으로 드리블") # contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['단위'] ) # contract.list[subject_code]['손절가'] = current_price - (3*subject.info[subject_code]['단위']) ### 15틱 이상 익절 시 5틱 캡으로 드리블 #elif current_price >= contract.list[subject_code]['체결가'] + 15*subject.info[subject_code]['단위']: # log.info("드리블 목표 달성으로 익절가 수정. 15틱 이상 익절로 5틱 캡으로 드리블") # contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['단위'] ) # contract.list[subject_code]['손절가'] = current_price - (5*subject.info[subject_code]['단위']) ###### elif current_price >= contract.list[subject_code][ '체결가'] + 40 * subject.info[subject_code]['단위']: log.info("드리블 목표 달성으로 익절가 수정. 40틱 이상 익절로 3틱 캡으로 드리블") contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['단위']) contract.list[subject_code]['손절가'] = current_price - ( 3 * subject.info[subject_code]['단위']) elif current_price >= contract.list[subject_code][ '체결가'] + 37 * subject.info[subject_code]['단위']: log.info("드리블 목표 달성으로 익절가 수정. 37틱 이상 익절로 5틱 캡으로 드리블") contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['단위']) contract.list[subject_code]['손절가'] = current_price - ( 5 * subject.info[subject_code]['단위']) elif current_price >= contract.list[subject_code][ '체결가'] + 30 * subject.info[subject_code]['단위']: log.info("드리블 목표 달성으로 익절가 수정. 30틱 이상 익절로 10틱 캡으로 드리블") contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['단위']) contract.list[subject_code]['손절가'] = current_price - ( 10 * subject.info[subject_code]['단위']) elif current_price >= contract.list[subject_code][ '체결가'] + 20 * subject.info[subject_code]['단위']: log.info("드리블 목표 달성으로 익절가 수정. 20틱 이상 익절로 15틱 캡으로 드리블") contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['단위']) contract.list[subject_code]['손절가'] = current_price - ( 15 * subject.info[subject_code]['단위']) else: log.info("드리블 목표 달성으로 익절가 수정.") #contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['주문내용']['익절틱'] * subject.info[subject_code]['단위'] ) contract.list[subject_code]['익절가'] = current_price + ( subject.info[subject_code]['단위']) contract.list[subject_code]['손절가'] = current_price - ( (subject.info[subject_code]['주문내용']['손절틱'] - 3) * subject.info[subject_code]['단위']) # 수수료 때문에 1틱 뺌 #contract.list[subject_code]['손절가'] = current_price - ( subject.info[subject_code]['단위'] ) # 수수료 때문에 1틱 뺌 # 목표달성 청산 if contract.list[subject_code]['계약타입'][contract.SAFE] > 0: log.info("목표달성 청산으로 드리블 수량 제외하고 " + str( contract.list[subject_code]['계약타입'][contract.SAFE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] } ### 예를 들어 10틱 목표가인데 8틱까지 올라가면 손절가를 체결가 + 1 로 설정하여 -10틱 까지 가서 손절되는것을 막는다 elif current_price >= contract.list[subject_code]['익절가'] - ( int(subject.info[subject_code]['주문내용']['익절틱'] * 0.2) * subject.info[subject_code]['단위']): if contract.list[subject_code]['체결가'] > contract.list[ subject_code]['손절가']: contract.list[subject_code][ '손절가'] = contract.list[subject_code]['체결가'] + ( 3 * subject.info[subject_code]['단위'] ) #매수가보다 1틱 올려서 손절가 설정 contract.list[subject_code]['손절가'] = round( contract.list[subject_code]['손절가'], subject.info[subject_code]['자릿수']) log.info("익절틱 80프로 구간 도달하여 손절가 UP, 손절가:%s" % contract.list[subject_code]['손절가']) elif current_price >= contract.list[subject_code]['익절가'] - ( int(subject.info[subject_code]['주문내용']['익절틱'] * 0.4) * subject.info[subject_code]['단위']): if contract.list[subject_code]['체결가'] > contract.list[ subject_code]['손절가']: contract.list[subject_code][ '손절가'] = contract.list[subject_code]['체결가'] - ( 3 * subject.info[subject_code]['단위'] ) #매수가보다 1틱 올려서 손절가 설정 contract.list[subject_code]['손절가'] = round( contract.list[subject_code]['손절가'], subject.info[subject_code]['자릿수']) log.info("익절틱 60프로 구간 도달하여 손절가 UP, 손절가:%s" % contract.list[subject_code]['손절가']) ######## #elif current_price > contract.list[subject_code]['익절가'] - (sonjal_tick*subject.info[subject_code]['단위']): # if current_price - (sonjal_tick*subject.info[subject_code]['단위']) > contract.list[subject_code]['손절가']: # contract.list[subject_code]['손절가'] = current_price - (sonjal_tick*subject.info[subject_code]['단위']) # log.info("손절가 UP, 익절가 향하여 전진!") ######## elif current_price <= contract.list[subject_code]['손절가']: # 손절 청산 log.info("손절가가 되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") log.info(current_price) log.info(contract.list[subject_code]) return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } elif current_price < min( calc.data[subject_code]['일목균형표']['선행스팬1'] [calc.data[subject_code]['idx']], calc.data[subject_code] ['일목균형표']['선행스팬2'][calc.data[subject_code]['idx']] ) - sonjal_gap_between_ilmok_current_price * subject.info[ subject_code]['단위']: log.info("일목균형 이탈하여 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } elif contract.list[subject_code]['매도수구분'] == '신규매도': # 매도일때 if current_price <= contract.list[subject_code]['익절가']: if contract.list[subject_code]['계약타입'][contract.DRIBBLE] > 0: # 드리블 수량이 남아있다면 if get_time(30, subject_code) >= int( subject.info[subject_code]['마감시간']) and get_time( 0, subject_code) < int( subject.info[subject_code]['마감시간']): log.info('마감시간 임박으로 드리블 불가. 모두 청산.') return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } #if current_price <= (contract.list[subject_code]['체결가'] - (25*subject.info[subject_code]['단위'])): # log.info("드리블 목표 달성으로 익절가 수정. 25틱 이상 익절로 2틱 캡으로 드리블") # contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['단위'] ) # contract.list[subject_code]['손절가'] = current_price + (2*subject.info[subject_code]['단위']) # #elif current_price <= (contract.list[subject_code]['체결가'] - (20*subject.info[subject_code]['단위'])): # log.info("드리블 목표 달성으로 익절가 수정. 20틱 이상 익절로 3틱 캡으로 드리블") # contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['단위'] ) # contract.list[subject_code]['손절가'] = current_price + (3*subject.info[subject_code]['단위']) ### 15틱 이상 익절 시 5틱 캡으로 드리블 #elif current_price <= (contract.list[subject_code]['체결가'] - (15*subject.info[subject_code]['단위'])): # log.info("드리블 목표 달성으로 익절가 수정. 15틱 이상 익절로 5틱 캡으로 드리블") # contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['단위'] ) # contract.list[subject_code]['손절가'] = current_price + (5*subject.info[subject_code]['단위']) ###### elif current_price <= ( contract.list[subject_code]['체결가'] - (40 * subject.info[subject_code]['단위'])): log.info("드리블 목표 달성으로 익절가 수정. 40틱 이상 익절로 3틱 캡으로 드리블") contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['단위']) contract.list[subject_code]['손절가'] = current_price + ( 3 * subject.info[subject_code]['단위']) elif current_price <= ( contract.list[subject_code]['체결가'] - (37 * subject.info[subject_code]['단위'])): log.info("드리블 목표 달성으로 익절가 수정. 37틱 이상 익절로 5틱 캡으로 드리블") contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['단위']) contract.list[subject_code]['손절가'] = current_price + ( 5 * subject.info[subject_code]['단위']) elif current_price <= ( contract.list[subject_code]['체결가'] - (30 * subject.info[subject_code]['단위'])): log.info("드리블 목표 달성으로 익절가 수정. 30틱 이상 익절로 10틱 캡으로 드리블") contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['단위']) contract.list[subject_code]['손절가'] = current_price + ( 10 * subject.info[subject_code]['단위']) elif current_price <= ( contract.list[subject_code]['체결가'] - (20 * subject.info[subject_code]['단위'])): log.info("드리블 목표 달성으로 익절가 수정. 20틱 이상 익절로 15틱 캡으로 드리블") contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['단위']) contract.list[subject_code]['손절가'] = current_price + ( 15 * subject.info[subject_code]['단위']) else: log.info("드리블 목표 달성으로 익절가 수정.") #contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['주문내용']['익절틱'] * subject.info[subject_code]['단위'] ) contract.list[subject_code]['익절가'] = current_price - ( subject.info[subject_code]['단위']) contract.list[subject_code]['손절가'] = current_price + ( (subject.info[subject_code]['주문내용']['손절틱'] - 3) * subject.info[subject_code]['단위']) # 수수료 때문에 1틱 뺌 #contract.list[subject_code]['손절가'] = current_price + ( subject.info[subject_code]['단위'] ) # 수수료 때문에 1틱 뺌 # 목표달성 청산 if contract.list[subject_code]['계약타입'][contract.SAFE] > 0: log.info("목표달성 청산으로 드리블 수량 제외하고 " + str( contract.list[subject_code]['계약타입'][contract.SAFE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] } ## 예를 들어 10틱 목표가인데 8틱까지 올라가면 손절가를 체결가 + 1 로 설정하여 -10틱 까지 가서 손절되는것을 막는다 elif current_price <= contract.list[subject_code]['익절가'] + ( int(subject.info[subject_code]['주문내용']['익절틱'] * 0.2) * subject.info[subject_code]['단위']): if contract.list[subject_code]['체결가'] < contract.list[ subject_code]['손절가']: contract.list[subject_code][ '손절가'] = contract.list[subject_code]['체결가'] - ( 3 * subject.info[subject_code]['단위'] ) #매수가보다 1틱 올려서 손절가 설정 contract.list[subject_code]['손절가'] = round( contract.list[subject_code]['손절가'], subject.info[subject_code]['자릿수']) log.info("익절틱 80프로 구간 도달하여 손절가 UP, 손절가:%s" % contract.list[subject_code]['손절가']) elif current_price <= contract.list[subject_code]['익절가'] + ( int(subject.info[subject_code]['주문내용']['익절틱'] * 0.4) * subject.info[subject_code]['단위']): if contract.list[subject_code]['체결가'] < contract.list[ subject_code]['손절가']: contract.list[subject_code][ '손절가'] = contract.list[subject_code]['체결가'] + ( 3 * subject.info[subject_code]['단위'] ) #매수가보다 1틱 올려서 손절가 설정 contract.list[subject_code]['손절가'] = round( contract.list[subject_code]['손절가'], subject.info[subject_code]['자릿수']) log.info("익절틱 60프로 구간 도달하여 손절가 UP, 손절가:%s" % contract.list[subject_code]['손절가']) ######## #elif current_price < contract.list[subject_code]['익절가'] + (sonjal_tick*subject.info[subject_code]['단위']): # if current_price + (sonjal_tick*subject.info[subject_code]['단위']) < contract.list[subject_code]['손절가']: # contract.list[subject_code]['손절가'] = current_price + (sonjal_tick*subject.info[subject_code]['단위']) # log.info("손절가 UP, 익절가 향하여 전진!") ######## elif current_price >= contract.list[subject_code]['손절가']: # 손절청산 log.info("손절가가 되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } elif current_price > max( calc.data[subject_code]['일목균형표']['선행스팬1'] [calc.data[subject_code]['idx']], calc.data[subject_code] ['일목균형표']['선행스팬2'][calc.data[subject_code]['idx']] ) + sonjal_gap_between_ilmok_current_price * subject.info[ subject_code]['단위']: log.info("일목균형 이탈하여 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } return {'신규주문': False}
def calc(subject_code): ''' 각종 그래프 계산 ''' if subject.info[subject_code]['전략'] == '파라': sar = subject.info[subject_code]['sar'] if data[subject_code]['idx'] < 5: data[subject_code]['플로우'].append('모름') if data[subject_code]['idx'] == 5: init_sar(subject_code) elif data[subject_code]['idx'] > 5: calculate_sar(subject_code) calc_ma_line(subject_code) trend = is_sorted(subject_code, subject.info[subject_code]['이동평균선']) data[subject_code]['추세'].append(trend) calc_ema_line(subject_code) calc_ilmok_chart(subject_code) calc_linear_regression(subject_code) elif subject.info[subject_code]['전략'] == '풀파라' or subject.info[subject_code]['전략'] == '리버스온리': sar = subject.info[subject_code]['sar'] if data[subject_code]['idx'] < 5: data[subject_code]['플로우'].append('모름') if data[subject_code]['idx'] == 5: init_sar(subject_code) elif data[subject_code]['idx'] > 5: calculate_sar(subject_code) calc_ma_line(subject_code) trend = is_sorted(subject_code, subject.info[subject_code]['이동평균선']) data[subject_code]['추세'].append(trend) log.debug("현재플로우 : " + data[subject_code]['플로우'][-1] + " / 현재플로우최극가 : " + str(data[subject_code]['현재플로우최극가'])) if data[subject_code]['플로우'][-1] == '상향': if data[subject_code]['현재플로우최극가'] < data[subject_code]['고가'][-1]: data[subject_code]['현재플로우최극가'] = float(data[subject_code]['고가'][-1]) else: if data[subject_code]['현재플로우최극가'] > data[subject_code]['저가'][-1]: data[subject_code]['현재플로우최극가'] = float(data[subject_code]['저가'][-1]) #if data[subject_code]['idx'] > 9000: log.info("SAR : %s" % sar) ''' calc_ema_line(subject_code) calc_ilmok_chart(subject_code) calc_linear_regression_in_para(subject_code) ''' elif subject.info[subject_code]['전략'] == '추세선밴드': calc_ma_line(subject_code) calc_ema_line(subject_code) trend = is_sorted(subject_code, subject.info[subject_code]['이동평균선']) data[subject_code]['추세'].append(trend) if data[subject_code]['idx'] >= subject.info[subject_code]['이동평균선'][-1]: if trend != data[subject_code]['추세'][ -2 ]: # 추세 반전 if data[subject_code]['추세연속틱'] < subject.info[subject_code]['최소연속틱'] or data[subject_code]['정배열연속틱'] < subject.info[subject_code]['최소연속틱']/2: # 추세 극점부터 연속 틱이 60 이하일 경우 추세 아님 my_util.chanege_past_trend(subject_code) # 추세가 아니므로, 지난 추세를 현재추세로 덮어씌워 연속된 추세를 만듬 log.info('이동평균선 추세 연속틱 재설정.') data[subject_code]['추세연속틱'] = my_util.get_trend_continuous_tick_count(subject_code) data[subject_code]['정배열연속틱'] = 1 if contract.get_contract_count(subject_code) == 0 and subject.info[subject_code]['상태'] != '중립대기': log.info('종목코드 : ' + subject_code + ' 상태 변경, ' + subject.info[subject_code]['상태'] + ' -> 중립대기.') subject.info[subject_code]['상태'] = '중립대기' else: data[subject_code]['추세연속틱'] += 1 data[subject_code]['정배열연속틱'] += 1 log.info('이동평균선 ' + trend + ' 추세 연속 : ' + str(data[subject_code]['추세연속틱']) + '틱') calc_linear_regression(subject_code) calc_bollinger_bands(subject_code) calc_ilmok_chart(subject_code) elif subject.info[subject_code]['전략'] == '큰파라': calc_ma_line(subject_code) sar = subject.info[subject_code]['sar'] if data[subject_code]['idx'] < 5: data[subject_code]['플로우'].append('모름') if data[subject_code]['idx'] == 5: init_sar(subject_code) elif data[subject_code]['idx'] > 5: calculate_sar(subject_code) elif subject.info[subject_code]['전략'] == 'MA30100': calc_ma_line(subject_code) day_ma = [3,5,10,20,30,60,120] for day in day_ma: data[subject_code][DAY][MA][day] = calc_ma_from_xls(subject_code, DAY, day, data[subject_code]['영업일자'][-1], data[subject_code]['현재가'][-1]) week_ma = [3,5,10,20,30,60] for week in week_ma: data[subject_code][WEEK][MA][week] = calc_ma_from_xls(subject_code, WEEK, week, data[subject_code]['영업일자'][-1], data[subject_code]['현재가'][-1]) # 전일 종가 금일 시가 셋팅 if(날짜가 오늘이면) data[subject_code][DAY][OPEN] = data[subject_code][DAY][CANDLE][OPEN] #print(data[subject_code][DAY][MA]) else: calc_ma_line(subject_code) def calc_ma_line(subject_code): ''' 이동평균선 계산 ''' for days in data['이동평균선']['일수']: if data[subject_code]['idx'] >= days - 1: avg = sum( data[subject_code]['현재가'][ data[subject_code]['idx'] - days + 1 : data[subject_code]['idx'] + 1] ) / days data[subject_code]['이동평균선'][days].append(avg) else: data[subject_code]['이동평균선'][days].append(None) def calc_ema_line(subject_code): ''' 지수이동평균선 계산 ''' for days in data['이동평균선']['일수']: if data[subject_code]['idx'] >= days - 1: if data[subject_code]['idx'] == days - 1: avg = sum( data[subject_code]['현재가'][ data[subject_code]['idx'] - days + 1 : data[subject_code]['idx'] + 1] ) / days data[subject_code]['지수이동평균선'][days].append(avg) else: alpha = 2 / (days + 1) ema = alpha * data[subject_code]['현재가'][-1] + (1.0 - alpha) * data[subject_code]['지수이동평균선'][days][-1] data[subject_code]['지수이동평균선'][days].append(ema) else: data[subject_code]['지수이동평균선'][days].append(None) def calc_ilmok_chart(subject_code): ''' 일목균형표 계산 ''' if data[subject_code]['idx'] < 9: data[subject_code]['일목균형표']['전환선'].append(None) else: data[subject_code]['일목균형표']['전환선'].append( (max( data[subject_code]['현재가'][data[subject_code]['idx'] - 9 : data[subject_code]['idx']] ) + min( data[subject_code]['현재가'][data[subject_code]['idx'] - 9 : data[subject_code]['idx']] )) / 2) if data[subject_code]['idx'] < 26: data[subject_code]['일목균형표']['기준선'].append(None) else: data[subject_code]['일목균형표']['기준선'].append( (max( data[subject_code]['현재가'][data[subject_code]['idx'] - 26 : data[subject_code]['idx']] ) + min( data[subject_code]['현재가'][data[subject_code]['idx'] - 26 : data[subject_code]['idx']] )) / 2) if data[subject_code]['idx'] >= 26: data[subject_code]['일목균형표']['선행스팬1'].append( (data[subject_code]['일목균형표']['전환선'][data[subject_code]['idx']] + data[subject_code]['일목균형표']['기준선'][data[subject_code]['idx']]) / 2) else: data[subject_code]['일목균형표']['선행스팬1'].append(None) if data[subject_code]['idx'] >= 52: data[subject_code]['일목균형표']['선행스팬2'].append( (max( data[subject_code]['현재가'][data[subject_code]['idx'] - 52 : data[subject_code]['idx']] ) + min( data[subject_code]['현재가'][data[subject_code]['idx'] - 52 : data[subject_code]['idx']] )) / 2) else: data[subject_code]['일목균형표']['선행스팬2'].append(None) def calc_linear_regression_in_para(subject_code): ''' 직선회기 계산 파라볼릭 SAR 지난 신호에서 최극점을 기준으로 계산 ''' data[subject_code]['추세선'].append(None) data[subject_code]['매매선'].append(None) data[subject_code]['추세선밴드']['상한선'].append(None) data[subject_code]['추세선밴드']['하한선'].append(None) # 지난 신호 마지막 index를 찾는다. last_index = data[subject_code]['idx'] for idx in range(data[subject_code]['idx'], 0, -1): if data[subject_code]['플로우'][idx] != data[subject_code]['플로우'][-1]: last_index = idx break # 지난 신호 중에서 최고 극점을 찾는다. ep = 0 ep_index = 0 if data[subject_code]['플로우'][last_index] == '하향': ep = 999999 for idx in range(last_index, 0, -1): if data[subject_code]['플로우'][idx] == data[subject_code]['플로우'][last_index]: if data[subject_code]['플로우'][idx] == '상향' and ep < data[subject_code]['현재가'][idx]: ep = data[subject_code]['현재가'][idx] ep_index = idx elif data[subject_code]['플로우'][idx] == '하향' and ep > data[subject_code]['현재가'][idx]: ep = data[subject_code]['현재가'][idx] ep_index = idx else: break line_range = data[subject_code]['idx'] - ep_index result = stats.linregress(list(range( 0, line_range + 1 )), data[subject_code]['현재가'][ len(data[subject_code]['현재가']) - line_range - 1: len(data[subject_code]['현재가']) ]) data[subject_code]['추세선기울기'] = result.slope data[subject_code]['결정계수'] = (result.rvalue**2) _x = 0 for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx'] + 27): data[subject_code]['추세선'][idx] = result.slope * _x + result.intercept _x+=1 # 표준편차 stdev = calc_stdev(subject_code) data[subject_code]['표준편차'] = stdev for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx'] + 27): data[subject_code]['추세선밴드']['상한선'][idx] = data[subject_code]['추세선'][idx] + 2 * stdev data[subject_code]['추세선밴드']['하한선'][idx] = data[subject_code]['추세선'][idx] - 2 * stdev def calc_linear_regression(subject_code): ''' 직선회기 계산 ''' data[subject_code]['추세선'].append(None) data[subject_code]['매매선'].append(None) data[subject_code]['추세선밴드']['상한선'].append(None) data[subject_code]['추세선밴드']['하한선'].append(None) line_range = my_util.get_trend_continuous_tick_count(subject_code) if data[subject_code]['idx'] <= line_range: return result = stats.linregress(list(range( 0, line_range + 1 )), data[subject_code]['현재가'][ len(data[subject_code]['현재가']) - line_range - 1: len(data[subject_code]['현재가']) ]) data[subject_code]['추세선기울기'] = result.slope data[subject_code]['결정계수'] = (result.rvalue**2) _x = 0 for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx'] + 27): data[subject_code]['추세선'][idx] = result.slope * _x + result.intercept _x+=1 # 표준편차 stdev = calc_stdev(subject_code) data[subject_code]['표준편차'] = stdev high_max = 0 low_max = 0 for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx']): high_max = max(data[subject_code]['고가'][idx] - data[subject_code]['추세선'][idx], high_max) low_max = max(data[subject_code]['추세선'][idx] - data[subject_code]['저가'][idx], low_max) for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx'] + 27): data[subject_code]['추세선밴드']['상한선'][idx] = data[subject_code]['추세선'][idx] + high_max data[subject_code]['추세선밴드']['하한선'][idx] = data[subject_code]['추세선'][idx] - low_max ''' # 데이터와의 차 구함 max = get_max_deifference(subject_code) diff = max * 0.6 if diff > 10 * subject.info[subject_code]['단위']: diff = 10 *subject.info[subject_code]['단위'] for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx'] + 1): if data[subject_code]['추세'][ data[subject_code]['idx'] - 1] == '상승세': data[subject_code]['매매선'][idx] = data[subject_code]['추세선'][idx] - diff elif data[subject_code]['추세'][ data[subject_code]['idx'] - 1] == '하락세': data[subject_code]['매매선'][idx] = data[subject_code]['추세선'][idx] + diff ''' def calc_stdev(subject_code): sd = 0.0 sum = 0.0 line_range = my_util.get_trend_continuous_tick_count(subject_code) if line_range <= 1: return 0 for idx in range(data[subject_code]['idx'] - line_range, data[subject_code]['idx'] + 1): diff = data[subject_code]['추세선'][idx] - ((data[subject_code]['현재가'][idx] + data[subject_code]['시가'][idx])/2) sum += diff**2 return math.sqrt(sum / (line_range - 1)) ##### 볼린저 밴드 계산 ##### def calc_bollinger_bands(subject_code, length = 20, numsd = 2): if data[subject_code]['idx'] < length: data[subject_code]['볼린저밴드']['중심선'].append(None) data[subject_code]['볼린저밴드']['상한선'].append(None) data[subject_code]['볼린저밴드']['하한선'].append(None) data[subject_code]['볼린저밴드']['캔들위치'].append(None) return mean = sum(data[subject_code]['현재가'][-length:]) / length sum_dif = 0 for idx in range(data[subject_code]['idx'] - length + 1, data[subject_code]['idx'] + 1): sum_dif += (data[subject_code]['현재가'][idx] - mean)**2 var = sum_dif / length sd = math.sqrt(var) data[subject_code]['볼린저밴드']['중심선'].append(mean) data[subject_code]['볼린저밴드']['상한선'].append(mean + sd * numsd) data[subject_code]['볼린저밴드']['하한선'].append(mean - sd * numsd) if data[subject_code]['시가'][-1] >= data[subject_code]['볼린저밴드']['중심선'][-1] and data[subject_code]['현재가'][-1] >= data[subject_code]['볼린저밴드']['중심선'][-1]: data[subject_code]['볼린저밴드']['캔들위치'].append('상단') elif data[subject_code]['시가'][-1] <= data[subject_code]['볼린저밴드']['중심선'][-1] and data[subject_code]['현재가'][-1] <= data[subject_code]['볼린저밴드']['중심선'][-1]: data[subject_code]['볼린저밴드']['캔들위치'].append('하단') else: data[subject_code]['볼린저밴드']['캔들위치'].append('중심') def find_high_low_point(subject_code): start_index = my_util.get_start_index_of_trend(subject_code) current_trend = data[subject_code]['추세'][-1] data[subject_code]['고가그룹'] = [] data[subject_code]['저가그룹'] = [] point_idx = start_index past_position = data[subject_code]['볼린저밴드']['캔들위치'][start_index] candle_cnt = 0 last_position = '' for idx in range(start_index, 0, -1): if data[subject_code]['볼린저밴드']['캔들위치'][idx] != past_position: start_index = idx + 1 break; if current_trend == '상승세': point_value = data[subject_code]['고가'][start_index] is_low_point = False end_index = 0 last_position = data[subject_code]['볼린저밴드']['캔들위치'][-1] for idx in range(data[subject_code]['idx'],0,-1): if data[subject_code]['볼린저밴드']['캔들위치'][idx] != last_position: end_index = idx break # 저점 찾기 for idx in range(start_index, end_index+1): # 현재 위치 ( 중심선 상단, 하단 ) / 캔들 시가, 종가 모두 포함되어야함 current_position = data[subject_code]['볼린저밴드']['캔들위치'][idx] if current_position != '하단': if is_low_point == True: data[subject_code]['저가그룹'].append( [point_idx, point_value, True, data[subject_code]['체결시간'][point_idx] ] ) point_value = 999999 is_low_point = False else: if data[subject_code]['저가'][idx] <= data[subject_code]['볼린저밴드']['하한선'][idx]: is_low_point = True if point_value > data[subject_code]['저가'][idx]: point_idx = idx point_value = data[subject_code]['저가'][idx] # 고점 찾기 for low_idx in range(0, len(data[subject_code]['저가그룹']) - 1): low_point1 = data[subject_code]['저가그룹'][low_idx] low_point2 = data[subject_code]['저가그룹'][low_idx + 1] max_value = -999999 max_idx = 0 is_touch = False for high_idx in range( low_point1[0], low_point2[0] ): if data[subject_code]['고가'][high_idx] <= data[subject_code]['볼린저밴드']['상한선'][high_idx]: is_touch = True if max_value > data[subject_code]['고가'][high_idx]: max_value = data[subject_code]['고가'][high_idx] max_idx = high_idx data[subject_code]['고가그룹'].append( [max_idx, max_value, is_touch, data[subject_code]['체결시간'][max_idx] ] ) if len(data[subject_code]['저가그룹']) > 0: # 위의 고점찾기로 찾지못한 마지막 고점찾기... max_value = 999999 max_idx = 0 is_touch = False for high_idx in range( data[subject_code]['저가그룹'][-1][0], data[subject_code]['idx']): if data[subject_code]['고가'][high_idx] <= data[subject_code]['볼린저밴드']['상한선'][high_idx]: is_touch = True if max_value > data[subject_code]['고가'][high_idx]: max_value = data[subject_code]['고가'][high_idx] max_idx = high_idx data[subject_code]['고가그룹'].append( [max_value, max_value, is_touch, data[subject_code]['체결시간'][max_idx] ] ) elif current_trend == '하락세': point_value = data[subject_code]['고가'][start_index] is_high_point = False end_index = 0 last_position = data[subject_code]['볼린저밴드']['캔들위치'][-1] for idx in range(data[subject_code]['idx'],0,-1): if data[subject_code]['볼린저밴드']['캔들위치'][idx] != last_position: end_index = idx break # 고점 찾기 for idx in range(start_index, end_index+1): # 현재 위치 ( 중심선 상단, 하단 ) / 캔들 시가, 종가 모두 포함되어야함 current_position = data[subject_code]['볼린저밴드']['캔들위치'][idx] if current_position != '상단': if is_high_point == True: data[subject_code]['고가그룹'].append( [point_idx, point_value, True, data[subject_code]['체결시간'][point_idx] ] ) point_value = -999999 is_high_point = False else: if data[subject_code]['고가'][idx] >= data[subject_code]['볼린저밴드']['상한선'][idx]: is_high_point = True if point_value < data[subject_code]['고가'][idx]: point_idx = idx point_value = data[subject_code]['고가'][idx] # 저점 찾기 for high_idx in range(0, len(data[subject_code]['고가그룹']) - 1): high_point1 = data[subject_code]['고가그룹'][high_idx] high_point2 = data[subject_code]['고가그룹'][high_idx + 1] min_value = 999999 min_idx = 0 is_touch = False for low_idx in range( high_point1[0], high_point2[0] ): if data[subject_code]['저가'][low_idx] <= data[subject_code]['볼린저밴드']['하한선'][low_idx]: is_touch = True if min_value > data[subject_code]['저가'][low_idx]: min_value = data[subject_code]['저가'][low_idx] min_idx = low_idx data[subject_code]['저가그룹'].append( [min_idx, min_value, is_touch, data[subject_code]['체결시간'][min_idx] ] ) if len(data[subject_code]['고가그룹']) > 0: # 위의 저점찾기로 찾지못한 마지막 저점찾기... min_value = 999999 min_idx = 0 is_touch = False for low_idx in range( data[subject_code]['고가그룹'][-1][0], data[subject_code]['idx']): if data[subject_code]['저가'][low_idx] <= data[subject_code]['볼린저밴드']['하한선'][low_idx]: is_touch = True if min_value > data[subject_code]['저가'][low_idx]: min_value = data[subject_code]['저가'][low_idx] min_idx = low_idx data[subject_code]['저가그룹'].append( [min_idx, min_value, is_touch, data[subject_code]['체결시간'][min_idx] ] ) elif current_trend == '모름': pass else: log.error('추세 데이터 에러.') ##### 볼린저 밴드 계산 끝 ##### ###### parabolic SAR ###### def init_sar(subject_code): ep = subject.info[subject_code]['ep'] af = subject.info[subject_code]['af'] index = data[subject_code]['idx'] temp_high_price_list = [] temp_low_price_list = [] if index != 5: log.error("ERROR!, init_sar() index가 5가 아닙니다.") return for i in range(index): temp_high_price_list.append(data[subject_code]['고가'][i]) temp_low_price_list.append(data[subject_code]['저가'][i]) score = 0 for i in range(len(temp_high_price_list)-1): if temp_high_price_list[i] < temp_high_price_list[i+1]: score = score + 1 else: score = score - 1 if score >= 1: init_sar = min(temp_low_price_list) temp_flow = "상향" ep = max(temp_high_price_list) if score < 1: init_sar = max(temp_high_price_list) ep = min(temp_low_price_list) temp_flow = "하향" sar = ((ep - init_sar) * af) + init_sar subject.info[subject_code]['sar'] = sar subject.info[subject_code]['ep'] = ep subject.info[subject_code]['af'] = af subject.info[subject_code]['flow'] = temp_flow data[subject_code]['플로우'].append(temp_flow) calculate_sar(subject_code) def calculate_sar(subject_code): sar = subject.info[subject_code]['sar'] af = subject.info[subject_code]['af'] init_af = subject.info[subject_code]['init_af'] maxaf = subject.info[subject_code]['maxaf'] ep = subject.info[subject_code]['ep'] temp_flow = subject.info[subject_code]['flow'] index = data[subject_code]['idx'] temp_sar = subject.info[subject_code]['sar'] the_highest_price = 0 the_lowest_price = 0 if temp_flow == "상향": the_highest_price = ep if temp_flow == "하향": the_lowest_price = ep next_sar = temp_sar if temp_flow == "상향": if data[subject_code]['저가'][index] >= next_sar: # 상승추세에서 저가가 내일의 SAR보다 높으면 하락이 유효 today_sar = next_sar temp_flow = "상향" the_lowest_price = 0 if data[subject_code]['고가'][index] > ep: # 신고가 발생 the_highest_price = data[subject_code]['고가'][index] ep = data[subject_code]['고가'][index] af = af + init_af if af > maxaf: af = maxaf elif data[subject_code]['저가'][index] < next_sar: # 상승추세에서 저가가 내일의 SAR보다 낮으면 하향 반전 temp_flow = "하향" af = init_af today_sar = ep the_highest_price = 0 the_lowest_price = data[subject_code]['저가'][index] ep = the_lowest_price data[subject_code]['이전반전시SAR값'].append(next_sar) data[subject_code]['SAR반전시간'].append(data[subject_code]['체결시간'][index]) if data[subject_code]['이전반전시SAR값'][-2] - next_sar > 0: subject.info[subject_code]['맞틀리스트'].append('틀') profit_tic = (next_sar - data[subject_code]['이전반전시SAR값'][-2]) / subject.info[subject_code]['단위'] profit_tic = round(profit_tic,1) subject.info[subject_code]['수익리스트'].append(profit_tic) result_arry = subject.info[subject_code]['맞틀리스트'][-5]+subject.info[subject_code]['맞틀리스트'][-4]+subject.info[subject_code]['맞틀리스트'][-3]+subject.info[subject_code]['맞틀리스트'][-2] result[result_arry] = result[result_arry] + profit_tic #log.info(result) else: subject.info[subject_code]['맞틀리스트'].append('맞') #print(subject.info[subject_code]['맞틀리스트']) profit_tic = (next_sar - data[subject_code]['이전반전시SAR값'][-2])/subject.info[subject_code]['단위'] profit_tic = round(profit_tic, 1) subject.info[subject_code]['수익리스트'].append(profit_tic) result_arry = subject.info[subject_code]['맞틀리스트'][-5]+subject.info[subject_code]['맞틀리스트'][-4]+subject.info[subject_code]['맞틀리스트'][-3]+subject.info[subject_code]['맞틀리스트'][-2] result[result_arry] = result[result_arry] + profit_tic #log.info(result) data[subject_code]['현재플로우최극가'] = float(data[subject_code]['저가'][-1]) t_sar = {} t_sar['시작값'] = ep if data[subject_code]['idx'] > 1800: if len(data[subject_code]['SAR']) > 0: data[subject_code]['SAR'][-1]['끝값'] = subject.info[subject_code]['sar'] data[subject_code]['SAR'].append(t_sar) #res.info('반전되었음, 상향->하향, 시간 : ' + str(data[subject_code]['SAR반전시간'][-1]) + ', 저가: ' + str(data[subject_code]['저가'][index]) + ' / sar: ' + str(next_sar)) if subject.info[subject_code]['상태'] == '중립대기' or subject.info[subject_code]['상태'] == '매매완료' or subject.info[subject_code]['상태'] == '매수대기': log.info('상태 변경, 매매완료 -> 매도가능') print('상태 변경, 매매완료 -> 매도가능') subject.info[subject_code]['상태'] = '매도가능' print(subject.info[subject_code]['맞틀리스트']) elif temp_flow == "하향": if data[subject_code]['고가'][index]<= next_sar: # 하락추세에서 고가가 내일의 SAR보다 낮으면 하락이 유효 today_sar = next_sar temp_flow = "하향" the_highest_price = 0 if data[subject_code]['저가'][index] < ep: # 신저가 발생 the_lowest_price = data[subject_code]['저가'][index] ep = data[subject_code]['저가'][index] af = af + init_af if af > maxaf: af = maxaf elif data[subject_code]['고가'][index] > next_sar: # 하락추세에서 고가가 내일의 SAR보다 높으면 상향 반전 temp_flow = "상향" af = init_af today_sar = ep the_lowest_price = 0 the_highest_price = data[subject_code]['고가'][index] ep = the_highest_price data[subject_code]['이전반전시SAR값'].append(next_sar) data[subject_code]['SAR반전시간'].append(data[subject_code]['체결시간'][index]) if data[subject_code]['이전반전시SAR값'][-2] - next_sar > 0: subject.info[subject_code]['맞틀리스트'].append('맞') profit_tic = (data[subject_code]['이전반전시SAR값'][-2] - next_sar)/subject.info[subject_code]['단위'] profit_tic = round(profit_tic, 1) subject.info[subject_code]['수익리스트'].append(profit_tic) result_arry = subject.info[subject_code]['맞틀리스트'][-5]+subject.info[subject_code]['맞틀리스트'][-4]+subject.info[subject_code]['맞틀리스트'][-3]+subject.info[subject_code]['맞틀리스트'][-2] result[result_arry] = result[result_arry] + profit_tic #log.info(result) else: profit_tic = (data[subject_code]['이전반전시SAR값'][-2] - next_sar) / subject.info[subject_code]['단위'] profit_tic = round(profit_tic, 1) subject.info[subject_code]['수익리스트'].append(profit_tic) subject.info[subject_code]['맞틀리스트'].append('틀') result_arry = subject.info[subject_code]['맞틀리스트'][-5]+subject.info[subject_code]['맞틀리스트'][-4]+subject.info[subject_code]['맞틀리스트'][-3]+subject.info[subject_code]['맞틀리스트'][-2] result[result_arry] = result[result_arry] + profit_tic #log.info(result) data[subject_code]['현재플로우최극가'] = float(data[subject_code]['고가'][-1]) t_sar = {} t_sar['시작값'] = ep if data[subject_code]['idx'] > 1800: if len(data[subject_code]['SAR']) > 0: data[subject_code]['SAR'][-1]['끝값'] = subject.info[subject_code]['sar'] data[subject_code]['SAR'].append(t_sar) #res.info('반전되었음, 하향->상향, 시간 : ' + str(data[subject_code]['SAR반전시간'][-1]) + ', 고가: ' + str(data[subject_code]['고가'][index]) + ' / sar: ' + str(next_sar)) if subject.info[subject_code]['상태'] == '중립대기' or subject.info[subject_code]['상태'] == '매매완료' or subject.info[subject_code]['상태'] == '매도대기': log.info('상태 변경, 매매완료 -> 매수가능') print('상태 변경, 매매완료 -> 매수가능') subject.info[subject_code]['상태'] = '매수가능' print(subject.info[subject_code]['맞틀리스트']) print(subject.info[subject_code]['수익리스트']) next_sar = today_sar + af * (max(the_highest_price,the_lowest_price) - today_sar) #res.info("고가:"+str(data[subject_code]['고가'][index])+" ,저가" + str(data[subject_code]['저가'][index])) #res.info("af:"+str(af)) #res.info("ep:"+str(ep)) #res.info("flow:"+str(temp_flow)) #res.info("sar:%s" % str(next_sar)) #res.debug("반전시간 리스트:%s" % str(data[subject_code]['SAR반전시간'])) #res.info("---------------") subject.info[subject_code]['sar'] = next_sar subject.info[subject_code]['ep'] = ep subject.info[subject_code]['af'] = af flow = subject.info[subject_code]['flow'] = temp_flow data[subject_code]['플로우'].append(temp_flow)
def is_it_sell(subject_code, current_price): index = calc.data[subject_code]['idx'] # if 1446 < get_time(0, subject_code) < 1447: # log.info('%s : current_price : %s sar : %s' % (str(calc.data[subject_code]['체결시간'][-1])[4:14], current_price, subject.info[subject_code]['sar'])) try: #first_chungsan = 70 first_chungsan = subject.info[subject_code]['1차청산틱'] first_chungsan_dribble = 2 second_chungsan = 999 second_chungsan_dribble = 15 sar_before_reverse_tic = 0 # log.debug("종목코드(" + subject_code + ") is_it_sell() 진입.") # log.debug("종목코드(" + subject_code + ") 현재 Flow : " + subject.info[subject_code]['flow'] + " / SAR : " + str(subject.info[subject_code]['sar'])) if contract.get_contract_count(subject_code) > 0: # 계약 보유중 # log.debug("종목코드(" + subject_code + ") is_it_sell() / 보유 계약 : " + str(contract.get_contract_count(subject_code))) if contract.list[subject_code]['매도수구분'] == '신규매수': # 매수일때 if subject.info[subject_code]['반대매매'] == True: if current_price <= float( contract.list[subject_code]['체결가']) - ( subject.info[subject_code]['리버스손절틱'] * subject.info[subject_code]['단위']): res.info("반대매매 리버스 손절가가 되어 " + str(contract.list[subject_code]['계약타입'][ contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } if calc.data[subject_code]['현재플로우최극가'] - ( subject.info[subject_code]['손절틱'] * subject.info[subject_code]['단위']) > current_price: res.info("손절가가 되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } elif current_price <= contract.list[subject_code]['손절가']: if contract.get_contract_count( subject_code ) == subject.info[subject_code]['신규매매수량']: # 1차 청산일 때 # contract_num = int((contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) / 2) contract_num = int( (contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE])) if contract_num < 1: return {'신규주문': False} res.info("손절가가 되어 " + str(contract_num) + "개 청산 요청. 현재가:%s, 손절가:%s" % (current_price, contract.list[subject_code]['손절가'])) contract.list[subject_code]['손절가'] = current_price - subject.info[subject_code]['손절틱'] * \ subject.info[subject_code]['단위'] return { '신규주문': True, '매도수구분': '신규매도', '수량': contract_num } else: # 1차 청산 이후 청산일 때 res.info("손절가가 되어 " + str(contract.list[subject_code]['계약타입'][ contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } elif calc.data[subject_code]['플로우'][ -1] == '상향' and subject.info[subject_code][ 'sar'] > current_price: if subject.info[subject_code]['반대매매'] == False: res.info("하향 반전되어 " + str(contract.list[subject_code] ['계약타입'][contract.SAFE] + contract.list[subject_code] ['계약타입'][contract.DRIBBLE]) + "개 청산 요청. 현재가:%s" % current_price) return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } elif calc.data[subject_code]['플로우'][ -1] == '하향' and subject.info[subject_code][ 'sar'] < current_price: if subject.info[subject_code]['반대매매'] == True: res.info("상향 반전되어 " + str(contract.list[subject_code] ['계약타입'][contract.SAFE] + contract.list[subject_code] ['계약타입'][contract.DRIBBLE]) + "개 청산 요청. 현재가:%s" % current_price) return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } ##heejun add 18.01.27 elif subject.info[subject_code]['flow'] == '하향' and calc.data[subject_code]['플로우'][-2] == '상향' and \ subject.info[subject_code]['반대매매'] == False \ and subject.info[subject_code]['sar'] > current_price: res.info("청산 타이밍 한번 놓쳤습니다.") subject.info[subject_code]['체결미스'] = True res.info("하향 반전되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청. 현재가:%s" % current_price) return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } ## elif current_price > contract.list[subject_code]['익절가']: contract.list[subject_code]['익절가'] = current_price + subject.info[subject_code]['익절틱'] * \ subject.info[subject_code]['단위'] # contract.list[subject_code]['손절가'] = current_price - subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위'] contract.list[subject_code]['손절가'] = current_price - subject.info[subject_code]['손절틱'] * \ subject.info[subject_code]['단위'] log.info("종목코드(" + subject_code + ") 익절가 갱신.") elif current_price - float(contract.list[subject_code]['체결가']) >= first_chungsan * \ subject.info[subject_code]['단위'] and contract.get_contract_count(subject_code) == \ subject.info[subject_code]['신규매매수량']: if contract.list[subject_code]['손절가'] < current_price - first_chungsan_dribble * \ subject.info[subject_code]['단위']: contract.list[subject_code][ '손절가'] = current_price - first_chungsan_dribble * subject.info[ subject_code]['단위'] contract.list[subject_code]['손절가'] = round( contract.list[subject_code]['손절가'], subject.info[subject_code]['자릿수']) res.info( "1차 청산 드리블 중 %s, 현재가: %s ,시간: %s" % (contract.list[subject_code]['손절가'], current_price, str(calc.data[subject_code]['체결시간'][-1])[8:14])) log.info( "1차 청산 드리블 중 %s, 현재가: %s, 시간: %s" % (contract.list[subject_code]['손절가'], current_price, str(calc.data[subject_code]['체결시간'][-1])[8:14])) elif current_price - float(contract.list[subject_code]['체결가']) >= second_chungsan * \ subject.info[subject_code]['단위'] and contract.get_contract_count(subject_code) == int( subject.info[subject_code]['신규매매수량'] - int(subject.info[subject_code]['신규매매수량'] / 2)): if contract.list[subject_code]['손절가'] < current_price - second_chungsan_dribble * \ subject.info[subject_code]['단위']: contract.list[subject_code][ '손절가'] = current_price - second_chungsan_dribble * subject.info[ subject_code]['단위'] res.info("2차 청산 드리블 중 %s" % contract.list[subject_code]['손절가']) log.info("2차 청산 드리블 중 %s" % contract.list[subject_code]['손절가']) # return {'신규주문':True, '매도수구분':'신규매도', '수량':int((contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]+1)/2)} elif contract.list[subject_code]['매도수구분'] == '신규매도': # 매도일때 if subject.info[subject_code]['반대매매'] == True: if current_price >= float( contract.list[subject_code]['체결가']) + ( subject.info[subject_code]['리버스손절틱'] * subject.info[subject_code]['단위']): res.info("반대매매 리버스 손절가가 되어 " + str(contract.list[subject_code]['계약타입'][ contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } if calc.data[subject_code]['현재플로우최극가'] + ( subject.info[subject_code]['손절틱'] * subject.info[subject_code]['단위']) < current_price: res.info("손절가가 되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } elif current_price >= contract.list[subject_code]['손절가']: if contract.get_contract_count( subject_code ) == subject.info[subject_code]['신규매매수량']: # 1차 청산일 때 # contract_num = int((contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) / 2) contract_num = int( (contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE])) if contract_num < 1: return {'신규주문': False} res.info("손절가가 되어 " + str(contract_num) + "개 청산 요청. 현재가:%s, 손절가:%s" % (current_price, contract.list[subject_code]['손절가'])) contract.list[subject_code]['손절가'] = current_price + subject.info[subject_code]['손절틱'] * \ subject.info[subject_code]['단위'] return { '신규주문': True, '매도수구분': '신규매수', '수량': contract_num } else: # 1차 청산 이후 청산 일 때 res.info("손절가가 되어 " + str(contract.list[subject_code]['계약타입'][ contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } elif calc.data[subject_code]['플로우'][ -1] == '하향' and subject.info[subject_code][ 'sar'] < current_price: if subject.info[subject_code]['반대매매'] == False: res.info("상향 반전되어 " + str(contract.list[subject_code] ['계약타입'][contract.SAFE] + contract.list[subject_code] ['계약타입'][contract.DRIBBLE]) + "개 청산 요청. 현재가: %s" % current_price) return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } elif calc.data[subject_code]['플로우'][ -1] == '상향' and subject.info[subject_code][ 'sar'] > current_price: if subject.info[subject_code]['반대매매'] == True: res.info("하향 반전되어 " + str(contract.list[subject_code] ['계약타입'][contract.SAFE] + contract.list[subject_code] ['계약타입'][contract.DRIBBLE]) + "개 청산 요청. 현재가:%s" % current_price) return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } ##heejun add 18.01.27 elif subject.info[subject_code]['flow'] == '상향' and calc.data[subject_code]['플로우'][-2] == '하향' and \ subject.info[subject_code]['반대매매'] == False \ and subject.info[subject_code]['sar'] < current_price: res.info("청산 타이밍 한번 놓쳤습니다.") subject.info[subject_code]['체결미스'] = True res.info("상향 반전되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청. 현재가:%s" % current_price) return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } ## elif current_price < contract.list[subject_code]['익절가']: contract.list[subject_code]['익절가'] = current_price - subject.info[subject_code]['익절틱'] * \ subject.info[subject_code]['단위'] # contract.list[subject_code]['손절가'] = current_price + subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위'] contract.list[subject_code]['손절가'] = current_price + subject.info[subject_code]['손절틱'] * \ subject.info[subject_code]['단위'] log.debug("종목코드(" + subject_code + ") 익절가 갱신.") elif (float(contract.list[subject_code]['체결가']) - current_price) >= first_chungsan * \ subject.info[subject_code]['단위'] and contract.get_contract_count(subject_code) == \ subject.info[subject_code]['신규매매수량']: # int(contract.get_contract_count(subject_code) / 2) > 0: if contract.list[subject_code]['손절가'] > current_price + first_chungsan_dribble * \ subject.info[subject_code]['단위']: contract.list[subject_code]['손절가'] = current_price + first_chungsan_dribble * \ subject.info[subject_code]['단위'] contract.list[subject_code]['손절가'] = round( contract.list[subject_code]['손절가'], subject.info[subject_code]['자릿수']) res.info( "1차 청산 드리블 중 %s, 현재가: %s ,시간: %s" % (contract.list[subject_code]['손절가'], current_price, str(calc.data[subject_code]['체결시간'][-1])[8:14])) log.info( "1차 청산 드리블 중 %s, 현재가: %s, 시간: %s" % (contract.list[subject_code]['손절가'], current_price, str(calc.data[subject_code]['체결시간'][-1])[8:14])) elif (float(contract.list[subject_code]['체결가']) - current_price) >= second_chungsan * \ subject.info[subject_code]['단위'] and contract.get_contract_count(subject_code) == int( subject.info[subject_code]['신규매매수량'] - int(subject.info[subject_code]['신규매매수량'] / 2)): if contract.list[subject_code]['손절가'] > current_price + second_chungsan_dribble * \ subject.info[subject_code]['단위']: contract.list[subject_code]['손절가'] = current_price + second_chungsan_dribble * \ subject.info[subject_code]['단위'] res.info("2차 청산 드리블 중 %s" % contract.list[subject_code]['손절가']) log.info("2차 청산 드리블 중 %s" % contract.list[subject_code]['손절가']) # return {'신규주문':True, '매도수구분':'신규매수', '수량':int((contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]+1)/2)} except Exception as err: log.error(err) return {'신규주문': False}
def is_it_OK(subject_code, current_price): global previous_profit global temp_index start_price = subject.info[subject_code]['시가'] profit = 0 profit_tick = subject.info[subject_code]['익절틱'] sonjal_tick = subject.info[subject_code]['손절틱'] mesu_medo_type = None false = {'신규주문': False} ma_line_is_true = True 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 calc(subject_code): ''' 각종 그래프 계산 ''' if subject.info[subject_code]['전략'] == '파라': sar = subject.info[subject_code]['sar'] if data[subject_code]['idx'] < 5: data[subject_code]['플로우'].append('모름') if data[subject_code]['idx'] == 5: init_sar(subject_code) elif data[subject_code]['idx'] > 5: calculate_sar(subject_code) calc_ma_line(subject_code) trend = is_sorted(subject_code, subject.info[subject_code]['이동평균선']) data[subject_code]['추세'].append(trend) calc_ema_line(subject_code) calc_ilmok_chart(subject_code) calc_linear_regression(subject_code) elif subject.info[subject_code]['전략'] == '풀파라' or subject.info[ subject_code]['전략'] == '리버스온리': sar = subject.info[subject_code]['sar'] if data[subject_code]['idx'] < 5: data[subject_code]['플로우'].append('모름') if data[subject_code]['idx'] == 5: init_sar(subject_code) elif data[subject_code]['idx'] > 5: calculate_sar(subject_code) calc_ma_line(subject_code) trend = is_sorted(subject_code, subject.info[subject_code]['이동평균선']) data[subject_code]['추세'].append(trend) log.debug("현재플로우 : " + data[subject_code]['플로우'][-1] + " / 현재플로우최극가 : " + str(data[subject_code]['현재플로우최극가'])) if data[subject_code]['플로우'][-1] == '상향': if data[subject_code]['현재플로우최극가'] < data[subject_code]['고가'][-1]: data[subject_code]['현재플로우최극가'] = float( data[subject_code]['고가'][-1]) else: if data[subject_code]['현재플로우최극가'] > data[subject_code]['저가'][-1]: data[subject_code]['현재플로우최극가'] = float( data[subject_code]['저가'][-1]) #if data[subject_code]['idx'] > 9000: log.info("SAR : %s" % sar) ''' calc_ema_line(subject_code) calc_ilmok_chart(subject_code) calc_linear_regression_in_para(subject_code) ''' elif subject.info[subject_code]['전략'] == '추세선밴드': calc_ma_line(subject_code) calc_ema_line(subject_code) trend = is_sorted(subject_code, subject.info[subject_code]['이동평균선']) data[subject_code]['추세'].append(trend) if data[subject_code]['idx'] >= subject.info[subject_code]['이동평균선'][-1]: if trend != data[subject_code]['추세'][-2]: # 추세 반전 if data[subject_code]['추세연속틱'] < subject.info[subject_code][ '최소연속틱'] or data[subject_code][ '정배열연속틱'] < subject.info[subject_code]['최소연속틱'] / 2: # 추세 극점부터 연속 틱이 60 이하일 경우 추세 아님 my_util.chanege_past_trend( subject_code) # 추세가 아니므로, 지난 추세를 현재추세로 덮어씌워 연속된 추세를 만듬 log.info('이동평균선 추세 연속틱 재설정.') data[subject_code][ '추세연속틱'] = my_util.get_trend_continuous_tick_count( subject_code) data[subject_code]['정배열연속틱'] = 1 if contract.get_contract_count( subject_code ) == 0 and subject.info[subject_code]['상태'] != '중립대기': log.info('종목코드 : ' + subject_code + ' 상태 변경, ' + subject.info[subject_code]['상태'] + ' -> 중립대기.') subject.info[subject_code]['상태'] = '중립대기' else: data[subject_code]['추세연속틱'] += 1 data[subject_code]['정배열연속틱'] += 1 log.info('이동평균선 ' + trend + ' 추세 연속 : ' + str(data[subject_code]['추세연속틱']) + '틱') calc_linear_regression(subject_code) calc_bollinger_bands(subject_code) calc_ilmok_chart(subject_code) elif subject.info[subject_code]['전략'] == '큰파라': calc_ma_line(subject_code) sar = subject.info[subject_code]['sar'] if data[subject_code]['idx'] < 5: data[subject_code]['플로우'].append('모름') if data[subject_code]['idx'] == 5: init_sar(subject_code) elif data[subject_code]['idx'] > 5: calculate_sar(subject_code) else: calc_ma_line(subject_code)
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