def get_best_coin_name(investable_coins_map={}, prev_coins_map={}): while True: if dict(investable_coins_map): print(f'original_map ::: {investable_coins_map}') if dict(prev_coins_map): print(f'prev_coins_map ::: {prev_coins_map}') # 코인 맵에서 이전 상승률 보다 현재 상승률이 낮은 코인 제거 filtered_map = pyupbit.map_filtering(prev_coins_map, investable_coins_map) print(f'original_map :: {investable_coins_map} / filtered_map :: {filtered_map}') investable_coins_map = filtered_map if dict(investable_coins_map): # investable_coins_map = { 코인 코드 : 현재가와 1차 저항선 간 차이% } # 투자 대상 코인을 현재가와 1차 저항선 간 차이 기준으로 정렬(asc) coins_map = sorted(investable_coins_map.items(), reverse=True, key=lambda item: item[1]) # 현재가와 1차 저항선 간 차이가 가장 작은 코인 best_coin = list(coins_map[0])[0] # 현재가와 1차 저항선 간 차이 coin_dynamic_rate = list(coins_map[0])[1] slack_message = f"best_coin ::: {best_coin} / change_rate(현재가 - 1차 저항선) ::: {coin_dynamic_rate}%" print(slack_message) pyupbit.send_message(pyupbit.get_slack_channel(), slack_message) return best_coin else: slack_message = f':meow_code: 살만한 코인이 없습니다.. 10분 후 다시 초기화 작업 시작합니다..' print(slack_message) time.sleep(600) pyupbit.send_message(pyupbit.get_slack_channel(), slack_message) return recursive_get_investable_coin_map(prev_coins_map)
def working(market='', my_investment={}, prev_profit_rate=100, score=0, has_minus_exp=False): # 해당 코인의 현재 상태(분 캔들) 조회 coin_candle = pyupbit.view_candle_min(market) # 내가 매수 한 코인 단가 buy_unit_price = pyupbit.get_my_coin_unit_price(my_investment) # 내 계좌에 남은 현금 #krw_balance = pyupbit.get_my_krw_balance(my_investment) # 내 계좌에 남은 코인 수 #my_coin_balance = pyupbit.get_my_coin_total_amount(my_investment) # 현재 코인 단가 current_unit_price = pyupbit.get_current_coin_price(coin_candle) # 수익률(100%가 매수 시점 단가) profit_rate = pyupbit.get_profit_rate(current_unit_price, buy_unit_price) # 스코어(매도시점용) score = calc_profit_score(score, prev_profit_rate, profit_rate) slack_message1 = f"코인명 ::: {market}(현재빡침점수 : {round(score, 2)}), 매수단가 ::: {buy_unit_price}, 현재단가 ::: {current_unit_price}, 수익률 ::: {str(profit_rate)}%" print(slack_message1) if profit_rate < 100: has_minus_exp = True # 수익률 한번이라도 100% 미만인 경우 수익률 기준으로 매도 결정 if has_minus_exp and profit_rate >= 100: pyupbit.sell_all() pyupbit.send_message(pyupbit.get_slack_channel(), f'[구사일생으로 팔았음.-{str(datetime.today())}]' + slack_message1) print('sell!!') else: # 매수할 만 하고 코인 단가가 내가 샀을때 보다 살짝 떨어져 있을 때 추가 매수 -> 일단 막기!! # if target_price >= current_unit_price and 99 >= profit_rate >= 97: # if krw_balance >= 10000: # 추가 매수 기능 막음 # available_coin_amount = pyupbit.get_possible_order_volume(coin_candle, 10000) # pyupbit.order_10000(market, available_coin_amount, 'bid') # pyupbit.send_message('#myinvestment', f'[Buying!!-{str(datetime.today())}]' + slack_message1) # print('buy!!') # 매도 매수 시점 판단 빡침 스코어 기준으로 변경! if score > 5: pyupbit.sell_all() pyupbit.send_message(pyupbit.get_slack_channel(), f'[빡쳐서 팔았음!!-{str(datetime.today())}]' + slack_message1) print('sell!!') # 수익률이 너무 떨어질 것 같을때 매도 elif profit_rate < 99: pyupbit.sell_all() pyupbit.send_message(pyupbit.get_slack_channel(), f'[하락해서 팔았음... -{str(datetime.today())}]' + slack_message1) print('sell...') # 그 외 상태일 경우 else: print('thinking...') # 수익률, 스코어 반환 return [profit_rate, score, has_minus_exp]
def new_calc_profit_score(happy_score=0, prev_profit_rate=0, current_profit_rate=0): # 플러스 변동폭 plus_change_rate = current_profit_rate - prev_profit_rate # 스코어 계산 하기! # 수익률 100% 이상 if current_profit_rate >= 100 and prev_profit_rate >= 100: # 상승중! if plus_change_rate >= 0: happy_score = happy_score + plus_change_rate / 2 # 하락중! (안돼!!) else: happy_score = happy_score + plus_change_rate # 수익률 100% 미만 else: happy_score = 0 slack_message = f':meow_code: 현재 스코어는 ::: {round(happy_score, 2)} / 변동폭은 ::: {round(plus_change_rate, 2)}% / 직전 수익률은 ::: {prev_profit_rate}% / 현재 수익률은 ::: {current_profit_rate}%' print(slack_message) if current_profit_rate > 100: pyupbit.send_message(pyupbit.get_slack_channel(), slack_message) if happy_score < 0: happy_score = 0 return happy_score
def sell_all(): # config.json 자동 매도 기능 허용 여부 확인 if pyupbit.get_auto_sell() == 'YES': myinfo_map = pyupbit.get_my_coin_info() if myinfo_map is not None: # 코인명 market = pyupbit.get_my_coin_name(myinfo_map) # 내가 구매 한 코인 수 my_coin_amount = pyupbit.get_my_coin_total_amount(myinfo_map) # 분단위 캔들 coin_info = pyupbit.view_candle_min(market) # 코인의 현재 단가(분단위 캔들로 조회) current_my_coin_price = pyupbit.get_current_coin_price(coin_info) order_price = current_my_coin_price order_volume = my_coin_amount order_type = 'ask' # 전량 매도! order_coin(market_name=market, order_money=order_price, order_volume=order_volume, type=order_type) else: pyupbit.send_message( pyupbit.get_slack_channel(), '자동 매도 기능을 허용하지 않았습니다. \ninvest_helper에게 요청 하세요.')
def init_prepairing(investable_coins_map, all_market_codes, all_market_names, order_money): # 이전 투자 시 코인 별 전날 대비 상승률 prev_coins_map = pyupbit.get_prev_dict(investable_coins_map, all_market_codes, all_market_names) # 투자할 만한 코인 목록 가져오기 investable_coins_map = get_investable_coin_map(all_market_codes, all_market_names) slack_message = f""" 현재코인들 수익률 ::: {investable_coins_map} 이전코인들 수익률 ::: {prev_coins_map} """ pyupbit.send_message(pyupbit.get_slack_channel(), slack_message) # 투자 할 코인 1개 가져오기 best_coin = get_best_coin_name(investable_coins_map, prev_coins_map) # 매수 init(best_coin, order_money)
def get_rocketboosting_coins(candle_data, market_name): d = candle_data # 코인 코드 market = pyupbit.get_market(d) # 목표 코인 단가( 오늘 시작가 + (어제 고가 - 어제 저가) * 0.5 ) target_price = pyupbit.get_target_price_to_buy(market) # 코인 현재 단가 current_price = pyupbit.get_current_coin_price(d) # 전날 대비 변동 률 change_rate = pyupbit.get_change_rate(d) coin_info = pyupbit.get_coin_info_with_candle(d, market_name) # 현재 코인 단가가 목표가 보다 높고 단가가 1원 이상인 코인만 필터 if current_price >= target_price and pyupbit.get_today_opening_price(d) > 1: print(f'대상 : {coin_info}') pyupbit.send_message(pyupbit.get_slack_channel(), coin_info) return {market: change_rate} else: #print(f'비대상 ::: {coin_info}') return None
def calc_profit_score(rage_score=0, prev_profit_rate=0, current_profit_rate=0): """ 매도 할 타이밍은 스코어가 5점 이상인 경우로 한다. 1. 절대 수익률이 100% 보다 높은 경우 - 직전 수익률 보다 떨어졌을 때(+) rage_score = rage_score + minus_change_rate * 2 - 직전 수익률 보다 올라갔을 때(-) rage_score = rage_score + minus_change_rate / 2 2. 절대 수익률이 100% 보다 낮은 경우는 그냥 97% 미만일 때 매도 처리(빡침 스코어는 계산) - 직전 수익률 보다 떨어졌을 때(+) rage_score = rage_score + minus_change_rate * 2 - 직전 수익률 보다 올라갔을 때(-) rage_score = rage_score + minus_change_rate * 1.5 3. 빡침 스코어가 마이너스인 경우 0으로 처리 """ # 마이너스 변동폭(마이너스 / 플러스 반대) minus_change_rate = prev_profit_rate - current_profit_rate # 빡침 스코어 계산 하기! # 수익률 100% 이상 if current_profit_rate >= 100: # 하락중... (그냥 팔까...) if minus_change_rate >= 0: rage_score = rage_score + minus_change_rate * 3 # 상승중! (가즈아!!) else: rage_score = rage_score + minus_change_rate / 2 # 수익률 100% 미만 else: # 하락중... (아..) if minus_change_rate >= 0: rage_score = rage_score + minus_change_rate * 2 # 상승중! (제발!!) else: rage_score = rage_score + minus_change_rate * 2 slack_message = f'현재 점수는 ::: {round(rage_score, 2)} / 변동폭은 ::: {round(-minus_change_rate, 2)}% / 직전 수익률은 ::: {prev_profit_rate}% / 현재 수익률은 ::: {current_profit_rate}%' print(slack_message) if rage_score >= 6.5: pyupbit.send_message(pyupbit.get_slack_channel(), slack_message) elif rage_score < 0: rage_score = 0 return rage_score
def start_investment_process(slack_message, sleep_time): print(f'process stopped... {slack_message}') pyupbit.send_message(pyupbit.get_slack_channel(), slack_message) time.sleep(sleep_time) os.system(f"python {pyupbit.get_script_path()}")
def profit_check_and_order(): # config.json에 있는 투자금액 만큼만 투자 order_money = float(pyupbit.get_my_order_price()) # 한시간마다 투자 재시작 시키기 위한 카운터 counter = 0 # 직전 수익률 prev_profit_rate = 100 # 비교용 수익률 recoding_profit_rate = 100 # 수익률스코어 score = 0 # 마이너스 체험 여부 has_minus_exp = False # 전체 코인 코드 all_market_codes = pyupbit.all_market_names.view_market_codes() # 전체 코인 이름 all_market_names = pyupbit.all_market_names.view_market_names() # 투자 가능한 코인 맵 investable_coins_map = {} # 프로그램 시작 while True: # 처음 시작 / 1일 동안 별 소득 없으면 투자 초기화 동작 if counter % 17280 == 0: # 수익률 먼저 체크(수익률이 100% 이하인지 확인) keep_going = pyupbit.check_my_investment() print('Finding the best coin to invest...(It runs once in a day.)') # 수익률이 100% 초과면 매도 하고 시작 if not keep_going: if pyupbit.get_my_coin_info() is not None: # 전 시간에 투자 한 코인 전량 매도 pyupbit.sell_all() if pyupbit.get_my_coin_info() is None: # 코인 찾아서 매수 pyupbit.init_prepairing(investable_coins_map, all_market_codes, all_market_names, order_money) else: slack_message = ':meow_party: 수익률이 100% 이하라서 매도 없이 초기화 시작함.' print(slack_message) pyupbit.send_message(pyupbit.get_slack_channel(), slack_message) # 스코어 초기화 score = 0 # 매수 한 투자 정보 조회 my_investment = pyupbit.get_my_coin_info() if my_investment is not None: for market in my_investment.keys(): # 코인의 현재 수익률을 확인하면서 매도 여부 판단 -> 자동 매도 처리 함(auto_sell 옵션에 따라 동작 - YES/NO) strategy_report_arr = pyupbit.new_working(market, my_investment, prev_profit_rate, score, has_minus_exp) prev_profit_rate = strategy_report_arr[0] score = strategy_report_arr[1] has_minus_exp = strategy_report_arr[2] # 수익률이 애매할 때 슬랙으로 메시지 보내기(30초에 1회) if prev_profit_rate > 100 and counter % 30 == 0: notice_message = f':quad_parrot: 코인 : {market}, \n수익률 : {prev_profit_rate}%, \n수익률 변동폭 : {round(prev_profit_rate - recoding_profit_rate, 2)}%, \n마이너스 다녀온적? : {has_minus_exp}' print(f'send message! / {notice_message} / {counter}') pyupbit.send_message(pyupbit.get_slack_channel(), notice_message) recoding_profit_rate = prev_profit_rate else: # 내 계좌에 코인이 없으면 다시 주문금액 만큼 매수 pyupbit.init_prepairing(investable_coins_map, all_market_codes, all_market_names, order_money) # 스코어 초기화 score = 0 # 재시작 카운터 초기화(매도 했으니 초기화) counter = 0 counter = counter + 1 # 위의 프로세스는 5초에 1회 동작 time.sleep(5)
def new_working(market, my_investment={}, prev_profit_rate=100, score=0, has_minus_exp=False): # 일 캔들 조회 d = pyupbit.get_candle_data(market) # 내가 매수 한 코인 단가 buy_unit_price = pyupbit.get_my_coin_unit_price(my_investment) # 현재 코인 단가 current_unit_price = pyupbit.get_current_coin_price(d) # 수익률(100%가 매수 시점 단가) profit_rate = pyupbit.get_profit_rate(current_unit_price, buy_unit_price) # 코인 현재 단가 current_price = pyupbit.get_current_coin_price(d) # 오늘 시가 today_open_price = pyupbit.get_today_opening_price(d) # 어제 고가 prev_high_price = pyupbit.get_yesterday_high_price(d) # 어제 저가 prev_low_price = pyupbit.get_yesterday_low_price(d) # 기준선 standard_price = pyupbit.calc_standard_line(prev_high_price, prev_low_price, today_open_price) # 1차 지지선 first_low_price = pyupbit.first_lower_line(standard_price, prev_high_price) # 2차 지지선 second_low_price = pyupbit.second_lower_line(standard_price, prev_high_price, prev_low_price) # 1차 저항선 first_high_price = pyupbit.first_higher_line(standard_price, prev_low_price) # 2차 저항선 second_high_price = pyupbit.second_higher_line(standard_price, prev_high_price, prev_low_price) slack_message1 = f"코인명 ::: {market}(현재 스코어 : {round(score, 2)}), 매수단가 ::: {buy_unit_price}, 현재단가 ::: {current_unit_price}, 수익률 ::: {str(profit_rate)}%" print(slack_message1) # 매도 시점 판단 로직 """ 스코어 기준 판단? -> 원래 로직임 지지선, 저항선 기준 판단 -> 신규 로직 지지선을 넘었다 -> 망함 -> 버티기? 저항선을 넘었다 -> 좋음 -> 스코어 기준으로 계산 하기 """ # 한번이라도 마이너스 수익률이었으면 has_minus_exp 값 변경해 주기 if profit_rate < 100: has_minus_exp = True # 비교 로직 if current_price > first_high_price: # 스코어(매도시점용) score = pyupbit.new_calc_profit_score(score, prev_profit_rate, profit_rate) # 스코어 기준 계산 하기(상승시에만 계산하니까 1로 변경) if score >= 1: pyupbit.sell_all() pyupbit.send_message( pyupbit.get_slack_channel(), f':aaw_yeah: [벌었음!!-1분 뒤 다시 투자 시작 합니다.]' + slack_message1) print('sell!!') time.sleep(60) else: # 버티기 -> 손절 포인트 -10% (테스트) -> 손절 시 1시간 생각할 시간을 가지게 하고 다시 들어가기. if profit_rate <= pyupbit.get_force_cell_percecnt(): pyupbit.sell_all() slack_message1 = f""" ':ahhhhhhhhh: [손절하였습니다...]' {slack_message1} 1시간 뒤 자동투자를 다시 시작 합니다. """ pyupbit.send_message(pyupbit.get_slack_channel(), slack_message1) # 손절 매도 시 1시간 휴식 time.sleep(3600) else: print('thinking...') return [profit_rate, score, has_minus_exp]