diff --git a/Core/CoreDraw.py b/Core/CoreDraw.py
new file mode 100644
index 0000000..eac5811
--- /dev/null
+++ b/Core/CoreDraw.py
@@ -0,0 +1,199 @@
+
+import pandas as pd
+import datetime
+import numpy as np
+import plotly as pl
+import plotly.graph_objs as go
+import matplotlib.pyplot as plt
+import math
+import scipy
+import random
+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():
+
+ 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):
+ self.data=self.getPlts(data)
+ self.needShow=needShow
+ 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):
+ '''
+ data list
+ vtype
+ df
+ row=1
+ col=1
+ name
+
+
+
+ '''
+
+ 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.02,
+ shared_yaxes=True,
+ horizontal_spacing=0.02,
+ #column_widths=[]
+
+ )
+
+
+ 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))
+
+
+
+
+ ans=fig
+ if self.needShow:
+ plotly.offline.iplot(fig)
+ return ans
diff --git a/Core/CoreTraidMath.py b/Core/CoreTraidMath.py
new file mode 100644
index 0000000..6f7c050
--- /dev/null
+++ b/Core/CoreTraidMath.py
@@ -0,0 +1,200 @@
+
+import pandas as pd
+import datetime
+import numpy as np
+import plotly as pl
+import plotly.graph_objs as go
+import matplotlib.pyplot as plt
+import math
+import scipy
+import random
+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():
+
+ 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
+ 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):
+ '''
+ data list
+ vtype
+ df
+ row=1
+ col=1
+ name
+
+
+
+ '''
+
+ 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)
+ return ans
diff --git a/Core/Ind_ADX.py b/Core/Ind_ADX.py
new file mode 100644
index 0000000..40eb089
--- /dev/null
+++ b/Core/Ind_ADX.py
@@ -0,0 +1,182 @@
+
+import pandas as pd
+import datetime
+import numpy as np
+import plotly as pl
+import plotly.graph_objs as go
+import matplotlib.pyplot as plt
+import math
+import scipy
+import random
+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
+
+
+import CoreTraidMath
+import CoreDraw
+init_notebook_mode()
+
+class ADXI:
+
+ def __init__(self, base_df, options={
+ 'dataType':'ohcl',
+
+ }, needFig=False,showOnlyIndex=True,drawFig=False):
+ self.base_df=base_df.reset_index(drop=True)
+ self.options=options
+ #self.norm_df=self.nornalize()
+ #self.col=col
+ #self.npCol=np.asarray(self.norm_df[self.col], dtype=np.float32)
+ #self.options=options
+ self.ans=self.getAns()
+ if needFig:
+ self.fig=self.pltShow(showOnlyIndex,drawFig)
+
+
+ def getDM(self):
+
+ #m,p=self.getMP()
+ dm_m=np.asarray([])
+ dm_p=np.asarray([])
+ tr=np.asarray([])
+
+
+ for i in range(1,self.base_df.shape[0]):
+ if (self.base_df['open'][i]>=
+ self.base_df['open'][i-1]):
+ dm_p=np.append(dm_p,self.base_df['open'][i]-self.base_df['open'][i-1])
+ else:
+ dm_p=np.append(dm_p,0)
+ if (self.base_df['close'][i]<=self.base_df['close'][i-1]):
+ dm_m=np.append(dm_m,self.base_df['close'][i-1]-self.base_df['close'][i])
+ else:
+ dm_m=np.append(dm_m,0)
+
+ tr=np.append(tr,
+ max(self.base_df['close'][i-1],self.base_df['high'][i])-
+ min(self.base_df['close'][i-1],self.base_df['low'][i]))
+
+
+ setattr(self,'dm_m',dm_m)
+ setattr(self,'dm_p',dm_p)
+ setattr(self,'tr',tr)
+
+ return dm_m,dm_p
+
+ def getEMA(self,Col):
+ ser = pd.Series(Col, copy=False)
+ op={'dataType':'series',
+ 'action':'findMean',
+ 'actionOptions':{'MeanType':'EMA','span':10}
+ }
+ ans=np.asarray(CoreTraidMath.CoreMath(ser,op).ans)
+ #print(ans)
+ #ans = np.asarray(ser.ewm(span=40,adjust=False).mean().to_list())
+ #print(ans)
+ #return(np.asarray(ser.ewm(span=40,adjust=False).mean().to_list()))
+ return ans
+
+ def getDI(self):
+ dm,dp=self.getDM()
+
+ dip=self.getEMA(dp/self.tr)
+ dim=self.getEMA(dm/self.tr)
+
+ return dim,dip
+
+ def getAns(self):
+
+ dim,dip=self.getDI()
+ np.seterr(invalid='ignore')
+ col=abs(np.true_divide((dim-dip),(dim+dip)))
+ setattr(self,'col',col)
+
+ adx=self.getEMA(col)
+
+ ans={
+ 'DIM':dim*100,
+ 'DIP':dip*100,
+ 'ADX':adx*100
+ }
+
+
+
+ return ans
+
+ def pltShow(self,showOnlyIndex,drawFig):
+ ans=None
+ req=[]
+
+ row=1
+ if not showOnlyIndex:
+
+ row=2
+ req.append({
+ 'vtype':'OCHL',
+ 'df':self.base_df,
+ 'row':1,
+ 'col':1,
+ 'name':'OHCL'
+
+ })
+
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['ADX'],'date':self.base_df['date'].to_list()[1:]}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'SenkouSpanB'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['DIP'],'date':self.base_df['date'].to_list()[1:]}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'+DI'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['DIM'],'date':self.base_df['date'].to_list()[1:]}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'-DI'
+
+ })
+
+ self.figDict=req
+
+
+
+ ans = CoreDraw.coreDraw(req,drawFig)
+
+
+ return ans
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Core/Ind_Alligator.py b/Core/Ind_Alligator.py
new file mode 100644
index 0000000..c3e9cf1
--- /dev/null
+++ b/Core/Ind_Alligator.py
@@ -0,0 +1,114 @@
+import pandas as pd
+import datetime
+import numpy as np
+import plotly as pl
+import plotly.graph_objs as go
+import matplotlib.pyplot as plt
+import math
+import scipy
+import random
+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 CoreDraw
+
+
+class Alligator:
+
+ def __init__(self, base_df,options={}, needFig=False,showOnlyIndex=True,drawFig=False):
+ self.base_df=base_df.reset_index(drop=True)
+ self.options=options
+ self.ans=self.getAns()
+ if needFig:
+ self.fig=self.pltShow(showOnlyIndex,drawFig)
+
+
+ def getMA(self,keyAns):
+ ans=None
+ op={'dataType':'ohcl',
+ 'action':'findMean',
+ 'actionOptions':{'MeanType':self.options[keyAns]['MeanType'],
+ 'valueType':self.options['valueType'],
+ 'window':self.options[keyAns]['window']}
+ }
+ ans=CoreTraidMath.CoreMath(self.base_df,op).ans
+
+ return ans
+
+ def getAns(self):
+ ans={'Jaw':{},
+ 'Teeth':{},
+ 'Lips':{}
+ }
+
+
+ for i in ans.keys():
+ ma=self.getMA(i)
+ ans[i]['y']=ma[:len(ma)-self.options[i]['shift']]
+ ans[i]['x']=self.base_df['date'][self.options[i]['window']+self.options[i]['shift']-1:]
+
+
+ return ans
+
+
+ def pltShow(self,showOnlyIndex,drawFig):
+ ans=None
+ req=[]
+ row=1
+ if not showOnlyIndex:
+
+ #row=2
+ req.append({
+ 'vtype':'OCHL',
+ 'df':self.base_df,
+ 'row':1,
+ 'col':1,
+ 'name':'OHCL'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['Jaw']['y'],'date':self.ans['Jaw']['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'Jaw'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['Teeth']['y'],'date':self.ans['Teeth']['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'Teeth'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['Lips']['y'],'date':self.ans['Lips']['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'Lips'
+
+ })
+
+ self.figDict=req
+ ans = CoreDraw.coreDraw(req,drawFig)
+ return ans
\ No newline at end of file
diff --git a/Core/Ind_DonchianChannel.py b/Core/Ind_DonchianChannel.py
new file mode 100644
index 0000000..7a6748b
--- /dev/null
+++ b/Core/Ind_DonchianChannel.py
@@ -0,0 +1,108 @@
+import pandas as pd
+import datetime
+import numpy as np
+import plotly as pl
+import plotly.graph_objs as go
+import matplotlib.pyplot as plt
+import math
+import scipy
+import random
+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 CoreDraw
+
+
+
+class IDC:
+
+ def __init__(self, base_df,options={}, needFig=False,showOnlyIndex=True,drawFig=False):
+ self.base_df=base_df.reset_index(drop=True)
+ self.options=options
+ self.ans=self.getAns()
+ if needFig:
+ self.fig=self.pltShow(showOnlyIndex,drawFig)
+
+ def getSMA(self,windowSMA):
+ return np.convolve(self.npCol, np.ones(int(windowSMA)), 'valid') / int(windowSMA)
+
+
+
+
+
+ def getAns(self):
+ ans={
+ 'MaxExt':[],
+ 'MinExt':[],
+ 'x':[]
+
+ }
+ opMin={'dataType':'ohcl',
+ 'action':'findExt',
+ 'actionOptions':{'extremumtype':'min','valueType':'low'}
+ }
+ opMax={'dataType':'ohcl',
+ 'action':'findExt',
+ 'actionOptions':{'extremumtype':'max','valueType':'high'}
+ }
+
+ for i in range(self.options['window'],len(self.base_df)-self.options['shift']+1):
+ ans['MaxExt'].append(CoreTraidMath.CoreMath(self.base_df[i-self.options['window']:i],opMax).ans)
+ ans['x'].append(self.base_df['date'][i-1+self.options['shift']])
+ ans['MinExt'].append(CoreTraidMath.CoreMath(self.base_df[i-self.options['window']:i],opMin).ans)
+ return ans
+
+
+ def pltShow(self,showOnlyIndex,drawFig):
+ ans=None
+ req=[]
+ row=1
+ if not showOnlyIndex:
+
+ #row=2
+ req.append({
+ 'vtype':'OCHL',
+ 'df':self.base_df,
+ 'row':1,
+ 'col':1,
+ 'name':'OHCL'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['MaxExt'],'date':self.ans['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'MaxExt'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['MinExt'],'date':self.ans['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'MinExt'
+
+ })
+
+
+ self.figDict=req
+ ans = CoreDraw.coreDraw(req,drawFig)
+ return ans
\ No newline at end of file
diff --git a/Core/Ind_Envelopes.py b/Core/Ind_Envelopes.py
new file mode 100644
index 0000000..6fec035
--- /dev/null
+++ b/Core/Ind_Envelopes.py
@@ -0,0 +1,124 @@
+import pandas as pd
+import datetime
+import numpy as np
+import plotly as pl
+import plotly.graph_objs as go
+import matplotlib.pyplot as plt
+import math
+import scipy
+import random
+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 CoreDraw
+
+class Envelopes:
+
+ def __init__(self, base_df,options={}, needFig=False,showOnlyIndex=True,drawFig=False):
+ self.base_df=base_df.reset_index(drop=True)
+ self.options=options
+ self.ans=self.getAns()
+ if needFig:
+ self.fig=self.pltShow(showOnlyIndex,drawFig)
+
+
+
+ def getAns(self):
+ ans={
+ 'MainEnv':[],
+ 'PlusEnv':[],
+ 'MinusEnv':[],
+ 'x':[]
+ }
+ dictResp={}
+ dictResp['MeanType']=self.options['MeanType']
+ dictResp['valueType']=self.options['valueType']
+
+ try:
+ dictResp['window'] = self.options['window']
+ dictResp['span'] = self.options['window']
+ except:
+ pass
+
+
+
+
+ op={'dataType':'ohcl',
+ 'action':'findMean',
+ 'actionOptions':dictResp
+ }
+ if dictResp['MeanType']=='SMA':
+
+ y=CoreTraidMath.CoreMath(self.base_df,op).ans
+ ans['MainEnv']=y[:len(y)-self.options['shift']]
+ ans['PlusEnv']=ans['MainEnv']*(1+self.options['kProc']/100)
+ ans['MinusEnv']=ans['MainEnv']*(1-self.options['kProc']/100)
+ ans['x']=self.base_df['date'][self.options['window']-1+self.options['shift']:]
+
+
+
+
+
+ return ans
+
+ def pltShow(self,showOnlyIndex,drawFig):
+ ans=None
+ req=[]
+ row=1
+ if not showOnlyIndex:
+
+ #row=2
+ req.append({
+ 'vtype':'OCHL',
+ 'df':self.base_df,
+ 'row':1,
+ 'col':1,
+ 'name':'OHCL'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['MainEnv'],'date':self.ans['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'MainEnv'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['PlusEnv'],'date':self.ans['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'PlusEnv'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['MinusEnv'],'date':self.ans['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'MinusEnv'
+
+ })
+
+ self.figDict=req
+ ans = CoreDraw.coreDraw(req,drawFig)
+ return ans
\ No newline at end of file
diff --git a/Core/Ind_Gator.py b/Core/Ind_Gator.py
new file mode 100644
index 0000000..f831824
--- /dev/null
+++ b/Core/Ind_Gator.py
@@ -0,0 +1,108 @@
+import pandas as pd
+import datetime
+import numpy as np
+import plotly as pl
+import plotly.graph_objs as go
+import matplotlib.pyplot as plt
+import math
+import scipy
+import random
+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 CoreDraw
+import Ind_Alligator
+
+class Gator:
+
+ def __init__(self, base_df,options={}, needFig=False,showOnlyIndex=True,drawFig=False):
+ self.base_df=base_df.reset_index(drop=True)
+ self.options=options
+ self.ans=self.getAns()
+ if needFig:
+ self.fig=self.pltShow(showOnlyIndex,drawFig)
+
+
+ def getAns(self):
+
+ req=Ind_Alligator.Alligator(self.base_df,self.options).ans
+ #self.req=req
+ '''
+ ans={'Jaw-Teeth':{'y':[],'x':[]},
+ 'Teeth-Lips':{'y':[],'x':[]},
+ }
+ JawTeethIter=self.options['Jaw']['window']+self.options['Jaw']['shift']-self.options['Teeth']['window']-self.options['Teeth']['shift']
+ TeethLipsIter=self.options['Teeth']['window']+self.options['Teeth']['shift']-self.options['Lips']['window']-self.options['Lips']['shift']
+
+ #print(TeethLipsIter)
+ for i in range(len(req['Jaw']['y'])):
+ ans['Jaw-Teeth']['y'].append(abs(req['Jaw']['y'][i]-req['Teeth']['y'][JawTeethIter+i]))
+ ans['Jaw-Teeth']['x']=req['Jaw']['x']
+ for i in range(len(req['Teeth']['y'])):
+ ans['Teeth-Lips']['y'].append(-abs(req['Teeth']['y'][i]-req['Lips']['y'][TeethLipsIter+i]))
+ ans['Teeth-Lips']['x']=req['Teeth']['x']
+ '''
+ ans={'Jaw-Teeth':[],
+ 'Teeth-Lips':[],
+ 'x':[]
+ }
+ JawTeethIter=self.options['Jaw']['window']+self.options['Jaw']['shift']-self.options['Teeth']['window']-self.options['Teeth']['shift']
+ TeethLipsIter=self.options['Teeth']['window']+self.options['Teeth']['shift']-self.options['Lips']['window']-self.options['Lips']['shift']
+ for i in range(len(req['Jaw']['y'])):
+ ans['Jaw-Teeth'].append(abs(req['Jaw']['y'][i]-req['Teeth']['y'][JawTeethIter+i]))
+ ans['Teeth-Lips'].append(-abs(req['Teeth']['y'][JawTeethIter+i]-req['Lips']['y'][JawTeethIter+TeethLipsIter+i]))
+ ans['x']=req['Jaw']['x']
+
+ return ans
+
+
+ def pltShow(self,showOnlyIndex,drawFig):
+ ans=None
+ req=[]
+ row=1
+ if not showOnlyIndex:
+
+ row=2
+ req.append({
+ 'vtype':'OCHL',
+ 'df':self.base_df,
+ 'row':1,
+ 'col':1,
+ 'name':'OHCL'
+
+ })
+
+
+ req.append({
+ 'vtype':'Bars',
+ 'df':pd.DataFrame(
+ {'Jaw-Teeth':self.ans['Jaw-Teeth'],
+ 'Teeth-Lips':self.ans['Teeth-Lips'],
+ 'date':self.ans['x'].to_list()}
+ ) ,
+ 'row':row,
+ 'col':1,
+ 'name':'Gator',
+ 'colorType':'diffAbs'
+
+ })
+
+
+ self.figDict=req
+ ans = CoreDraw.coreDraw(req,drawFig)
+ return ans
\ No newline at end of file
diff --git a/Core/Ind_Ishimoku.py b/Core/Ind_Ishimoku.py
new file mode 100644
index 0000000..381f734
--- /dev/null
+++ b/Core/Ind_Ishimoku.py
@@ -0,0 +1,188 @@
+
+import pandas as pd
+import datetime
+import numpy as np
+import plotly as pl
+import plotly.graph_objs as go
+import matplotlib.pyplot as plt
+import math
+import scipy
+import random
+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
+import CoreDraw
+init_notebook_mode()
+import CoreTraidMath
+import plotly.express as px
+
+
+class Ishimoku:
+
+ def __init__(self, base_df, options={
+ 'dataType':'ohcl',
+ 'short':9,
+ 'middle':26,
+ 'long':52,
+ 'backstep':26,
+ 'forwardstep':26
+ },needFig=False,showOnlyIndex=True,drawFig=False
+ ):
+
+ self.base_df=base_df.reset_index(drop=True)
+ self.options=options
+
+ self.ans=self.getAns()
+ if needFig:
+ self.fig=self.pltShow(showOnlyIndex,drawFig)
+
+
+ def getTankenSen(self):
+ y=np.asarray([])
+ x=np.asarray([])
+ for i in range(self.options['short'],self.base_df.shape[0]):
+ maxValue=max(self.base_df['high'][i-self.options['short']:i])
+ minValue=min(self.base_df['low'][i-self.options['short']:i])
+ y=np.append(y,(maxValue+minValue)*0.5)
+ x=np.append(x,self.base_df['date'][i])
+ #ts.append(max(self.base_df[self.options['colName']['high']][i-self.options['short']:i]))
+ ans={'y':y,'x':x}
+ return(ans)
+
+ def getKijunSen(self):
+ y=np.asarray([])
+ x=np.asarray([])
+ for i in range(self.options['middle'],self.base_df.shape[0]):
+ maxValue=max(self.base_df['high'][i-self.options['middle']:i])
+ minValue=min(self.base_df['low'][i-self.options['middle']:i])
+ y=np.append(y,(maxValue+minValue)*0.5)
+ x=np.append(x,self.base_df['date'][i])
+ #ts.append(max(self.base_df[self.options['colName']['high']][i-self.options['short']:i]))
+ ans={'y':y,'x':x}
+ return(ans)
+
+ def getChinkoSpan(self):
+ y=np.asarray(self.base_df['close'][self.options['backstep']:])
+ x=np.asarray(self.base_df['date'][:self.base_df.shape[0]-self.options['backstep']])
+ ans={'y':y,'x':x}
+ return(ans)
+
+ def getSenkouSpanA(self, data):
+ y=np.asarray([])
+ x=np.asarray([])
+ shift=len(data['TankenSen']['y'])-len(data['KijunSen']['y'])
+ for i in range(len(data['KijunSen']['x'])-self.options['forwardstep']):
+ y=np.append(y,(data['KijunSen']['y'][i]+data['TankenSen']['y'][i+shift])*0.5)
+ x=np.append(x,data['KijunSen']['x'][i+self.options['forwardstep']])
+
+ ans={'y':y,'x':x}
+ return(ans)
+
+ def getSenkouSpanB(self):
+ y=np.asarray([])
+ x=np.asarray([])
+ for i in range(self.options['long'],self.base_df.shape[0]-self.options['forwardstep']):
+ maxValue=max(self.base_df['high'][i-self.options['long']:i])
+ minValue=min(self.base_df['low'][i-self.options['long']:i])
+ y=np.append(y,(maxValue+minValue)*0.5)
+ x=np.append(x,self.base_df['date'][i+self.options['forwardstep']])
+ #ts.append(max(self.base_df[self.options['colName']['high']][i-sel
+
+ ans={'y':y,'x':x}
+ return(ans)
+
+
+
+
+
+
+ def getAns(self):
+ ans={}
+ ans['TankenSen']=self.getTankenSen()
+ ans['KijunSen']=self.getKijunSen()
+ ans['ChinkoSpan']=self.getChinkoSpan()
+ ans['SenkouSpanA']=self.getSenkouSpanA(ans)
+ ans['SenkouSpanB']=self.getSenkouSpanB()
+ #print(ans)
+ return(ans)
+
+
+ def pltShow(self,showOnlyIndex,drawFig):
+ ans=None
+ req=[]
+
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['TankenSen']['y'],'date':self.ans['TankenSen']['x']}) ,
+ 'row':1,
+ 'col':1,
+ 'name':'TankenSen'
+
+ })
+
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['KijunSen']['y'],'date':self.ans['KijunSen']['x']}) ,
+ 'row':1,
+ 'col':1,
+ 'name':'KijunSen'
+
+ })
+
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['ChinkoSpan']['y'],'date':self.ans['ChinkoSpan']['x']}) ,
+ 'row':1,
+ 'col':1,
+ 'name':'ChinkoSpan'
+
+ })
+
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['SenkouSpanA']['y'],'date':self.ans['SenkouSpanA']['x']}) ,
+ 'row':1,
+ 'col':1,
+ 'name':'SenkouSpanA'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['SenkouSpanB']['y'],'date':self.ans['SenkouSpanB']['x']}) ,
+ 'row':1,
+ 'col':1,
+ 'name':'SenkouSpanB'
+
+ })
+
+
+ if not showOnlyIndex:
+ req.append({
+ 'vtype':'OCHL',
+ 'df':self.base_df,
+ 'row':1,
+ 'col':1,
+ 'name':'OHCL'
+
+ })
+ self.figDict=req
+ ans = CoreDraw.coreDraw(req,drawFig)
+ #print(ans)
+ return ans
diff --git a/Core/Ind_LRI.py b/Core/Ind_LRI.py
new file mode 100644
index 0000000..d518592
--- /dev/null
+++ b/Core/Ind_LRI.py
@@ -0,0 +1,104 @@
+
+import pandas as pd
+import datetime
+import numpy as np
+import plotly as pl
+import plotly.graph_objs as go
+import matplotlib.pyplot as plt
+import math
+import scipy
+import random
+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 CoreDraw
+
+
+class LRI:
+ def __init__(self, base_df,options={}, needFig=False,showOnlyIndex=True,drawFig=False):
+ self.base_df=base_df.reset_index(drop=True)
+ self.options=options
+ self.col=self.base_df[self.options['valueType']]
+ self.ans=self.getAns()
+ if needFig:
+ self.fig=self.pltShow(showOnlyIndex,drawFig)
+
+ def getAns(self):
+ ans=None
+
+ l=np.asarray(list(range(len(self.col))))
+ k,b=np.polyfit(l,self.col,1)
+ setattr(self,'k',k)
+ setattr(self,'b',b)
+ b1=b+self.options['k']*pow(1-k*k,0.5)
+ b2=b-self.options['k']*pow(1-k*k,0.5)
+ ans={
+ 'LRI':l*k+b,
+ 'LRI+':l*k+b1,
+ 'LRI-':l*k+b2,
+ 'x':self.base_df['date']
+ }
+
+
+
+ return ans
+ def pltShow(self,showOnlyIndex,drawFig):
+ ans=None
+ req=[]
+ row=1
+ if not showOnlyIndex:
+
+ #row=2
+ req.append({
+ 'vtype':'OCHL',
+ 'df':self.base_df,
+ 'row':1,
+ 'col':1,
+ 'name':'OHCL'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['LRI'],'date':self.ans['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'LRI'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['LRI+'],'date':self.ans['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'LRI+'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['LRI-'],'date':self.ans['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'LRI-'
+
+ })
+ self.figDict=req
+ ans = CoreDraw.coreDraw(req,drawFig)
+ return ans
\ No newline at end of file
diff --git a/Core/Ind_STD.py b/Core/Ind_STD.py
new file mode 100644
index 0000000..a7f6489
--- /dev/null
+++ b/Core/Ind_STD.py
@@ -0,0 +1,88 @@
+
+import pandas as pd
+import datetime
+import numpy as np
+import plotly as pl
+import plotly.graph_objs as go
+import matplotlib.pyplot as plt
+import math
+import scipy
+import random
+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 CoreDraw
+
+class ISTD:
+ def __init__(self, base_df,options={}, needFig=False,showOnlyIndex=True,drawFig=False):
+ self.base_df=base_df.reset_index(drop=True)
+ self.options=options
+ self.ans=self.getAns()
+ if needFig:
+ self.fig=self.pltShow(showOnlyIndex,drawFig)
+
+ def getAns(self):
+ ans=None
+ try:
+ op={'dataType':'ohcl',
+ 'action':'findSTD',
+ 'actionOptions':{
+ 'valueType':self.options['valueType'],
+ 'window':self.options['window']
+ }
+ }
+ x=self.base_df['date'][self.options['window']-1:].to_list()
+ except:
+ op={'dataType':'ohcl',
+ 'action':'findSTD',
+ 'actionOptions':{'valueType':self.options['valueType']}
+ }
+ x=self.base_df['date'].to_list()
+ y= CoreTraidMath.CoreMath(self.base_df,op).ans
+ ans={'y':y,'x':x}
+
+
+
+ return ans
+ def pltShow(self,showOnlyIndex,drawFig):
+ ans=None
+ req=[]
+ row=1
+ if not showOnlyIndex:
+
+ row=2
+ req.append({
+ 'vtype':'OCHL',
+ 'df':self.base_df,
+ 'row':1,
+ 'col':1,
+ 'name':'OHCL'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['y'],'date':self.ans['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'ISTD'
+
+ })
+ self.figDict=req
+ ans = CoreDraw.coreDraw(req,drawFig)
+ return ans
\ No newline at end of file
diff --git a/Core/Ind_Stochastic.py b/Core/Ind_Stochastic.py
new file mode 100644
index 0000000..b3eb5b1
--- /dev/null
+++ b/Core/Ind_Stochastic.py
@@ -0,0 +1,147 @@
+
+import pandas as pd
+import datetime
+import numpy as np
+import plotly as pl
+import plotly.graph_objs as go
+import matplotlib.pyplot as plt
+import math
+import scipy
+import random
+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 CoreDraw
+
+class Stochastic:
+
+ def __init__(self, base_df, options={
+ 'dataType':'ohcl',
+ 'window':14,
+ 'windowSMA':5
+ }, needFig=False,showOnlyIndex=True,drawFig=False
+ ):
+
+ self.base_df=base_df.reset_index(drop=True)
+ self.options=options
+
+ self.ans=self.getAns()
+ if needFig:
+ self.fig=self.pltShow(showOnlyIndex,drawFig)
+
+ def getKn(self):
+ ans={}
+ y=np.asarray([])
+ x=np.asarray([])
+ for i in range(self.options['window'],self.base_df.shape[0]):
+ minValue=min(self.base_df['low'][i-self.options['window']:i])
+ maxValue=max(self.base_df['high'][i-self.options['window']:i])
+
+ y=np.append(y,(self.base_df['close'][i-1]-minValue)/(maxValue-minValue))
+ x=np.append(x,self.base_df['date'][i-1])
+ #print(i,minValue,maxValue,self.base_df[self.options['colName']['close']][i],y[-1])
+ ans['y'],ans['x']=y,x
+
+
+
+ return ans
+
+
+ def getSMA(self,col):
+ ans=None
+ ser = pd.Series(col, copy=False)
+ op={'dataType':'series',
+ 'action':'findMean',
+ 'actionOptions':{'MeanType':'SMA','window':self.options['windowSMA']}
+ }
+ ans=np.asarray(CoreTraidMath.CoreMath(ser,op).ans)
+ return ans
+ #return np.convolve(col, np.ones(self.options['windowSMA']), 'valid') /self.options['windowSMA']
+
+
+
+
+ def getDn(self,col):
+ ans={}
+ y=np.asarray([])
+ x=np.asarray([])
+ for i in range(self.options['windowSMA'],len(col['y'])):
+ y=np.append(y, self.getSMA(col['y'][i-self.options['windowSMA']:i]))
+ x=np.append(x,col['x'][i])
+
+ ans['y'],ans['x']=y,x
+ return ans
+
+ def getAns(self):
+ ans={}
+ ans['Kn']=self.getKn()
+ ans['Dn']=self.getDn(ans['Kn'])
+
+ #print(ans)
+ return(ans)
+
+
+
+ def pltShow(self,showOnlyIndex,drawFig):
+ ans=None
+
+
+
+ req=[]
+
+ row=1
+ if not showOnlyIndex:
+
+ row=2
+ req.append({
+ 'vtype':'OCHL',
+ 'df':self.base_df,
+ 'row':1,
+ 'col':1,
+ 'name':'OHCL'
+
+ })
+
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['Kn']['y'],'date':self.ans['Kn']['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'Kn'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['Dn']['y'],'date':self.ans['Dn']['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'Dn'
+
+ })
+
+ self.figDict=req
+
+
+
+
+ ans = CoreDraw.coreDraw(req,drawFig)
+
+ return ans
+
diff --git a/Core/Ind_bollingerBands.py b/Core/Ind_bollingerBands.py
new file mode 100644
index 0000000..da9ef81
--- /dev/null
+++ b/Core/Ind_bollingerBands.py
@@ -0,0 +1,109 @@
+import pandas as pd
+import datetime
+import numpy as np
+import plotly as pl
+import plotly.graph_objs as go
+import matplotlib.pyplot as plt
+import math
+import scipy
+import random
+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 CoreDraw
+
+
+class BB:
+
+ def __init__(self, base_df,options={}, needFig=False,showOnlyIndex=True,drawFig=False):
+ self.base_df=base_df.reset_index(drop=True)
+ self.options=options
+ self.ans=self.getAns()
+ if needFig:
+ self.fig=self.pltShow(showOnlyIndex,drawFig)
+
+
+
+ def getAns(self):
+ ans={}
+
+ opMA={'dataType':'ohcl',
+ 'action':'findMean',
+ 'actionOptions':{
+ 'MeanType':self.options['MeanType'],
+ 'valueType':self.options['valueType'],
+ 'window':self.options['window']
+ }
+ }
+ ans['BB']=CoreTraidMath.CoreMath(self.base_df,opMA).ans
+ opSTD={'dataType':'ohcl',
+ 'action':'findSTD',
+ 'actionOptions':{'valueType':self.options['valueType'],'window':self.options['window']}
+ }
+ ans['STD']=CoreTraidMath.CoreMath(self.base_df,opSTD).ans
+ ans['pSTD']=ans['BB']+ans['STD']*self.options['kDev']
+ ans['mSTD']=ans['BB']-ans['STD']*self.options['kDev']
+ ans['x']=np.array(self.base_df['date'][self.options['window']-1:].to_list())
+ return ans
+
+ def pltShow(self,showOnlyIndex,drawFig):
+ ans=None
+ req=[]
+ row=1
+ if not showOnlyIndex:
+
+ #row=2
+ req.append({
+ 'vtype':'OCHL',
+ 'df':self.base_df,
+ 'row':1,
+ 'col':1,
+ 'name':'OHCL'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['BB'],'date':self.ans['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'BB'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['pSTD'],'date':self.ans['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'pSTD'
+
+ })
+ req.append({
+ 'vtype':'Scatter',
+ 'df':pd.DataFrame(
+ {'value':self.ans['mSTD'],'date':self.ans['x']}) ,
+ 'row':row,
+ 'col':1,
+ 'name':'mSTD'
+
+ })
+
+ self.figDict=req
+ ans = CoreDraw.coreDraw(req,drawFig)
+ return ans
\ No newline at end of file
diff --git a/Core/readme.txt b/Core/readme.txt
new file mode 100644
index 0000000..0d8a959
--- /dev/null
+++ b/Core/readme.txt
@@ -0,0 +1,2 @@
+
+Ind_Envelopes - SMA only
diff --git a/Docs/readme.txt b/Docs/readme.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/Docs/readme.txt
@@ -0,0 +1 @@
+
diff --git a/Docs/с4.drawio b/Docs/с4.drawio
new file mode 100644
index 0000000..187856e
--- /dev/null
+++ b/Docs/с4.drawio
@@ -0,0 +1 @@
+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
\ No newline at end of file
diff --git a/News/InvestCal.py b/News/InvestCal.py
new file mode 100644
index 0000000..4e86f9e
--- /dev/null
+++ b/News/InvestCal.py
@@ -0,0 +1,123 @@
+from selenium import webdriver
+import time
+import pandas as pd
+import requests
+from bs4 import BeautifulSoup
+import nest_asyncio
+import asyncio
+import requests_html as rh
+import datetime
+import pandas as pd
+import json
+
+
+def f_write(driver):
+ with open(r'C:\\BinOptions\\exemple_pars_tomorrow.txt', 'w',encoding="utf-8") as f:
+ f.write(driver.page_source)
+
+
+
+def investingPars(path_file=None,dateDict=None):
+ ans=None
+ op=webdriver.FirefoxOptions()
+ #op.add_argument("--headless")
+ url='https://ru.investing.com/economic-calendar/'
+ #driver = webdriver.Firefox(executable_path='C:\\Users\\Redsandy\\Downloads\\geckodriver.exe')
+ EXE_PATH = r'C:\\Users\\Redsandy\\Downloads\\geckodriver.exe'
+ driver = webdriver.Firefox(executable_path=EXE_PATH,options=op)
+ try:
+ driver.get(url=url)
+
+ #time.sleep(5)
+ #driver.find_element_by_id('timeFrame_tomorrow').click()
+ #time.sleep(5)
+ #f_write(driver)
+ if dateDict!=None:
+ driver.find_element_by_id('datePickerToggleBtn').click()
+ driver.find_element_by_id("startDate").clear()
+ driver.find_element_by_id("startDate").send_keys(dateDict['startDate'])
+ driver.find_element_by_id("endDate").clear()
+ driver.find_element_by_id("endDate").send_keys(dateDict['endDate'])
+ #driver.find_element_by_id("startDate").send_keys("31/03/2022")
+ driver.find_element_by_id('applyBtn').click()
+ time.sleep(2)
+ driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
+ time.sleep(2)
+ f_write(driver)
+ page_source=driver.page_source
+
+ except Exception as ex:
+ print(ex)
+ finally:
+ driver.close()
+ driver.quit()
+
+
+ path_file_csv=path_file
+ ans=getDF(page_source,path_file_csv)
+ return ans
+
+
+
+def getTime(strok):
+ ans=None
+ if len(strok.text.split())==2:
+ ans = strok['title'].split()[-1]
+ else:
+ ans = strok.text
+ return ans
+def getValat(strok):
+ ans=None
+ inc=0
+ for i in strok.find_all('i'):
+ if i['class'][0]=='grayFullBullishIcon':
+ inc=inc+1
+ ans= str(inc)+"/3"
+ return(ans)
+def getUrl(strok):
+ ans=None
+ baseUrl='https://ru.investing.com'
+ ans=baseUrl+strok.find_all('a', href=True)[0]['href']
+ return ans
+def getDF(doc,path_file):
+ ans=None
+
+ soup = BeautifulSoup(doc, 'html.parser')
+ tabl=soup.find("table", {"id": "economicCalendarData"}).find('tbody')
+ tdList=[]
+ buff=[]
+ for stats in tabl.find_all('tr'):
+ for row in stats.find_all('td'):
+ buff.append(row)
+ tdList.append(buff)
+ buff=[]
+ col_names=['Время', 'Валюта', 'Важность','Событие','URL', 'Факт.','Прогноз','Пред.','Date']
+ df= pd.DataFrame(columns=col_names)
+
+
+ for i in range(0, len(tdList)):
+ try:
+ if tdList[i][0]["class"][0]=='theDay':
+ colDate = tdList[i][0].text[:-3]
+ else:
+ newRow={
+ col_names[0]:getTime(tdList[i][0]),
+ col_names[1]:tdList[i][1].text.strip(),
+ col_names[2]:getValat(tdList[i][2]),
+ col_names[3]:tdList[i][3].text.strip(),
+ col_names[4]:getUrl(tdList[i][3]),
+ col_names[5]:tdList[i][4].text.strip(),
+ col_names[6]:tdList[i][5].text.strip(),
+ col_names[7]:tdList[i][6].text.strip(),
+ col_names[8]:colDate
+ }
+ df=df.append(newRow, ignore_index=True)
+ except:
+ pass
+ if path_file!=None:
+ df.to_csv(path_file, index=False, encoding='utf-8-sig')
+
+
+
+ return df
+
diff --git a/News/readme.txt b/News/readme.txt
new file mode 100644
index 0000000..02d39d3
--- /dev/null
+++ b/News/readme.txt
@@ -0,0 +1,9 @@
+dateDict={
+ 'startDate':'30/03/2022',
+ 'endDate':'01/04/2022'
+
+}
+
+p='C:\\BinOptions\\df_tomorrow.csv'
+InvestCal.investingPars(p,dateDict)
+or InvestCal.investingPars()
diff --git a/Untitled Diagram.drawio b/Untitled Diagram.drawio
deleted file mode 100644
index f28643d..0000000
--- a/Untitled Diagram.drawio
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-