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
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}')
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)
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)
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)