def _take_profit(self, target_candle, take_profit_rsi, take_profit_percentage, volume=1): if not self.is_open_position: return if self._is_satisfy_take_profit_percentage_condition(target_candle=target_candle, take_profit_percentage=take_profit_percentage): self._sell(target_candle, volume=volume) message = f"== 포지션 청산 == \n" \ f"진입 시점: {target_candle.date_time} \n" \ f"수익률: {self._get_profit_percentage(target_candle)} \n" \ f"청산 발동 조건: 목표 익절 퍼센티지에 도달 \n" \ f"청산 시 코인 가격: {target_candle.close_price} \n" \ f"현재 KRW 잔액: {self.krw_balance}" TelegramBot.send_message(chat_id=telegram_chat_id, message=message) current_rsi = RsiCalculator.get_latest_candle_rsi(market_code=self.market_code, target_candle_minute=self.target_minute, target_date_time=target_candle.date_time) if self._is_satisfy_take_profit_rsi_condition(current_rsi=current_rsi, take_profit_rsi=take_profit_rsi): self._sell(target_candle=target_candle, volume=volume) message = f"== 포지션 청산 == \n" \ f"진입 시점: {target_candle.date_time} \n" \ f"수익률: {self._get_profit_percentage(target_candle)} \n" \ f"청산 발동 조건: 익절 RSI 도달 \n" \ f"청산 시 캔들의 RSI: {current_rsi} \n" \ f"청산 시 코인 가격: {target_candle.close_price} \n" \ f"현재 KRW 잔액: {self.krw_balance}" TelegramBot.send_message(chat_id=telegram_chat_id, message=message)
def _trade(cls, market_code, buy_percentage, open_position_rsi, target_candle_minute, access_key, secret_key): target_crypto_latest_rsi = cls._get_latest_candle_rsi(market_code=market_code, target_candle_minute=target_candle_minute) # 현재 해당 코인에 대한 포지션이 존재하지 않고, open_position_rsi 조건에 만족한다면 trade를 진행한다. unit_currency, currency = market_code.split('-') if cls._is_satisfy_open_position_condition(currency=currency, current_rsi=target_crypto_latest_rsi, open_position_rsi=open_position_rsi): message = f'포지션 진입 조건에 만족하였습니다. 시장가 매수를 잰항합니다. market_code: {market_code}, current_rsi: {target_crypto_latest_rsi},' \ f'open_position_rsi: {open_position_rsi}' TelegramBot.send_message(chat_id=telegram_chat_id, message=message) cls._market_price_buy_order(market_code=market_code, buy_percentage=buy_percentage, access_key=access_key, secret_key=secret_key)
def _stop_loss(self, target_candle, stop_loss_percentage, volume=1): if not self.is_open_position: return if self._is_satisfy_stop_loss_percentage_condition(target_candle=target_candle, stop_loss_percentage=stop_loss_percentage): self._sell(target_candle=target_candle, volume=volume) message = f"== 포지션 청산 == \n" \ f"진입 시점: {target_candle.date_time} \n" \ f"손실률: {self._get_loss_percentage(target_candle)} \n" \ f"청산 발동 조건: 손실 퍼센티지에 도달함 \n" \ f"청산 시 코인 가격: {target_candle.close_price} \n" \ f"현재 KRW 잔액: {self.krw_balance}" TelegramBot.send_message(chat_id=telegram_chat_id, message=message)
def _is_need_take_profit(cls, market_code, target_candle_minute, take_profit_percentage, take_profit_rsi, access_key, secret_key): target_crypto_latest_rsi = cls._get_latest_candle_rsi(market_code=market_code, target_candle_minute=target_candle_minute) unit_currency, currency = market_code.split('-') if cls._is_satisfy_take_profit_rsi_condition(currency=currency, current_rsi=target_crypto_latest_rsi, take_profit_rsi=take_profit_rsi): message = f'포지션 익절 RSI 조건에 만족하였습니다. 시장가 매도를 통해 포지션을 정리합니다. market_ode: {market_code}, current_rsi: {target_crypto_latest_rsi}, ' \ f'take_profit_rsi: {take_profit_rsi}' TelegramBot.send_message(chat_id=telegram_chat_id, message=message) cls._market_price_sell_order(market_code=market_code, access_key=access_key, secret_key=secret_key) if cls._is_satisfy_take_profit_percentage_condition(market_code=market_code, take_profit_percentage=take_profit_percentage): message = f'포지션 익절 percentage 조건에 만족하였습니다. 시장가 매도를 통해 포지션을 정리합니다. market_code: {market_code}, take_profit_percentage: {take_profit_percentage}' TelegramBot.send_message(chat_id=telegram_chat_id, message=message) cls._market_price_sell_order(market_code=market_code, access_key=access_key, secret_key=secret_key)
def _market_price_sell_order(cls, market_code, access_key, secret_key): unit_currency, currency = market_code.split('-') volume = cls._get_current_currency_balance(currency=currency) res = OrderManager.send_order(market_code=market_code, side='ask', volume=volume, ord_type='market', access_key=access_key, secret_key=secret_key) if res.ok: avg_price = cls._get_current_currency_avg_price(currency) cls._increase_account_balance(currency='KRW', balance=avg_price*volume) cls._decrease_account_balance(currency=currency, balance=volume) message = f'marketCode: {market_code}, volume: {volume}, average_price: {avg_price}, volume: {volume} 시장가 매도가 완료되었습니다.' TelegramBot.send_message(chat_id=telegram_chat_id, message=message) else: message = f'marketCode: {market_code}, volume: {volume} 시장가 매도에 실패하였습니다. status_code: {res.status_code}' TelegramBot.send_message(chat_id=telegram_chat_id, message=message)
def _market_price_buy_order(cls, market_code, buy_percentage, access_key, secret_key): price = cls._calculate_market_buy_order_price(krw_balance=cls.account['KRW']['balance'], buy_percentage=buy_percentage) res = OrderManager.send_order(market_code=market_code, side='bid', price=price, ord_type='price', access_key=access_key, secret_key=secret_key) unit_currency, currency = market_code.split('-') if res.ok: cls._decrease_account_balance(currency='KRW', balance=price) cls._increase_account_balance(currency=currency, balance=cls._calculate_market_buy_order_volume(price, market_code)) message = f'marketCode: {market_code}, price: {price} 시장가 매수가 완료되었습니다.' TelegramBot.send_message(chat_id=telegram_chat_id, message=message) else: message = f'marketCode: {market_code}, price: {price} 시장가 매수에 실패하였습니다. status_code: {res.status_code}' TelegramBot.send_message(chat_id=telegram_chat_id, message=message)
def _trade(self, target_candle, open_position_rsi): if self.is_open_position: return current_rsi = RsiCalculator.get_latest_candle_rsi(market_code=self.market_code, target_candle_minute=self.target_minute, target_date_time=target_candle.date_time) if self._is_satisfy_open_position_condition(current_rsi=current_rsi, open_position_rsi=open_position_rsi): buy_volume = self._get_volume(target_candle=target_candle) self._buy(target_candle=target_candle, volume=buy_volume) message = f"== 포지션 진입 == \n" \ f"진입 시점: {target_candle.date_time} \n" \ f"진입 시 캔들의 rsi: {current_rsi} \n" \ f"진입 시 코인 가격: {target_candle.close_price} \n" \ f"구매한 코인 개수: {buy_volume} \n" \ f"현재 KRW 잔액: {self.krw_balance} \n" \ f"코인 잔액: {self.currency_balance}" TelegramBot.send_message(chat_id=telegram_chat_id, message=message)
def _is_need_stop_loss(cls, market_code, stop_loss_percentage, access_key, secret_key): if cls._is_satisfy_stop_loss_percentage_condition(market_code=market_code, stop_loss_percentage=stop_loss_percentage): message = f'포지션 stop loss percentage 조건에 만족하였습니다. 시장가 매도를 통해 포지션을 정리합니다.' TelegramBot.send_message(chat_id=telegram_chat_id, message=message) cls._market_price_sell_order(market_code=market_code, access_key=access_key, secret_key=secret_key)
from bot.telegram_bot import TelegramBot if __name__ == "__main__": import sys bot = TelegramBot() if len(sys.argv) > 1: msg = "" for m in sys.argv[1:]: msg += "{} ".format(m) bot.send_message(msg)
testJsonFile = sys.argv[1] if not os.path.isfile(testJsonFile): # if file doesn't exist, assume it's chat id child_id = testJsonFile if len(sys.argv) > 2: chat_id = sys.argv[2] url_json_file_path = os.path.join(UrlNotifier.root_dir, url_json_filename) with open(url_json_file_path) as data_file: json_url_data = json.load(data_file) jUrls = json_url_data["URLs"] notifiers = [] for jUrl in jUrls: notifiers.append(UrlNotifier(jUrl)) for notifier in notifiers: # notifier.sing() tg_msg = notifier.get_notification_message() if tg_msg: print("Will send Telegram Message: {}".format(tg_msg)) myBot = TelegramBot(chat_id) myBot.send_message(tg_msg) else: print("Nothing new on page: {}".format(notifier.name)) print("=====================") print()
mongoengine.connect(host='mongodb://localhost:27017/trading?connect=false') market_code_param = "KRW-BTC" target_minute_param = "240" start_date_param = "201810010000" # 2019년년 1월 04일 17시 00분 end_date_param = "202010282100" # 2020년 10월 28일 21시 00분 initial_balance_param = 1000000 open_position_rsi_param = 20 take_profit_percentage_param = 100 take_profit_rsi_param = 100 stop_loss_percentage_param = 90 back_tester = BackTester(initial_balance=initial_balance_param, market_code=market_code_param, target_minute=target_minute_param, start_date=start_date_param, end_date=end_date_param) message = f"== 백테스팅을 시작합니다 ==\n\n" \ f"코인 종류: {market_code_param} \n" \ f"시작 KRW 잔액: {initial_balance_param} \n" \ f"대상 캔들 분봉: {target_minute_param} \n" \ f"백테스팅 시작 기간: {start_date_param} \n" \ f"백테스팅 종료 기간: {end_date_param} \n" \ TelegramBot.send_message(chat_id=telegram_chat_id, message=message) back_tester.run(open_position_rsi=open_position_rsi_param, take_profit_rsi=take_profit_rsi_param, take_profit_percentage=take_profit_percentage_param, stop_loss_percentage=stop_loss_percentage_param) print(f"매매 종료 후 금액: {back_tester.krw_balance}")