async def entry(self,
                 market,
                 size,
                 ord_type,
                 side,
                 price="",
                 postOnly=False,
                 reduceOnly=False):
     try:
         self.ftx.place_order(ord_type=ord_type,
                              market=market,
                              side=side,
                              price=price,
                              size=size,
                              postOnly=postOnly,
                              reduceOnly=reduceOnly)
         response = await self.ftx.send()
         if response[0]['success']:
             msg = f"BOT:{BOT_NAME}\nOrdered\n{market}\nSIDE:{side}\nSIZE:{size}"
             self.logger.info(msg)
             push_message(msg)
             return response, True
         else:
             raise Exception(response[0])
     except Exception as e:
         msg = f"BOT:{BOT_NAME}\nERROR: {str(e)}"
         self.logger.error(msg)
         push_message(msg)
         return {}, False
Exemplo n.º 2
0
 def push_message(self, data, msg_type=''):
     """ ボットの基本情報+引数のデータ型に応じたテキストを追加して送信する.
          - `data`がstrなら,そのまま送信
          - `position`なら,sizeとsideを送信
          - `order`ならpriceとtype,sideを送信
     """
     bot_info = f'{self.SUBACCOUNT}:{self.BOT_NAME}\n{self.MARKET}'
     text = self._message(data, msg_type)
     push_message(f'{bot_info}\n{text}')
Exemplo n.º 3
0
 async def run(self):
     while True:
         try:
             await self.main(15)
             await asyncio.sleep(0)
         except Exception as e:
             print('An exception occurred', e)
             push_message(
                 f"ERROR\nBOT:{BOT_NAME}\nSUBACCOUNT:{SUBACCOUNT}")
             exit(1)
 async def run(self):
     while True:
         try:
             await self.main(5)
             await asyncio.sleep(0)
         except KeyError as e:
             push_message("KeyError: {}".format(e))
             self.logger.error('An exception occurred', str(e))
         except Exception as e:
             push_message(str(e))
             self.logger.error('An unhandled exception occurred' + str(e))
             exit(1)
Exemplo n.º 5
0
    async def main(self, interval):
        # main処理
        """
        # account情報を取得
        self.ftx.account()
        response = await self.ftx.send()
        print(response[0])
        """

        self.ftx.positions()
        response = await self.ftx.send()
        # print(json.dumps(response[0], indent=2, sort_keys=False))
        position = {}
        for pos in response[0]["result"]:
            if pos["future"] == MARKET:
                position = pos
        print("position :>>", position)

        await asyncio.sleep(5)

        if position["size"] > float(MAX_SIZE):
            return

        query = "query=from:elonmusk -is:retweet"
        tweet_fields = "tweet.fields=author_id"
        start_time_fields = self.create_time_fields(sec=10)
        queries = [query, tweet_fields, start_time_fields]
        keywords = ['doge', 'Doge', 'DOGE']
        result = recent_research(keywords, queries)

        if len(result) > 0:
            push_message(f"Detect events:\nkeywords:{keywords}\n{result}")
            if PYTHON_ENV == 'production':
                self.ftx.place_order(type='market',
                                     side='buy',
                                     price='',
                                     size=180,
                                     postOnly=False)
            else:
                self.ftx.place_order(type='limit',
                                     side='buy',
                                     price=1111,
                                     size=0.001,
                                     postOnly=True)
            response = await self.ftx.send()
            print(response[0])
            orderId = response[0]['result']['id']
            push_message(f"Ordered :\norderId:{orderId}")
        await asyncio.sleep(interval)
Exemplo n.º 6
0
 async def _entry(self, market, side, price, size, ord_type='limit', postOnly=False):
     if PYTHON_ENV == 'production':
         self.ftx.place_order(
             type=ord_type,
             market=market,
             side=side,
             price=price,
             size=size,
             postOnly=postOnly)
     else:
         self.ftx.place_order(
             type=ord_type,
             market=market,
             side=side,
             price=price,
             size=size,
             postOnly=True)
     response = await self.ftx.send()
     print(response[0])
     msg = f"ENV: {PYTHON_ENV}\nBOT:{BOT_NAME}\nOrdered\nMARKET: {market}\nSIZE: {size}\nSIDE: {side}"
     push_message(msg)
     return response, True
    async def main(self, interval):
        # main処理
        listed = []
        new_listed = []

        self.ftx.market()
        response = await self.ftx.send()
        # print(json.dumps(response[0]['result'], indent=2, sort_keys=False))
        # 引数に与えた条件に当てはまる上場銘柄をリストに抽出する
        listed = self.extract_markets(markets=response[0]['result'],
                                      market_type=["spot", "future"],
                                      future_type='-PERP',
                                      exclude=[
                                          'HEDGE', 'BULL', 'BEAR', 'HALF',
                                          'BVOL', '-0326', "MOVE-"
                                      ])
        VERBOSE and self.logger.debug(listed)

        # 前回の上場銘柄リストがあるならば,現在の上場リストと比較して新規上場銘柄があるか調べる
        if len(self.prev_markets) > 0:
            # 条件に合格した新規上場銘柄を抽出する
            new_listed, _ = self.extract_new_listed(self.prev_markets, listed,
                                                    RANK)
            if len(new_listed) > 0:
                self.logger.info(f'上場銘柄差分:{_}')
                self.logger.info(f'合格した新規上場銘柄:{new_listed}')
            try:
                for new in new_listed:
                    # SNS通知
                    msg = f"New Listing: {new['name']}"
                    self.logger.info(msg)
                    push_message(msg)
                    # トレードを許可しているならば,エントリー
                    if TRADABLE:
                        ord_type = 'market'
                        market = new['name']
                        price = float(new['bid'])
                        key = 'underlying' if new[
                            'type'] == 'future' else 'baseCurrency'
                        usd = self.SPECIFIC_USD_SIZE if str(new[key]).upper(
                        ) in self.SPECIFIC_NAMES else self.DEFAULT_USD_SIZE
                        size = usd / (float(new['bid']) +
                                      float(new['ask'])) / 2
                        if PYTHON_ENV != 'production':
                            price = 1000
                            market = 'ETH-PERP'
                            size = 0.001
                            ord_type = 'limit'
                        responce, _ = await self.entry(market, size, ord_type,
                                                       'buy', price)
                        self.positions.append({
                            'orderTime':
                            time.time(),
                            'market':
                            market,
                            'size':
                            size,
                            'side':
                            'buy',
                            'price':
                            responce[0]['result']['price']
                        })
                        await self.entry(market, size, 'limit', 'sell',
                                         price * 1.08)
            except Exception as e:
                self.logger.error(str(e))
        # ---------共通の処理----------
        # 最新の上場のリストを更新
        self.prev_markets = listed
        listed = []
        self.logger.debug("Snapshot markets...")
        if len(self.positions) > 0:
            self.logger.info("Current positions :>>")
            self.logger.info(self.positions)
            await self.settle(market_type=["future"])
        await asyncio.sleep(interval)