def getCores(isRetry=True): def getDummyCore(spotDict,objs): dummyCore=core('dummy', spotDict) objs.append(dummyCore) return dummyCore ##### def processCore(exch,spotDict,objs,n=None): if SHARED_EXCH_DICT[exch]<1: return getDummyCore(spotDict,objs) else: myCore = core(exch, spotDict, n=n) objs.append(myCore) return myCore ##### ftx=cl.ftxCCXTInit() ccyList = list(CR_QUOTE_CCY_DICT.keys()) spotDict = dict() spotDict['USD'] = 1 try: for ccy in ccyList: spotDict[ccy]=cl.ftxGetMid(ftx,ccy+'/USD') except: print('[WARNING: FTX get prices failed! ....]') return None, None, None, False ##### objs = [] ftxCore=processCore('ftx',spotDict,objs) bbCore=processCore('bb',spotDict,objs) ##### bbtCores=[] if SHARED_EXCH_DICT['bbt']==0: bbtCores.append(getDummyCore(spotDict,objs)) else: for n in range(SHARED_EXCH_DICT['bbt']): bbtCores.append(processCore('bbt',spotDict,objs,n=n+1)) ##### kuCores=[] if SHARED_EXCH_DICT['ku']==0: kuCores.append(getDummyCore(spotDict,objs)) else: for n in range(SHARED_EXCH_DICT['ku']): kuCores.append(processCore('ku',spotDict,objs,n=n+1)) ##### kutCores=[] if SHARED_EXCH_DICT['kut']==0: kutCores.append(getDummyCore(spotDict,objs)) else: for n in range(SHARED_EXCH_DICT['kut']): kutCores.append(processCore('kut',spotDict,objs,n=n+1)) ##### isOk=True try: cl.parallelRun(objs) except: if not isRetry: return None, None, None, False print('[WARNING: Parallel run failed! Rerunning in serial ....]') isOk=True for obj in objs: try: print('Running '+obj.name+' ....') obj.run() except: pass if not obj.isDone: isOk=False print('[WARNING: Corrupted results for ' + obj.name + '!]') print() coresDict=dict() coresDict['ftx']=ftxCore coresDict['bb']=bbCore coresDict['bbt']=bbtCores coresDict['ku']=kuCores coresDict['kut']=kutCores return coresDict, spotDict, objs, isOk
def ftxInit(self): def cleanBorrows(ccy, df): dummy = pd.DataFrame([[0, 0, 0, 0, 0, 0]], columns=['time', 'coin', 'size', 'rate', 'cost', 'proceeds']) if len(df) == 0: return dummy df2 = df.copy() df2 = df2[df2['coin'] == ccy] if len(df2) == 0: return dummy df2 = df2.set_index('time').sort_index() return df2 ###### def makeFlows(ccy): start_time = cl.getYest() borrows = cleanBorrows(ccy, pd.DataFrame(self.api.private_get_spot_margin_borrow_history({'limit': 1000, 'start_time': start_time})['result'])) loans = cleanBorrows(ccy, pd.DataFrame(self.api.private_get_spot_margin_lending_history({'limit': 1000, 'start_time': start_time})['result'])) cl.dfSetFloat(borrows, ['cost','rate']) cl.dfSetFloat(loans, 'proceeds') prevBorrow = borrows.iloc[-1]['cost'] if borrows.index[-1] == self.payments.index[-1] else 0 prevLoan = loans.iloc[-1]['proceeds'] if loans.index[-1] == self.payments.index[-1] else 0 absBalUSD = abs(self.wallet.loc[ccy, 'total']*self.spotDict[ccy]) d=dict() d['oneDayFlows'] = (loans['proceeds'].sum() - borrows['cost'].sum()) * self.spotDict[ccy] d['oneDayFlowsAnnRet'] = d['oneDayFlows'] * 365 / absBalUSD d['oneDayBorrowRate'] = borrows['rate'].mean() * 24 * 365 d['prevFlows']=(prevLoan - prevBorrow) * self.spotDict[ccy] d['prevFlowsAnnRet']=d['prevFlows'] * 24 * 365 / absBalUSD d['prevBorrowRate'] = borrows.iloc[-1]['rate'] * 24 * 365 if borrows.index[-1] == self.payments.index[-1] else 0 return d ###### self.api = cl.ftxCCXTInit() self.wallet = cl.ftxGetWallet(self.api,self.validCcys) ccys=self.validCcys.copy() cl.appendUnique(ccys,'USDT') for ccy in ccys: self.spots.loc[ccy,'SpotDelta'] = self.wallet.loc[ccy,'total'] self.calcSpotDeltaUSD() ###### info = self.api.private_get_account()['result'] futs = pd.DataFrame(info['positions']).set_index('future') cl.dfSetFloat(futs, 'size') for ccy in self.validCcys: ccy2 = ccy + '-PERP' if ccy=='SHIB': ccy2='K'+ccy2 # Special fix for SHIB if ccy2 in futs.index: mult = -1 if futs.loc[ccy2, 'side']=='sell' else 1 if ccy == 'SHIB': mult*=1000 # Special fix for SHIB self.futures.loc[ccy,'FutDelta']=futs.loc[ccy2,'size']*mult self.calcFuturesDeltaUSD() ###### start_time=cl.getYest() pmts = pd.DataFrame() for ccy in self.validCcys: pmts = pmts.append(pd.DataFrame(self.api.private_get_funding_payments({'future':ccy+'-PERP', 'start_time': start_time})['result'])) pmts = pmts.set_index('time').sort_index() cl.dfSetFloat(pmts, 'payment') self.payments = pmts ##### self.oneDayIncome = -self.payments['payment'].sum() self.prevIncome = -self.payments.loc[self.payments.index[-1]]['payment'].sum() self.setAnnRets() ##### flowsCcy=CR_FTX_FLOWS_CCYS.copy() cl.appendUnique(flowsCcy,'USD') cl.appendUnique(flowsCcy,'USDT') for ccy in flowsCcy: d=makeFlows(ccy) self.oneDayFlows += d['oneDayFlows'] if d['oneDayFlows']==0 and d['prevFlows']==0 and not ccy in ['USD','USDT']: self.flowsDict[ccy]=None else: z1 = '$' + str(round(d['oneDayFlows'])) + ' (' + str(round(d['oneDayFlowsAnnRet'] * 100)) + '% p.a.)' z2 = '$' + str(round(d['prevFlows'])) + ' (' + str(round(d['prevFlowsAnnRet'] * 100)) + '% p.a.)' self.flowsDict[ccy]=colored(('FTX 24h/prev ' + ccy + ' flows: ').rjust(37) + z1 + ' / ' + z2, 'blue') if ccy in ['USD','USDT']: # Extra info for USD/USDT zList = [] zList.append('na' if d['oneDayBorrowRate'] == 0 else str(round(d['oneDayBorrowRate'] * 100)) + '%') zList.append('na' if d['prevBorrowRate'] == 0 else str(round(d['prevBorrowRate'] * 100)) + '%') zList.append(str(round(cl.ftxGetEstBorrow(self.api, ccy) * 100)) + '%') self.flowsDict[ccy+'2'] = ('FTX ' + ccy + ' 24h/prev/est: ').rjust(37) + '/'.join(zList) + ' p.a. ($' + str(round(self.wallet.loc[ccy, 'usdValue'] / 1000)) + 'K) ' ##### self.nav = self.wallet['usdValue'].sum() ##### for ccy in self.validCcys: oneDayFunding = 0 prevFunding = 0 estFunding = 0 if CR_CONFIGS_DICT['IS_CALC_PAYMENTS']: df = pd.DataFrame(self.api.public_get_funding_rates({'future': ccy + '-PERP', 'start_time': start_time})['result']).set_index('time').sort_index() cl.dfSetFloat(df, 'rate') oneDayFunding = df['rate'].mean() * 24 * 365 prevFunding = df['rate'][-1] * 24 * 365 ##### if CR_CONFIGS_DICT['IS_CALC_ESTS']: estFunding = cl.ftxGetEstFunding(self.api, ccy) self.makeFundingStr(ccy, oneDayFunding, prevFunding, estFunding) ##### self.makeIncomesStr() ##### self.mf = float(info['marginFraction']) self.mmReq = float(info['maintenanceMarginRequirement']) self.freeCollateral = float(info['freeCollateral']) totalPositionNotional = self.nav / self.mf cushion = (self.mf - self.mmReq) * totalPositionNotional delta = self.wallet.loc[self.validCcys, 'usdValue'].sum() + self.futures['FutDeltaUSD'].sum() self.makeLiqStr(cushion=cushion,delta=delta) ##### self.isDone=True