示例#1
0
class Run(
        QMainWindow, ):
    def __init__(self):

        super(Run, self).__init__()
        uic.loadUi('Auto-trading.ui', self)
        self.machine = UpbitMachine()
        self.setWindowTitle("Auto-trading")
        self.trader = None
        self.Start_Button.clicked.connect(self.on_Start_clicked)
        if (self.Combo_Box_minute.currentText() == " "):
            self.Start_Button.setEnabled(False)
        self.Stop_Button.clicked.connect(self.on_Stop_clicked)
        self.Setting.clicked.connect(self.Set_minute)
        self.Predict_value_cal.clicked.connect(self.get_Item)
        self.Assets.setText(str(int(self.machine.get_All_balance())))
        self.free_balance = self.machine.get_free_balance()
        self.first_balance = self.machine.get_free_balance()
        self.parent_conn, self.child_conn = Pipe()
        self.term = 10
        self.Hope_coin_list = None
        self.pusher = PushSlack()

    @pyqtSlot()
    def on_Start_clicked(self):

        self.Start_Button.setEnabled(False)
        self.trader = threading.Thread(target=self.roof,
                                       args=(self.Coin_Collections, ))
        self.trader.start()
        self.Log_Text.appendPlainText("시작")

    @pyqtSlot()
    def on_Stop_clicked(self):

        self.trader.join(timeout=5)
        self.Start_Button.setEnabled(True)

    @pyqtSlot()
    def Set_minute(self):
        self.Start_Button.setEnabled(True)
        item = self.Combo_Box_minute.currentText()
        item = item.split(" ")
        self.term = item[0]

    @pyqtSlot()
    def get_Item(self):
        item = self.Combo_Box.currentText()
        item = item.split("-")
        item = "KRW-" + item[0]
        self.Log_Text.appendPlainText("잠시만 기다려 주세요.")
        self.Log_Text.appendPlainText("예측까지 5초정도 걸립니다")
        self.Predict_Value_Label.setText(
            str(
                int(
                    tensorflow_algorithm_keras(currency_type=item,
                                               view=1,
                                               term=self.term))))
        self.Now_Value_Label.setText(
            str(int(self.machine.get_now_price(currency_type=item))))

    @pyqtSlot()
    def roof(self, Coin_Collections):
        self.pusher.send_message("#general", "가상화폐 자동매매 프로그램이 실행되었습니다")
        while (1):
            self.free_balance = self.machine.get_free_balance()
            self.Assets.setText(str(int(self.machine.get_All_balance())))
            print(self.free_balance, self.first_balance)
            self.Profit.setText(
                str(100 -
                    (float(self.free_balance) / float(self.first_balance)) *
                    100) + "%")
            self.Hope_coin_list = StepTrade().get_hopeful_coin()  # 종목선정
            # Coin_Collections.clear()
            self.Coin_Collections.appendPlainText(str(datetime.now()))
            for info in self.Hope_coin_list:
                Coin_Collections.appendPlainText(info)
            StepTrade().run(term=self.term,
                            Log_Text=self.Log_Text,
                            Hope_coin_list=self.Hope_coin_list,
                            free_balance=self.free_balance)
            time.sleep(60 * self.term)
示例#2
0
文件: Run.py 项目: too489/Project
class Run(
        QMainWindow, ):
    def __init__(self):

        super(Run, self).__init__()
        uic.loadUi('Auto-trading.ui', self)
        self.machine = UpbitMachine()
        self.setWindowTitle("Auto-trading")
        self.trader = None
        self.Start_Button.clicked.connect(self.on_Start_clicked)
        if (self.Combo_Box_minute.currentText() == " "):
            self.Start_Button.setEnabled(False)
        self.Stop_Button.clicked.connect(self.on_Stop_clicked)
        self.Refresh.clicked.connect(self.load_info)
        self.Setting.clicked.connect(self.Set_minute)
        self.Predict_value_cal.clicked.connect(self.get_Item)
        self.Assets.setText(str(int(self.machine.get_All_balance())))
        self.q = Queue()
        self.ql = Queue()
        self.ass = self.machine.get_All_balance()
        self.first_balance = self.machine.get_All_balance()
        self.term = 10
        self.Hope_coin_list = None
        self.pusher = PushSlack()
        self.setinel = 1

    @pyqtSlot()
    def on_Start_clicked(self):
        self.Assets.setText(str(int(self.machine.get_All_balance())))
        self.Profit.setText(
            str(100 - (float(self.ass) / float(self.first_balance)) * 100) +
            "%")
        self.Start_Button.setEnabled(False)
        self.trader = multiprocessing.Process(target=StepTrade().run,
                                              args=(
                                                  self.term,
                                                  self.q,
                                                  self.ql,
                                              ))
        self.trader.start()
        self.Log_Text.appendPlainText("자동매매 프로그램이 실행되었습니다")

    @pyqtSlot()
    def on_Stop_clicked(self):
        self.trader.terminate()
        self.trader.join()
        self.Start_Button.setEnabled(True)

    @pyqtSlot()
    def Set_minute(self):
        self.Start_Button.setEnabled(True)
        item = self.Combo_Box_minute.currentText()
        item = item.split(" ")
        self.term = item[0]

    @pyqtSlot()
    def get_Item(self):
        self.Log_Text.appendPlainText("잠시만 기다려 주세요.")
        self.Log_Text.appendPlainText("예측까지 5초정도 걸립니다")
        item = self.Combo_Box.currentText()
        item = item.split("-")
        item = "KRW-" + item[0]
        self.Predict_Value_Label.setText(
            str(
                float(
                    tensorflow_algorithm_keras(currency_type=item,
                                               view=1,
                                               term=self.term))))
        self.Now_Value_Label.setText(
            str(int(self.machine.get_now_price(currency_type=item))))

    # @pyqtSlot()
    # def check(self,):
    #     while(1):
    #         self.free_balance = self.machine.get_free_balance()
    #         self.Assets.setText(str(int(self.machine.get_All_balance())))
    #         self.Profit.setText(str(100-(float(self.free_balance)/float(self.first_balance))*100)+"%")
    #         self.Hope_coin_list = StepTrade().get_hopeful_coin()  # 종목선정
    #         self.Coin_Collections.appendPlainText(str(datetime.now()))
    #         for info in self.Hope_coin_list:
    #             self.Coin_Collections.appendPlainText(info)
    #         time.sleep(60*self.term)
    @pyqtSlot()
    def load_info(self):
        self.ass = self.machine.get_All_balance()
        self.Assets.setText(str(int(self.ass)))
        self.Profit.setText(
            str(100 - round(
                (float(self.ass) / float(self.first_balance)), 2) * 100) + "%")
        self.Coin_Collections.appendPlainText(str(datetime.now()))

        if self.q.empty():
            pass
        else:
            for data in self.q.get():
                self.Log_Text.appendPlainText(data)
        if self.ql.empty():
            self.Hope_coin_list = StepTrade().get_hopeful_coin(
                term=self.term, ql=self.ql)  # 종목선정
            for info in self.Hope_coin_list:
                self.Coin_Collections.appendPlainText(info)
        else:
            for data1 in self.ql.get():
                self.Coin_Collections.appendPlainText(data1)
示例#3
0
class StepTrade(Strategy):
    def __init__(self, ):
        self.pusher = PushSlack()
        self.db_handler = MongoDBHandler(db_name="trader",
                                         collection_name="trade_status")
        self.machine = UpbitMachine()
        self.currency_type = self.machine.currency_type
        self.compare_disparity = None
        self.now_price = None
        self.order_balance = 20000  #float(self.machine.get_free_balance()) / 4# 총보유현금 4등분
        self.free_balance = self.machine.get_free_balance()
        self.term = 5
        self.Log_Text = None

        logger.info(self.currency_type)

    def run(self,
            term=10,
            Log_Text=None,
            Hope_coin_list=None,
            free_balance=None):
        if Hope_coin_list is None and Log_Text is None:
            raise Exception("I need Hope_coin_list and Conn")
        self.Log_Text = Log_Text
        self.term = term
        self.free_balance = free_balance
        self.check_my_order()
        buy_processes = [
            multiprocessing.Process(target=self.buy_trading_logic,
                                    args=(arg, )) for arg in Hope_coin_list
        ]
        sell_processes = [
            multiprocessing.Process(target=self.sell_trading_logic,
                                    args=(arg, ))
            for arg in self.machine.get_coin_list()
        ]
        for p1 in buy_processes[:4]:
            p1.start()
        for p in buy_processes[:4]:
            p.join()
        time.sleep(60)
        for p2 in buy_processes[4:]:
            p2.start()
        for p2 in buy_processes[4:]:
            p2.join()
        for p3 in sell_processes:
            p3.start()
        for p33 in sell_processes:
            p3.join()
        time.sleep(1)
        time.sleep(int(self.term) * 60)

    def check_my_order(self):
        assets = int(
            self.my_all_assets(machine=self.machine,
                               db_handler=self.db_handler))
        self.check_ordered_state()
        self.pusher.send_message(
            "#general",
            str(datetime.now()) + " 현재 자산 :" + str(assets) + "원 입니다")
        self.Log_Text.appendPlainText(
            str(datetime.now()) + " 현재 자산 :" + str(assets) + "원 입니다")
        self.pusher.send_message(
            "#general", "그 중 거래 가능 현금 :" + str(self.free_balance) + "원 입니다")
        self.Log_Text.appendPlainText("그 중 거래 가능 현금 :" +
                                      str(self.free_balance) + "원 입니다")
        #self.check_completed()
        self.check_keep_ordered()

    def check_ordered_state(self):
        DB_order_list = self.db_handler.find_items(
            {"state": "wait"},
            db_name="trader",
            collection_name="trade_status")
        # print(DB_order_list)
        for list in DB_order_list:
            # print(list["uuid"])
            item = self.machine.get_my_order_status(
                uuid=list["uuid"]
            )  # 구매 리스트를 불러옴 단 딱히 market을 지정하지 않음 전부다 조회하기 위해서 !!!나중에 페이지를 넓히던 방법 강구해야됨
            logger.info(item)  #로그파일저장분
            # print(item)
            if (item.get('error')):
                pass
            else:
                # print("여기출력!!!!!!!!!!")
                # print(item['uuid'])
                if item["state"] == "done":  #만약 디비에 wait되어 있던 게 완료되었으면 디비로 저장
                    order_result_dict = item
                    real_amount = float(
                        order_result_dict["executed_volume"])  #거래량
                    real_value = float(
                        order_result_dict["avg_price"])  #평균 구매가격
                    created_at = float(order_result_dict["created_at"] /
                                       1000)  #구매시간
                    fee = float(order_result_dict["paid_fee"])  # 수수료비율
                    self.update_trade_status(db_handler=self.db_handler,
                                             item_id={"uuid": item["uuid"]},
                                             value={
                                                 "status": "done",
                                                 "real_amount": real_amount,
                                                 "created_at": created_at,
                                                 "real_value": real_value,
                                                 "real_fee": fee,
                                                 "side": item["side"]
                                             })
                    self.pusher.send_message("#general", "completed:" +
                                             item["side"] + str(item))  #이상없
                    self.Log_Text.appendPlainText("completed:" + item["side"] +
                                                  str(item))  #이상없

                elif item["state"] == "wait":
                    if item["side"] == "bid":  #아직 wait라면
                        if float(item["price"]
                                 ) * 1.05 <= self.machine.get_now_price(
                                     currency_type=item["market"]):  #체크값
                            logger.info("CancelOrder")
                            logger.info(item)
                            try:
                                self.order_cancel_trasaction(
                                    machine=self.machine,
                                    db_handler=self.db_handler,
                                    item=item)
                            except:
                                error = traceback.format_exc()
                                logger.info(error)
                                self.update_trade_status(
                                    db_handler=self.db_handler,
                                    item_id={"uuid": item["uuid"]},
                                    value={"transaction": "failed"})
                                print("구매주문 취소")
                                self.pusher.send_message(
                                    "#general",
                                    "해당 코인의 가격이 더 올라 취소되었습니다. 추격매수 말고 기다려주세요" +
                                    str(item))
                                self.Log_Text.appendPlainText(
                                    "해당 코인의 가격이 더 올라 취소되었습니다. 추격매수 말고 기다려주세요" +
                                    str(item))

                    elif item["side"] == "ask":
                        if (item.get('price')):
                            if float(item["price"]
                                     ) < self.machine.get_now_price(
                                         currency_type=item['market']) * 1.05:
                                self.order_cancel_trasaction(
                                    machine=self.machine,
                                    db_handler=self.db_handler,
                                    item=item)
                                #self.update_trade_status(db_handler=self.db_handler, item_id={"uuid": item["uuid"]}, value={"status": "wait"})
                                print("판매주문 취소")
                                self.pusher.send_message(
                                    "#general",
                                    "해당 코인의 가격이 너무 내려 매도 주문이 취소되었습니다, 손절을 추천드립니다"
                                    + str(item))
                                self.Log_Text.appendPlainText(
                                    "해당 코인의 가격이 너무 내려 매도 주문이 취소되었습니다, 손절을 추천드립니다"
                                    + str(item))
                else:
                    self.update_trade_status(
                        db_handler=self.db_handler,
                        item_id={"uuid": item["uuid"]},
                        value={"status": "CANCEL_ORDERED"})

    def check_completed(self):  #굳이 있을 필요가 있나
        DB_order_list = self.db_handler.find_items(
            {"state": "done"},
            db_name="trader",
            collection_name="trade_status")
        logger.info("ORDER_COMPELETED")
        for item in DB_order_list:
            # print(item)
            logger.info(item)
            try:
                self.order_transaction(machine=self.machine,
                                       db_handler=self.db_handler,
                                       item=item,
                                       side=item["side"])
                self.pusher.send_message(
                    "#general", item["side"] + "ordered : " + str(item))
                self.Log_Text.appendPlainText(item["side"] + "ordered : " +
                                              str(item))
            except:
                error = traceback.format_exc()
                logger.info(error)
                if (item.get('uuid')):
                    self.update_trade_status(db_handler=self.db_handler,
                                             item_id={"uuid": item["uuid"]},
                                             value={"transactions": "failed"})

    def get_hopeful_coin(self):  #평균회귀 평가모델로 뽑아온 coin목록을 db에넣어
        result = MeanReversionModel()
        self.db_handler.set_db_collection("trader", "wish_list")

        for coin in result:
            self.db_handler.insert_item({
                "market": coin,
                "time": datetime.now()
            })
        self.currency_type = result
        return self.currency_type

    def check_keep_ordered(self):  #여기가 손익라인 #5프로 정도로 한다
        has_coin_list = self.machine.get_has_coin_info_list()
        for item in has_coin_list:
            now_price = self.machine.get_now_price(
                currency_type=item["market"])
            #print(item['market'])
            if (item['market'] == "KRW-ETH"):
                pass
            else:
                if float(item["price"]) * 1.05 < now_price and float(
                        item["price"]) * 1.05 > 1000:  #수익라인
                    self.order_transaction(machine=self.machine,
                                           db_handler=self.db_handler,
                                           currency_type=item["market"],
                                           side='ask',
                                           qty=item["balance"],
                                           price=now_price)
                    self.pusher.send_message(
                        "#general", "보유 중인 " + str(item["market"]) +
                        "코인을 수익 매도 하였습니다. info : " + str(item))
                    logger.info("sell order from keeped" + str(item["uuid"]))
                    self.Log_Text.appendPlainText("보유 중인 " +
                                                  str(item["market"]) +
                                                  "코인을 수익 매도 하였습니다. info : " +
                                                  str(item))

                elif float(item["price"]) * 0.95 > now_price and float(
                        item["price"]) * 1.05 > 1000:  #손절라인
                    self.order_transaction(machine=self.machine,
                                           db_handler=self.db_handler,
                                           currency_type=item["market"],
                                           side='ask',
                                           qty=item["balance"],
                                           price=now_price)
                    self.pusher.send_message(
                        "#general", "보유 중인 " + str(item["market"]) +
                        "코인을 손절 매도 하였습니다. info : " + str(item))
                    self.Log_Text.appendPlainText("보유 중인 " +
                                                  str(item["market"]) +
                                                  "코인을 손절 매도 하였습니다. info : " +
                                                  str(item))
                    logger.info(str(item["market"]) + "을 매도 하였습니다 ")

    def set_thread_price(self, currency_type=None):

        coin_type = currency_type
        #for coin_type in currency_type:
        price_info = {}
        price_info['market'] = coin_type
        price_info['pridict_price'] = tensorflow_algorithm_keras(
            term=self.term, count=100, currency_type=coin_type)
        bollingerband = self.machine.get_bollingerband(term=self.term,
                                                       count=20,
                                                       currency_type=coin_type)
        price_info['bolin_high'] = bollingerband['high']
        price_info['bolin_mid'] = bollingerband['mid']
        price_info['bolin_low'] = bollingerband['low']
        price_info['disparity'] = self.machine.get_disparity(
            term=self.term, count=20, currency_type=coin_type)
        price_info['now_price'] = self.machine.get_now_price(
            currency_type=coin_type)
        return (price_info)

        # time.sleep(300)

    def buy_trading_logic(self, currency_type=None):
        if currency_type is None:
            raise Exception("I have to need info")
        print("구매로직 진입")
        print(currency_type)
        term = self.term
        info = self.set_thread_price(currency_type=currency_type)
        wallet = self.free_balance
        if (float(wallet) > self.order_balance):
            count = 0

            if (float(info["pridict_price"]) > float(info['now_price'])):
                count += 1
            if (float(info["disparity"]) < -1):
                disparity = float(info["disparity"])
                count += 1
            if (float(info["bolin_low"]) > float(info['now_price'])):
                count += 1
            if (count >= 2):
                print("구매 검토 중")
                time.sleep(int(term) * 60)
                while (1):
                    if (float(
                            self.machine.get_disparity(
                                currency_type=info["market"], term=self.term))
                            > disparity):
                        wallet = self.free_balance
                        now_price = self.machine.get_now_price(
                            currency_type=info["market"])
                        if float(wallet) >= self.order_balance:
                            volume = (self.order_balance) / float(now_price)
                            self.order_transaction(
                                machine=self.machine,
                                db_handler=self.db_handler,
                                qty=volume * 0.98,
                                currency_type=info["market"],
                                side="bid",
                                price=now_price)
                            time.sleep(int(term) * 60)
                            self.check_ordered_state()
                            self.pusher.send_message(
                                "#general", "현재" + str(info["market"]) +
                                "매수 하였습니다 info : " + str(info))
                            self.Log_Text.appendPlainText("현재" +
                                                          str(info["market"]) +
                                                          "매수 하였습니다 info : " +
                                                          str(info))

                            logger.info("buy transaction")
                        else:
                            print("돈없어서 pass")
                            self.Log_Text.appendPlainText(
                                "보유 중인 금액이 부족하여 구매에 실패하였습니다")
                        break
                    disparity = float(
                        self.machine.get_disparity(
                            currency_type=info["market"], term=self.term))
                    print("매수 시점 기다리는 중")
                    time.sleep(int(term) * 60)
                    self.check_ordered_state()

    def sell_trading_logic(self, currency_type=None):
        if currency_type is None:
            raise Exception("I have to need info")
        print("판매 로직 진입")
        print(currency_type)
        term = self.term
        #info 는 가지고 있는 코인 리스트
        has_coin_info = self.machine.get_has_coin_info()
        print("판매 위해 가지고 있는 코인들 조회")
        evalueation_coin = self.set_thread_price(currency_type=currency_type)
        #print(evalueation_coin)
        count = 0
        if (float(evalueation_coin["pridict_price"]) < float(
                evalueation_coin['now_price'])):
            count += 1
        if (float(evalueation_coin["disparity"]) > 1):
            disparity = float(evalueation_coin["disparity"])
            count += 1
        if (float(evalueation_coin["bolin_high"]) < float(
                evalueation_coin['now_price'])):
            count += 1
        if (count >= 2):
            print("판매 검토중")
            time.sleep(int(term) * 60)
            now_price = self.machine.get_now_price(
                currency_type=evalueation_coin["market"])
            while (1):
                if (float(
                        self.machine.get_disparity(
                            currency_type=evalueation_coin["market"],
                            term=self.term)) < disparity):
                    volume = self.machine.get_coin_valume(
                        evalueation_coin["market"])
                    self.order_transaction(
                        machine=self.machine,
                        db_handler=self.db_handler,
                        qty=float(volume) * 0.98,
                        currency_type=evalueation_coin["market"],
                        side="ask",
                        price=now_price)
                    time.sleep(int(term) * 60)
                    self.check_ordered_state()
                    logger.info("sell transaction")
                    self.pusher.send_message(
                        "#general", "현재" + str(evalueation_coin["market"]) +
                        "매도 하였습니다 info : " + str(evalueation_coin))
                    self.Log_Text.appendPlainText(
                        "현재" + str(evalueation_coin["market"]) +
                        "매도 하였습니다 info : " + str(evalueation_coin))
                    print("판매 완료")
                    break
                disparity = float(
                    self.machine.get_disparity(
                        currency_type=evalueation_coin["market"],
                        term=self.term))
                print("매도 시점 기다리는 중")
                time.sleep(int(term) * 60)
                self.check_ordered_state()

    def stop(self):
        return 0