From 6dfe72a3d956d30755a630ee482895daeec86aaa Mon Sep 17 00:00:00 2001 From: Redsandy <34872843+Redsandyg@users.noreply.github.com> Date: Mon, 9 May 2022 18:34:01 +0300 Subject: [PATCH] Update CoreTraidMath.py --- Core/CoreTraidMath.py | 276 ++++++++++++++++-------------------------- 1 file changed, 107 insertions(+), 169 deletions(-) diff --git a/Core/CoreTraidMath.py b/Core/CoreTraidMath.py index 6f7c050..523a80e 100644 --- a/Core/CoreTraidMath.py +++ b/Core/CoreTraidMath.py @@ -12,189 +12,127 @@ import statistics import datetime -import matplotlib.dates as mdates -import matplotlib.pyplot as plt - -import mplfinance as mpf - -import plotly -#import plotly.plotly as py -import plotly.graph_objs as go -# these two lines allow your code to show up in a notebook -from plotly.offline import init_notebook_mode, iplot -from plotly.subplots import make_subplots -init_notebook_mode() - -import CoreTraidMath -import plotly.express as px -class agrigateFig(): + +class CoreMath: - def __init__(self,data=[],needDraw=False ,subplot_titles=None): - self.data=data - self.ans=self.getAgrPlt() - if needDraw: - self.subplot_titles=subplot_titles - self.fig=coreDraw(self.ans,True,self.subplot_titles) - - - def getAgrPlt(self): - count=0 - ans=[] - for i in self.data: - count=count+1 - if type(i)==list: - for g in i: - for j in g.figDict: - ans.append(j) - ans[-1]['row']=count - else: - for j in i.figDict: - ans.append(j) - ans[-1]['row']=count - return ans - - -class corePlt(): - def __init__(self, params={ - 'vtype':'', - 'df':pd.DataFrame(), - 'row':1, - 'col':1, - 'name':'' - }): - self.vtype=params['vtype'] - self.df=params['df'] - self.row=params['row'] - self.col=params['col'] - self.name=params['name'] - if 'colorType' in params.keys(): - self.colorType=params['colorType'] - - - - - -class coreDraw(): - def __init__(self, data=[],needShow=False,subplot_titles={}): - self.data=self.getPlts(data) - self.needShow=needShow - self.subplot_titles=subplot_titles + def __init__(self, base_df, params={ + 'dataType':'ohcl', + 'action': None, + 'actionOptions':{} + } + ): + + self.base_df=base_df.reset_index(drop=True) + self.params=params + if self.params['dataType']=='ohcl': + self.col=self.base_df[self.params['actionOptions']['valueType']] + elif self.params['dataType']=='series': + self.col=self.base_df self.ans=self.getAns() - - - - - - - def getBarColorList(self,l,colorType): - if colorType=='diffAbs': - ans=['green'] - for i in range(1,len(l)): - if abs(l[i])>abs(l[i-1]): - ans.append('green') - else: - ans.append('red') - elif colorType=='diff': - ans=['green'] - for i in range(1,len(l)): - if (l[i])>(l[i-1]): - ans.append('green') - else: - ans.append('red') - elif colorType=='normal': - ans=[] - for i in range(len(l)): - ans.append('gray') - return ans - - def getPlts(self, data): - ans=None - - if type(data)==list: - ans=[] - for i in data: - ans.append(corePlt(i)) - else: - ans=[corePlt(data)] - - - - - return ans def getAns(self): + ans=None + + if self.params['action']=='findExt': + ans = self.getExtremumValue() + elif self.params['action']=='findMean': + ans = self.getMeanValue() + elif self.params['action']=='findSTD': + ans=self.getSTD() + + + return ans + + + def getExtremumValue(self): + ans=None ''' - data list - vtype - df - row=1 - col=1 - name + actionOptions: + 'extremumtype': + 'min' + 'max' + 'valueType': + 'open' + 'close' + 'high' + 'low' + ''' + if self.params['actionOptions']['extremumtype']=='max': + ans=max(self.col) + + if self.params['actionOptions']['extremumtype']=='min': + ans=min(self.col) + + + return ans + + + def getMeanValue(self): + ''' + actionOptions: + 'MeanType': + 'MA' + 'SMA' + 'EMA' + 'WMA' + --'SMMA' + 'valueType': + 'open' + 'close' + 'high' + 'low' + 'window' + 'span' + 'weights' + ''' + ans=None + if self.params['actionOptions']['MeanType']=='MA': + ans = self.col.mean() + if self.params['actionOptions']['MeanType']=='SMA': + ans=np.convolve(self.col, np.ones(self.params['actionOptions']['window']), 'valid') / self.params['actionOptions']['window'] + #ans=self.col.rolling(window=self.params['actionOptions']['window']).mean().to_list() + + if self.params['actionOptions']['MeanType']=='EMA': + ans=self.col.ewm(span=self.params['actionOptions']['span'], adjust=False).mean().to_list() + if self.params['actionOptions']['MeanType']=='WMA': + try: + weights=self.params['actionOptions']['weights'] + except KeyError: + weights=np.arange(1,self.params['actionOptions']['window']+1) + ans=self.col.rolling(window=self.params['actionOptions']['window']).apply(lambda x: np.sum(weights*x) / weights.sum(), raw=False).to_list() + + + + return(ans) + + def getSTD(self): + ''' + actionOptions: + window + + ''' ans=None - - - - - maxRow=1 - maxCol=1 - for i in self.data: - if i.row > maxRow: - maxRow =i.row - if i.col > maxCol: - maxCol =i.col - - fig = make_subplots( - rows=maxRow, - cols=maxCol, - shared_xaxes=True, - vertical_spacing=0.1, - shared_yaxes=True, - #horizontal_spacing=0.02, - #column_widths=[] - subplot_titles=self.subplot_titles - ) - - - fig.update_layout(xaxis_rangeslider_visible=False) - fig.update_layout(barmode='relative') - - for i in self.data: - if i.vtype=='Scatter': - fig.add_trace(go.Scatter(x=i.df['date'],y=i.df['value'],name=i.name), row=i.row, col=i.col) - elif i.vtype=='OCHL': - fig.add_trace(go.Candlestick( - x=i.df['date'], - open=i.df['open'], - high=i.df['high'], - low=i.df['low'], - close=i.df['close'], - name=i.name), - row=i.row, col=i.col - ) - elif i.vtype=='Bars': - for j in i.df.keys(): - if j!='date': - try: - colorType=i.colorType - except: - colorType='normal' - colors=self.getBarColorList(i.df[j],colorType) - fig.add_trace(go.Bar(x=i.df['date'], y=i.df[j],name=j,marker_color=colors),row=i.row, col=i.col) - - - - - ans=fig - if self.needShow: - plotly.offline.iplot(fig) + + + try: + window=self.params['actionOptions']['window'] + ans=np.asarray([]) + for i in range(len(self.col)-window+1): + ans=np.append(ans,np.std(self.col[i:i+window], ddof=1)) + + except: + #window = len(self.col) + ans=np.std(self.col, ddof=1) + return ans +