Example #1
0
    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)
Example #2
0
    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)
Example #3
0
 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)
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
    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)
Example #7
0
    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)
Example #8
0
import os
import sys
from bot.telegram_bot import TelegramBot, Config

if __name__ == "__main__":
    # directory = os.path.dirname(__file__)
    directory = os.getcwd()
    chat_id = Config.DEFAULT_CHAT_ID
    if len(sys.argv) > 1:
        file_path = sys.argv[1]
        if len(sys.argv) > 2:
            chat_id = sys.argv[1]
    else:
        print("usage: ")
        print("sendFile <file_path> [chat_id>]")
        sys.exit("No file provided")

    if directory:
        file_path = os.path.join(directory, file_path)

    if not os.path.isfile(file_path):
        sys.exit("File " + file_path + " does not exist")

    myBot = TelegramBot(chat_id)
    myBot.send_file(file_path)
Example #9
0
 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)
Example #10
0
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)
Example #11
0
        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()
Example #12
0
def main():
    args = get_arguments()
    bot = TelegramBot(args.token)
    bot.start_working()
Example #13
0
    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}")