130 lines
3.8 KiB
Python
130 lines
3.8 KiB
Python
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 market_trade.core.CoreTraidMath
|
|
import market_trade.core.CoreDraw
|
|
import market_trade.core.Ind_bollingerBands
|
|
import market_trade.signals.coreSignal
|
|
|
|
|
|
class SignalBollingerBands1(market_trade.signals.coreSignal):
|
|
def __init__(self,
|
|
IndDict={},
|
|
mode='retro',
|
|
):
|
|
super().__init__(name='1.1',mode=mode,target='nextBar',valeType='price')
|
|
self.IndDict=IndDict
|
|
self.BB=market_trade.core.Ind_bollingerBands.BB(
|
|
IndDict['BB']['df'],
|
|
IndDict['BB']['params'],
|
|
IndDict['BB']['needFig'],
|
|
IndDict['BB']['showOnlyIndex'],
|
|
IndDict['BB']['drawFig']
|
|
)
|
|
self.getAns()
|
|
if mode=='retro':
|
|
self.analiz=self.analiz()
|
|
|
|
def getAns(self):
|
|
if self.mode=='retro':
|
|
df=self.BB.base_df#.set_index('date')
|
|
#print (df)
|
|
df_ind=pd.DataFrame.from_dict({
|
|
'date': self.BB.ans['x'],
|
|
'BB': self.BB.ans['BB'],
|
|
'pSTD': self.BB.ans['pSTD'],
|
|
'mSTD': self.BB.ans['mSTD'],
|
|
})
|
|
self.df_ind=df_ind
|
|
#df_ind=df_ind.set_index('date')
|
|
#print(df_ind)
|
|
dictSig={}
|
|
ans_sig=[]
|
|
analizLst=[]
|
|
difSize=len(df)-len(df_ind)
|
|
for i in range(len(df_ind)):
|
|
#print(df.iloc[i+dif]['date'],df_ind.iloc[i]['date'])
|
|
if df.iloc[i+difSize]['close'] >df_ind.iloc[i]['pSTD']:
|
|
ans_sig.append(1)
|
|
elif df.iloc[i+difSize]['close'] <df_ind.iloc[i]['mSTD']:
|
|
ans_sig.append(-1)
|
|
else:
|
|
ans_sig.append(0)
|
|
|
|
self.ans={
|
|
'signal':ans_sig,
|
|
'dttm':self.BB.ans['x']
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return self.ans
|
|
|
|
def analiz(self):
|
|
df=self.BB.base_df
|
|
dictSig={}
|
|
ans_sig=self.ans['signal']
|
|
difSize=len(df)-len(self.df_ind)
|
|
analizLst=[]
|
|
for i in range(len(self.df_ind)-1):
|
|
if ans_sig[i]==1 and df.iloc[i+difSize]['close']<df.iloc[i+difSize+1]['high']:
|
|
analizLst.append(1)
|
|
elif ans_sig[i]==1 and df.iloc[i+difSize]['close']>=df.iloc[i+difSize+1]['low']:
|
|
analizLst.append(-1)
|
|
elif ans_sig[i]==-1 and df.iloc[i+difSize]['close']>df.iloc[i+difSize+1]['low']:
|
|
analizLst.append(1)
|
|
elif ans_sig[i]==-1 and df.iloc[i+difSize]['close']<=df.iloc[i+difSize+1]['high']:
|
|
analizLst.append(-1)
|
|
else:
|
|
analizLst.append(0)
|
|
|
|
self.analizLst=analizLst
|
|
|
|
t=0
|
|
f=0
|
|
zeroNum=0
|
|
for i in self.analizLst:
|
|
if i==1:
|
|
t=t+1
|
|
if i==-1:
|
|
f=f+1
|
|
if i==0:
|
|
zeroNum=zeroNum+1
|
|
|
|
ans={}
|
|
ans['chstota']=sum(self.analizLst)/len(self.analizLst)
|
|
ans['zeroNum %']=zeroNum/len(self.analizLst)
|
|
ans['t %']=t/len(self.analizLst)
|
|
ans['f %']=f/len(self.analizLst)
|
|
try:
|
|
ans['toch']=t/(t+f)
|
|
except:
|
|
pass
|
|
|
|
return ans
|