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_OK(subject_code, current_price): profit_tick = 10 loss_tick = 10 mesu_medo_type = '' contract_cnt = 2 index = calc.data[subject_code]['idx'] false = {'신규주문':False} if calc.data[subject_code]['idx'] < 300: return false state = subject.info[subject_code]['상태'] if state == '매수중' or state == '매도중': return false elif state == '매매완료': if subject.info[subject_code]['flow'] == '하향' and subject.info[subject_code]['sar'] < current_price: subject.info[subject_code]['상태'] = '매수가능' elif subject.info[subject_code]['flow'] == '상향' and subject.info[subject_code]['sar'] > current_price: subject.info[subject_code]['상태'] = '매도가능' elif state == '매수가능' or state == '매도가능': if state == '매수가능' and my_util.is_sorted(subject_code) == '상승세': res.info('종목(' + subject_code + ') 현재 상승세이므로 매수 시도.') mesu_medo_type = '신규매수' profit_tick = subject.info[subject_code]['익절틱'] loss_tick = subject.info[subject_code]['손절틱'] contract_cnt = 2 elif state == '매도가능' and my_util.is_sorted(subject_code) == '하락세': res.info('종목(' + subject_code + ') 현재 하락세이므로 매도 시도.') mesu_medo_type = '신규매도' profit_tick = subject.info[subject_code]['익절틱'] loss_tick = subject.info[subject_code]['손절틱'] contract_cnt = 2 else: subject.info[subject_code]['상태'] = '매매완료' return false else: return false order_contents = {'신규주문':True, '매도수구분':mesu_medo_type, '익절틱':profit_tick, '손절틱':loss_tick, '수량':contract_cnt} ''' res.info('##### 주문 예정 #####') res.info(order_contents) chart.draw(subject_code) input() ''' return order_contents
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 calculate(subject_code): init_af = subject.info[subject_code]['init_af'] af = subject.info[subject_code]['af'] max_af = subject.info[subject_code]['maxaf'] ''' # Difference of High and Low differences = [] for idx in range(0, len(list['현재가'])): differences.append(list['고가'][idx] - list['저가'][idx]) # STDEV of differences stDev = self.standard_deviation(list) sarArr = [None] * len(list['현재가']) # Find first non-NA value beg = 1; for idx in range(0, len(list['현재가'])): if list['고가'][idx] == 0 or list['저가'][idx] == 0: sarArr[idx] = 0 beg += 1 else: break ''' # Initialize values needed by the routine sig0 = subject.info[subject_code]['flow'] sig1 = subject.info[subject_code]['flow'] ep = subject.info[subject_code]['ep'] prev_sar = subject.info[subject_code]['sar'] # Local extreme lmin = min(calc.data[subject_code]['저가'][-2], calc.data[subject_code]['저가'][-1]) lmax = max(calc.data[subject_code]['고가'][-2], calc.data[subject_code]['고가'][-1]) #res.info('시가: ' + str(list['시가'][-1]) + ' 고가: ' + str(list['고가'][-1]) + ' 저가: ' + str(list['저가'][-1]) + ' 현재가: ' + str(list['현재가'][-1])) # Create signal and extreme price vectors if sig1 == '상향': # Previous buy signal new_sar = prev_sar + (ep - prev_sar) * af; if calc.data[subject_code]['저가'][-1] >= new_sar: sig0 = '상향' else: sig0 = '하향' # New signal res.info('상향->하향 반전, list[저가][-1] = ' + str(calc.data[subject_code]['저가'][-1]) + ', sarArr[-1] = ' + str(new_sar)) res.info('체결시간(' + str(calc.data[subject_code]['체결시간'][-1])[-6:-4] + ':' + str(calc.data[subject_code]['체결시간'][-1])[-4:-2] + ':' + str(calc.data[subject_code]['체결시간'][-1])[-2:] + ')') subject.info[subject_code]['ep'] = max(lmax, ep) # New extreme price else: # Previous sell signal new_sar = prev_sar + (ep - prev_sar) * af; if calc.data[subject_code]['고가'][-1] < new_sar: sig0 = '하향' else: sig0 = '상향' # New signal res.info('하향->상향 반전, list[고가][-1] = ' + str(calc.data[subject_code]['고가'][-1]) + ', sarArr[-1] = ' + str(new_sar)) res.info('체결시간(' + str(calc.data[subject_code]['체결시간'][-1])[-6:-4] + ':' + str(calc.data[subject_code]['체결시간'][-1])[-4:-2] + ':' + str(calc.data[subject_code]['체결시간'][-1])[-2:] + ')') subject.info[subject_code]['ep'] = min(lmin, ep) # New extreme price # Calculate acceleration factor (af) and stop-and-reverse (sar) vector # No signal change if sig0 == sig1: # Initial calculations new_sar = prev_sar + (ep - prev_sar) * af; # Current buy signal if sig0 == '상향': if subject.info[subject_code]['ep'] > ep: subject.info[subject_code]['af'] = min(max_af, af + init_af) if new_sar > lmin: new_sar = lmin # Determine sar value # Current sell signal else: if subject.info[subject_code]['ep'] < ep: subject.info[subject_code]['af'] = min(max_af, af + init_af) if new_sar <= lmax: new_sar = lmax # Determine sar value else: # New signal subject.info[subject_code]['af'] = subject.info[subject_code]['init_af'] # reset acceleration factor */ subject.info[subject_code]['flow'] = sig0 ''' if sig0 == '상향': subject.info[subject_code]['ep'] = lmax new_sar = lmin else: subject.info[subject_code]['ep'] = lmin new_sar = lmax ''' new_sar = subject.info[subject_code]['ep'] # set sar value res.info('캔들(' + str(calc.data[subject_code]['체결시간'][-1]) + '), SAR = ' + str(new_sar)) #subject.info[subject_code]['sar'] = round(new_sar, subject.info[subject_code]['자릿수']) subject.info[subject_code]['sar'] = new_sar
def is_it_sell(subject_code, current_price): index = calc.data[subject_code]['idx'] # if 1446 < get_time(0, subject_code) < 1447: # log.info('%s : current_price : %s sar : %s' % (str(calc.data[subject_code]['체결시간'][-1])[4:14], current_price, subject.info[subject_code]['sar'])) try: #first_chungsan = 70 first_chungsan = subject.info[subject_code]['1차청산틱'] first_chungsan_dribble = 2 second_chungsan = 999 second_chungsan_dribble = 15 sar_before_reverse_tic = 0 # log.debug("종목코드(" + subject_code + ") is_it_sell() 진입.") # log.debug("종목코드(" + subject_code + ") 현재 Flow : " + subject.info[subject_code]['flow'] + " / SAR : " + str(subject.info[subject_code]['sar'])) if contract.get_contract_count(subject_code) > 0: # 계약 보유중 # log.debug("종목코드(" + subject_code + ") is_it_sell() / 보유 계약 : " + str(contract.get_contract_count(subject_code))) if contract.list[subject_code]['매도수구분'] == '신규매수': # 매수일때 if subject.info[subject_code]['반대매매'] == True: if current_price <= float( contract.list[subject_code]['체결가']) - ( subject.info[subject_code]['리버스손절틱'] * subject.info[subject_code]['단위']): res.info("반대매매 리버스 손절가가 되어 " + str(contract.list[subject_code]['계약타입'][ contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } if calc.data[subject_code]['현재플로우최극가'] - ( subject.info[subject_code]['손절틱'] * subject.info[subject_code]['단위']) > current_price: res.info("손절가가 되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } elif current_price <= contract.list[subject_code]['손절가']: if contract.get_contract_count( subject_code ) == subject.info[subject_code]['신규매매수량']: # 1차 청산일 때 # contract_num = int((contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) / 2) contract_num = int( (contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE])) if contract_num < 1: return {'신규주문': False} res.info("손절가가 되어 " + str(contract_num) + "개 청산 요청. 현재가:%s, 손절가:%s" % (current_price, contract.list[subject_code]['손절가'])) contract.list[subject_code]['손절가'] = current_price - subject.info[subject_code]['손절틱'] * \ subject.info[subject_code]['단위'] return { '신규주문': True, '매도수구분': '신규매도', '수량': contract_num } else: # 1차 청산 이후 청산일 때 res.info("손절가가 되어 " + str(contract.list[subject_code]['계약타입'][ contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } elif calc.data[subject_code]['플로우'][ -1] == '상향' and subject.info[subject_code][ 'sar'] > current_price: if subject.info[subject_code]['반대매매'] == False: res.info("하향 반전되어 " + str(contract.list[subject_code] ['계약타입'][contract.SAFE] + contract.list[subject_code] ['계약타입'][contract.DRIBBLE]) + "개 청산 요청. 현재가:%s" % current_price) return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } elif calc.data[subject_code]['플로우'][ -1] == '하향' and subject.info[subject_code][ 'sar'] < current_price: if subject.info[subject_code]['반대매매'] == True: res.info("상향 반전되어 " + str(contract.list[subject_code] ['계약타입'][contract.SAFE] + contract.list[subject_code] ['계약타입'][contract.DRIBBLE]) + "개 청산 요청. 현재가:%s" % current_price) return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } ##heejun add 18.01.27 elif subject.info[subject_code]['flow'] == '하향' and calc.data[subject_code]['플로우'][-2] == '상향' and \ subject.info[subject_code]['반대매매'] == False \ and subject.info[subject_code]['sar'] > current_price: res.info("청산 타이밍 한번 놓쳤습니다.") subject.info[subject_code]['체결미스'] = True res.info("하향 반전되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청. 현재가:%s" % current_price) return { '신규주문': True, '매도수구분': '신규매도', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } ## elif current_price > contract.list[subject_code]['익절가']: contract.list[subject_code]['익절가'] = current_price + subject.info[subject_code]['익절틱'] * \ subject.info[subject_code]['단위'] # contract.list[subject_code]['손절가'] = current_price - subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위'] contract.list[subject_code]['손절가'] = current_price - subject.info[subject_code]['손절틱'] * \ subject.info[subject_code]['단위'] log.info("종목코드(" + subject_code + ") 익절가 갱신.") elif current_price - float(contract.list[subject_code]['체결가']) >= first_chungsan * \ subject.info[subject_code]['단위'] and contract.get_contract_count(subject_code) == \ subject.info[subject_code]['신규매매수량']: if contract.list[subject_code]['손절가'] < current_price - first_chungsan_dribble * \ subject.info[subject_code]['단위']: contract.list[subject_code][ '손절가'] = current_price - first_chungsan_dribble * subject.info[ subject_code]['단위'] contract.list[subject_code]['손절가'] = round( contract.list[subject_code]['손절가'], subject.info[subject_code]['자릿수']) res.info( "1차 청산 드리블 중 %s, 현재가: %s ,시간: %s" % (contract.list[subject_code]['손절가'], current_price, str(calc.data[subject_code]['체결시간'][-1])[8:14])) log.info( "1차 청산 드리블 중 %s, 현재가: %s, 시간: %s" % (contract.list[subject_code]['손절가'], current_price, str(calc.data[subject_code]['체결시간'][-1])[8:14])) elif current_price - float(contract.list[subject_code]['체결가']) >= second_chungsan * \ subject.info[subject_code]['단위'] and contract.get_contract_count(subject_code) == int( subject.info[subject_code]['신규매매수량'] - int(subject.info[subject_code]['신규매매수량'] / 2)): if contract.list[subject_code]['손절가'] < current_price - second_chungsan_dribble * \ subject.info[subject_code]['단위']: contract.list[subject_code][ '손절가'] = current_price - second_chungsan_dribble * subject.info[ subject_code]['단위'] res.info("2차 청산 드리블 중 %s" % contract.list[subject_code]['손절가']) log.info("2차 청산 드리블 중 %s" % contract.list[subject_code]['손절가']) # return {'신규주문':True, '매도수구분':'신규매도', '수량':int((contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]+1)/2)} elif contract.list[subject_code]['매도수구분'] == '신규매도': # 매도일때 if subject.info[subject_code]['반대매매'] == True: if current_price >= float( contract.list[subject_code]['체결가']) + ( subject.info[subject_code]['리버스손절틱'] * subject.info[subject_code]['단위']): res.info("반대매매 리버스 손절가가 되어 " + str(contract.list[subject_code]['계약타입'][ contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } if calc.data[subject_code]['현재플로우최극가'] + ( subject.info[subject_code]['손절틱'] * subject.info[subject_code]['단위']) < current_price: res.info("손절가가 되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } elif current_price >= contract.list[subject_code]['손절가']: if contract.get_contract_count( subject_code ) == subject.info[subject_code]['신규매매수량']: # 1차 청산일 때 # contract_num = int((contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) / 2) contract_num = int( (contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE])) if contract_num < 1: return {'신규주문': False} res.info("손절가가 되어 " + str(contract_num) + "개 청산 요청. 현재가:%s, 손절가:%s" % (current_price, contract.list[subject_code]['손절가'])) contract.list[subject_code]['손절가'] = current_price + subject.info[subject_code]['손절틱'] * \ subject.info[subject_code]['단위'] return { '신규주문': True, '매도수구분': '신규매수', '수량': contract_num } else: # 1차 청산 이후 청산 일 때 res.info("손절가가 되어 " + str(contract.list[subject_code]['계약타입'][ contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE]) + "개 청산 요청.") return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } elif calc.data[subject_code]['플로우'][ -1] == '하향' and subject.info[subject_code][ 'sar'] < current_price: if subject.info[subject_code]['반대매매'] == False: res.info("상향 반전되어 " + str(contract.list[subject_code] ['계약타입'][contract.SAFE] + contract.list[subject_code] ['계약타입'][contract.DRIBBLE]) + "개 청산 요청. 현재가: %s" % current_price) return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } elif calc.data[subject_code]['플로우'][ -1] == '상향' and subject.info[subject_code][ 'sar'] > current_price: if subject.info[subject_code]['반대매매'] == True: res.info("하향 반전되어 " + str(contract.list[subject_code] ['계약타입'][contract.SAFE] + contract.list[subject_code] ['계약타입'][contract.DRIBBLE]) + "개 청산 요청. 현재가:%s" % current_price) return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][ contract.DRIBBLE] } ##heejun add 18.01.27 elif subject.info[subject_code]['flow'] == '상향' and calc.data[subject_code]['플로우'][-2] == '하향' and \ subject.info[subject_code]['반대매매'] == False \ and subject.info[subject_code]['sar'] < current_price: res.info("청산 타이밍 한번 놓쳤습니다.") subject.info[subject_code]['체결미스'] = True res.info("상향 반전되어 " + str( contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]) + "개 청산 요청. 현재가:%s" % current_price) return { '신규주문': True, '매도수구분': '신규매수', '수량': contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE] } ## elif current_price < contract.list[subject_code]['익절가']: contract.list[subject_code]['익절가'] = current_price - subject.info[subject_code]['익절틱'] * \ subject.info[subject_code]['단위'] # contract.list[subject_code]['손절가'] = current_price + subject.info[subject_code]['익절틱'] * subject.info[subject_code]['단위'] contract.list[subject_code]['손절가'] = current_price + subject.info[subject_code]['손절틱'] * \ subject.info[subject_code]['단위'] log.debug("종목코드(" + subject_code + ") 익절가 갱신.") elif (float(contract.list[subject_code]['체결가']) - current_price) >= first_chungsan * \ subject.info[subject_code]['단위'] and contract.get_contract_count(subject_code) == \ subject.info[subject_code]['신규매매수량']: # int(contract.get_contract_count(subject_code) / 2) > 0: if contract.list[subject_code]['손절가'] > current_price + first_chungsan_dribble * \ subject.info[subject_code]['단위']: contract.list[subject_code]['손절가'] = current_price + first_chungsan_dribble * \ subject.info[subject_code]['단위'] contract.list[subject_code]['손절가'] = round( contract.list[subject_code]['손절가'], subject.info[subject_code]['자릿수']) res.info( "1차 청산 드리블 중 %s, 현재가: %s ,시간: %s" % (contract.list[subject_code]['손절가'], current_price, str(calc.data[subject_code]['체결시간'][-1])[8:14])) log.info( "1차 청산 드리블 중 %s, 현재가: %s, 시간: %s" % (contract.list[subject_code]['손절가'], current_price, str(calc.data[subject_code]['체결시간'][-1])[8:14])) elif (float(contract.list[subject_code]['체결가']) - current_price) >= second_chungsan * \ subject.info[subject_code]['단위'] and contract.get_contract_count(subject_code) == int( subject.info[subject_code]['신규매매수량'] - int(subject.info[subject_code]['신규매매수량'] / 2)): if contract.list[subject_code]['손절가'] > current_price + second_chungsan_dribble * \ subject.info[subject_code]['단위']: contract.list[subject_code]['손절가'] = current_price + second_chungsan_dribble * \ subject.info[subject_code]['단위'] res.info("2차 청산 드리블 중 %s" % contract.list[subject_code]['손절가']) log.info("2차 청산 드리블 중 %s" % contract.list[subject_code]['손절가']) # return {'신규주문':True, '매도수구분':'신규매수', '수량':int((contract.list[subject_code]['계약타입'][contract.SAFE] + contract.list[subject_code]['계약타입'][contract.DRIBBLE]+1)/2)} except Exception as err: log.error(err) return {'신규주문': False}
def is_it_OK(subject_code, current_price): global previous_profit global temp_index start_price = subject.info[subject_code]['시가'] profit = 0 profit_tick = subject.info[subject_code]['익절틱'] sonjal_tick = subject.info[subject_code]['손절틱'] mesu_medo_type = None false = {'신규주문': False} ma_line_is_true = True reverse_tic = subject.info[subject_code]['반대매매틱'] # 300캔들이 없으면 매매 안함 if calc.data[subject_code]['idx'] < 300: return false if subject.info[subject_code]['상태'] == '매수중' or subject.info[subject_code]['상태'] == '매도중' or \ subject.info[subject_code]['상태'] == '청산시도중' or subject.info[subject_code]['상태'] == '매매시도중': log.debug('신규 주문 가능상태가 아니므로 매매 불가. 상태 : ' + subject.info[subject_code]['상태']) return false # log.debug("종목코드(" + subject_code + ") 현재 Flow : " + subject.info[subject_code]['flow'] + " / SAR : " + str(subject.info[subject_code]['sar']) + " / 추세 : " + my_util.is_sorted(subject_code)) # 여기서 상향/하향계산은 2개로 나뉨 1. 캐들만들고 있을때~! 2. 캔들 완성시!! # calc를 통해서 calc.push -> calc를 통해 여러가지 계산을 하는데 이때 flow를 저장 즉, 실데이터가 딱 들어오면 바로 계산끝 if subject.info[subject_code]['flow'] == '상향': if current_price < subject.info[subject_code]['sar']: # 여기에 들어온건 상향일때 현재가격이 sar보다 작아져 하향반전을 이룰때 log.debug("종목코드(" + subject_code + ") 하향 반전.") profit = current_price - calc.data[subject_code]['이전반전시SAR값'][-1] if len(calc.data[subject_code]['SAR반전시간']) > 0 and calc.data[subject_code]['SAR반전시간'][-1] == \ calc.data[subject_code]['체결시간'][-1]: # 반전 후 SAR로 갱신되었다면 profit = current_price - calc.data[subject_code]['이전반전시SAR값'][-2] if my_util.is_sorted(subject_code) == '하락세': mesu_medo_type = '신규매도' else: res.info("이동평균선이 맞지 않아 매수 포기합니다.") ma_line_is_true = False mesu_medo_type = '신규매도' # return false elif calc.data[subject_code]['플로우'][-2] == '하향': # 하향으로 진행하던 플로가 상향으로 상향 반전될때! ex)리스트[-1]은 리스트의 가장 마지막 항목이다 log.debug("종목코드(" + subject_code + ") 상향 반전.") profit = calc.data[subject_code]['이전반전시SAR값'][-1] - current_price if len(calc.data[subject_code]['SAR반전시간']) > 0 and calc.data[subject_code]['SAR반전시간'][-1] == \ calc.data[subject_code]['체결시간'][-1]: # 반전 후 SAR로 갱신되었다면 profit = calc.data[subject_code]['이전반전시SAR값'][-2] - current_price if my_util.is_sorted(subject_code) == '상승세': mesu_medo_type = '신규매수' else: res.info("이동평균선이 맞지 않아 매수 포기합니다.") ma_line_is_true = False mesu_medo_type = '신규매수' # return false else: return false elif subject.info[subject_code]['flow'] == '하향': if current_price > subject.info[subject_code]['sar']: log.debug("종목코드(" + subject_code + ") 상향 반전.") profit = calc.data[subject_code]['이전반전시SAR값'][-1] - current_price if len(calc.data[subject_code]['SAR반전시간']) > 0 and calc.data[subject_code]['SAR반전시간'][-1] == \ calc.data[subject_code]['체결시간'][-1]: # 반전 후 SAR로 갱신되었다면 profit = calc.data[subject_code]['이전반전시SAR값'][-2] - current_price if my_util.is_sorted(subject_code) == '상승세': mesu_medo_type = '신규매수' else: res.info("이동평균선이 맞지 않아 매수 포기합니다.") ma_line_is_true = False mesu_medo_type = '신규매수' # return false elif calc.data[subject_code]['플로우'][-2] == '상향': log.debug("종목코드(" + subject_code + ") 하향 반전.") profit = current_price - calc.data[subject_code]['이전반전시SAR값'][-1] if len(calc.data[subject_code]['SAR반전시간']) > 0 and calc.data[subject_code]['SAR반전시간'][-1] == \ calc.data[subject_code]['체결시간'][-1]: # 반전 후 SAR로 갱신되었다면 profit = current_price - calc.data[subject_code]['이전반전시SAR값'][-2] if my_util.is_sorted(subject_code) == '하락세': mesu_medo_type = '신규매도' else: res.info("이동평균선이 맞지 않아 매수 포기합니다.") ma_line_is_true = False mesu_medo_type = '신규매도' # return false else: return false else: return false profit = profit / subject.info[subject_code]['단위'] if len(subject.info[subject_code]['맞틀리스트']) < 5: return false if subject.info[subject_code]['반대매매'] == True: subject.info[subject_code]['반대매매'] = False log.info("반대대대 False로 변경.") if len(calc.data[subject_code]['SAR반전시간']) > 0 and calc.data[subject_code]['SAR반전시간'][-1] == \ calc.data[subject_code]['체결시간'][-1]: # 반전 후 SAR로 갱신되었다면 if subject.info[subject_code]['맞틀리스트'][-2] == '맞' and subject.info[subject_code]['맞틀리스트'][-1] == '틀': if subject.info[subject_code]['수익리스트'][-2] > 70: log.info("지지난 플로우가 70이상 수익으로 진입안합니다.") return false else: pass if subject.info[subject_code]['수익리스트'][-1] > 160: if mesu_medo_type == '신규매도': mesu_medo_type = '신규매수' elif mesu_medo_type == '신규매수': mesu_medo_type = '신규매도' log.info("[%s] 반대매매 조건이 맞아 반대 매매 진입합니다.(전 플로우 160틱 이상 수익)(1)" % mesu_medo_type) ma_line_is_true = True subject.info[subject_code]['반대매매'] = True elif subject.info[subject_code]['맞틀리스트'][-4:] == ['틀','틀', '틀', '틀']: if subject.info[subject_code]['수익리스트'][-2] < subject.info[subject_code]['수익리스트'][-1] and subject.info[subject_code]['수익리스트'][-2] < -15: log.info("틀틀틀틀일때 조건이 맞지 않아 진입 안합니다.") return false else: log.info("틀틀틀틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-4:] == ['틀','맞', '맞', '틀']: log.info("틀맞맞틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-4:] == ['틀','맞', '틀', '틀']: log.info("틀맞틀틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-4:] == ['맞','틀', '틀', '맞']: if subject.info[subject_code]['수익리스트'][-1] > 10: log.info("이전 플로우 수익이 10틱 이상으로 매매 진입 안합니다.") return false else: log.info("맞틀틀맞 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-4:] == ['틀', '틀', '틀', '맞']: if subject.info[subject_code]['수익리스트'][-3] < -10: log.info("이전 플로우 수익이 10틱 이하로 매매 진입 안합니다.") return false else: log.info("틀틀틀맞 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-4:] == ['맞', '맞', '맞', '틀']: log.info("맞맞맞틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-4:] == ['틀', '틀', '맞', '맞']: log.info("틀틀맞맞 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-4:] == ['맞', '맞', '틀', '틀']: if subject.info[subject_code]['수익리스트'][-4] < subject.info[subject_code]['수익리스트'][-3]: log.info("맞맞틀틀일때 조건이 맞지 않아 진입 안합니다.") return false else: log.info("맞맞틀틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-4:] == ['맞', '틀', '틀', '틀']: if subject.info[subject_code]['수익리스트'][-2] < -10: log.info("맞틀틀틀일때 조건이 맞지 않아 진입 안합니다.") return false else: log.info("맞틀틀틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '맞', '틀']: if subject.info[subject_code]['수익리스트'][-2] > 70: log.info("지지난 플로우가 70이상 수익으로 진입안합니다.") return false else: log.info("틀맞틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-3:] == ['맞', '틀', '맞'] and profit > reverse_tic: if mesu_medo_type == '신규매도': mesu_medo_type = '신규매수' elif mesu_medo_type == '신규매수': mesu_medo_type = '신규매도' log.info("[%s] 반대매매 조건이 맞아 반대 매매 진입합니다." % mesu_medo_type) ma_line_is_true = True subject.info[subject_code]['반대매매'] = True else: log.info("맞틀 조건이 맞지 않아 매매 포기합니다.") return false else: if subject.info[subject_code]['맞틀리스트'][-1] == '맞' and profit < 0: if subject.info[subject_code]['수익리스트'][-1] > 70: log.info("지지난 플로우가 70이상 수익으로 진입안합니다.") return false else: pass if profit > 160: if mesu_medo_type == '신규매도': mesu_medo_type = '신규매수' elif mesu_medo_type == '신규매수': mesu_medo_type = '신규매도' log.info("[%s] 반대매매 조건이 맞아 반대 매매 진입합니다.(전 플로우 160틱 이상 수익)4" % mesu_medo_type) ma_line_is_true = True subject.info[subject_code]['반대매매'] = True elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '틀', '틀'] and profit < 0: if subject.info[subject_code]['수익리스트'][-1] < profit and subject.info[subject_code]['수익리스트'][-1] < -15: log.info("틀틀틀틀일때 조건이 맞지 않아 진입 안합니다.") return false else: log.info("틀틀틀틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '맞', '맞'] and profit < 0: log.info("틀맞맞틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '맞', '틀'] and profit < 0: log.info("틀맞틀틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-3:] == ['맞', '틀', '틀'] and profit > 0: if profit > 10: log.info("이전 플로우 수익이 10틱 이상으로 매매 진입 안합니다.") return false else: log.info("맞틀틀맞 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '틀', '틀'] and profit > 0: if subject.info[subject_code]['수익리스트'][-2] < -10: log.info("이전 플로우 수익이 10틱 이하로 매매 진입 안합니다.") return false else: log.info("틀틀틀맞 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-3:] == ['맞', '맞', '맞'] and profit < 0: log.info("맞맞맞틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-3:] == ['틀', '틀', '맞'] and profit > 0: log.info("틀틀맞맞 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-3:] == ['맞','맞', '틀'] and profit < 0: if subject.info[subject_code]['수익리스트'][-3] < subject.info[subject_code]['수익리스트'][-2]: log.info("맞맞틀틀일때 조건이 맞지 않아 진입 안합니다.") return false else: log.info("맞맞틀틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-3:] == ['맞', '틀', '틀'] and profit < 0: if subject.info[subject_code]['수익리스트'][-1] < -10: log.info("맞틀틀틀일때 조건이 맞지 않아 진입 안합니다.") return false else: log.info("맞틀틀틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-2:] == ['틀', '맞'] and profit < 0: if subject.info[subject_code]['수익리스트'][-1] > 70: log.info("지지난 플로우가 70이상 수익으로 진입안합니다.") return false else: log.info("틀맞틀 다음으로 매매 진입합니다.") pass elif subject.info[subject_code]['맞틀리스트'][-2:] == ['맞', '틀'] and profit > reverse_tic: if mesu_medo_type == '신규매도': mesu_medo_type = '신규매수' elif mesu_medo_type == '신규매수': mesu_medo_type = '신규매도' log.info("[%s] 반대매매 조건이 맞아 반대 매매 진입합니다." % mesu_medo_type) ma_line_is_true = True subject.info[subject_code]['반대매매'] = True else: log.info("맞틀 조건이 맞지 않아 매매 포기합니다.") return false if ma_line_is_true == False: return false #if get_time(0, subject_code) > 2100 and get_time(0, subject_code) < 2230 and subject.info[subject_code][ # '반대매매'] == False: # log.info("21:00~22:30 시 사이라 매매 포기 합니다.") # return false if d.get_mode() == d.REAL: # 실제 투자 할때 if get_time(0, subject_code) > 2200 and get_time(0, subject_code) < 2330 and subject.info[subject_code]['반대매매'] == False: log.info("21:00~22:30 시 사이라 매매 포기 합니다.") return false elif get_time(0, subject_code) == int(subject.info[subject_code]['시작시간']) or get_time(0, subject_code) == int( subject.info[subject_code]['마감시간']): log.info("장 시작 시간, 마감 시간 정각에 매매하지 않습니다. 매매금지") return false else: if subject == "GCG18": if get_time(0, subject_code) > 2200 and get_time(0, subject_code) < 2330 and subject.info[subject_code]['반대매매'] == False: log.info("21:00~22:30 시 사이라 매매 포기 합니다.") return false else: if get_time(0, subject_code) > 2100 and get_time(0, subject_code) < 2230 and subject.info[subject_code]['반대매매'] == False: log.info("21:00~22:30 시 사이라 매매 포기 합니다.") return false if get_time(0, subject_code) == int(subject.info[subject_code]['시작시간']) or get_time(0, subject_code) == int( subject.info[subject_code]['마감시간']): log.info("장 시작 시간, 마감 시간 정각에 매매하지 않습니다. 매매금지") return false if d.get_mode() == d.REAL: # 실제 투자 할때 possible_contract_cnt = int(contract.my_deposit / subject.info[subject_code]['위탁증거금']) log.info("possible_contract_cnt %s개 입니다." % possible_contract_cnt) contract_cnt = int(contract.my_deposit / 1.2 / subject.info[subject_code]['위탁증거금']) log.info("contract_cnt %s개 입니다." % contract_cnt) if contract.recent_trade_cnt == possible_contract_cnt: contract_cnt = possible_contract_cnt log.info("매매 예정 수량은 %s개 입니다." % contract_cnt) if contract_cnt == 0: contract_cnt = 2 # contract_cnt = 2 else: contract_cnt = 2 # 테스트 돌릴때 if contract_cnt > 1: subject.info[subject_code]['신규매매수량'] = contract_cnt elif contract_cnt == 1: subject.info[subject_code]['신규매매수량'] = 2 # heejun add `17.8.16 number_of_current_contract = int(contract.get_contract_count(subject_code)) if number_of_current_contract > 0 and subject.info[subject_code]['반대매매'] == False: return false # 계약을 가지고 있으면서 반대매매가 아니면 추가매매 금지 if subject.info[subject_code]['반대매매'] == True: # 만약 1계약이 1차 청산되고 1계약만 드리블 중 반전되었다면 나머지 한계약만 추가 리버스파라 매매 진입 contract_cnt = contract_cnt - number_of_current_contract log.debug("반대매매 True 로 계약수 조정, 계약수: %s개" % contract_cnt) ###################### log.debug("종목코드(" + subject_code + ") 신규 매매 계약 수 " + str(contract_cnt)) ###### #contract_cnt = 0 if contract_cnt == 0: return false order_contents = {'신규주문': True, '매도수구분': mesu_medo_type, '익절틱': profit_tick, '손절틱': sonjal_tick, '수량': contract_cnt} subject.info[subject_code]['주문내용'] = order_contents log.debug('para.is_it_OK() : 모든 구매조건 통과.') log.debug(order_contents) return order_contents