import pandas as pd
import requests
import matplotlib.pyplot as plt
import numpy as np
from math import floor
from termcolor import colored as cl
import pandas as pd
import finnhub
from sklearn.cluster import KMeans
import mplfinance as mpf
from mplfinance.original_flavor import candlestick_ohlc
import matplotlib.dates as mpl_dates
        #  from datetime import * 

import urllib3, socket
from urllib3.connection import HTTPConnection
    
HTTPConnection.default_socket_options = ( 
            HTTPConnection.default_socket_options + [
            (socket.SOL_SOCKET, socket.SO_SNDBUF, 10000000), #1MB in byte
            (socket.SOL_SOCKET, socket.SO_RCVBUF, 10000000)
        ])
#pip install --default-timeout=100 future 
import requests

#return requests.get(url).json()
def get_signal(ticker, start, end):
            print(ticker)
            # EXTRACTING STOCK DATA
            # Setup client
            # Stock candles
            # finnhub_client = finnhub.Client(api_key = "bt3efpf48v6tfcs816eg")
            # # Stock candles
            # start =list(start)
            # end = list(end)
            # from datetime import datetime
            # start_time = int(datetime(start[0], start[1], start[2], 0, 0).replace(tzinfo = timezone.utc).timestamp())
            # end_time = int(datetime(end[0], end[1], end[2], 0, 0).replace(tzinfo = timezone.utc).timestamp())
            # res = finnhub_client.stock_candles(ticker, 'D', start_time, end_time)
            # stock = pd.DataFrame(res)
            # stock = stock.rename(columns = {'t':'Date', 'o':'Open', 'h':'High', 'l':'Low', 'c':'Close', 's':'status', 'v':'volumn'})
            # stock['Date'] = pd.to_datetime(stock['Date'], unit = 's')
            # stock = stock.set_index('Date')
            
            import requests
            api_key = '86dd63f6b8ae774b061232685b78eb52'
            from datetime import datetime
            bs = requests.get(f'https://financialmodelingprep.com/api/v3/historical-price-full/{ticker}?from={start}&to={end}&apikey={api_key}').json()['historical']
            stock = pd.DataFrame(bs)
            stock =stock[['date','open','high','low','close','volume']]
            stock = stock.rename(columns = {'date':'Date', 'open':'Open', 'high':'High','low':'Low', 'close':'Close', 'volume':'volume'})
            stock = stock.set_index('Date')
            stock= stock.sort_index()
            data1 = stock.copy()
            # strategy CALCULATION 
            def get_tsi(Close, long, short, signal):
                diff = Close - Close.shift(1)
                abs_diff = abs(diff)
                
                diff_smoothed = diff.ewm(span = long, adjust = False).mean()
                diff_double_smoothed = diff_smoothed.ewm(span = short, adjust = False).mean()
                abs_diff_smoothed = abs_diff.ewm(span = long, adjust = False).mean()
                abs_diff_double_smoothed = abs_diff_smoothed.ewm(span = short, adjust = False).mean()
                
                tsi = (diff_double_smoothed / abs_diff_double_smoothed) * 100
                signal = tsi.ewm(span = signal, adjust = False).mean()
               # tsi = tsi[tsi.index >= '2020-01-01'].dropna()
               # signal = signal[signal.index >= '2020-01-01'].dropna()
                
                return tsi, signal
            data1['tsi'], data1['signal_line'] = get_tsi(data1['Close'], 25, 13, 12)
            
            # TRUE STRENGTH INDEX STRATEGY
            def implement_tsi_strategy(prices, tsi, signal_line):
                buy_price = []
                sell_price = []
                tsi_signal = []
                signal = 0
                
                for i in range(len(prices)):
                    if tsi[i-1] < signal_line[i-1] and tsi[i] > signal_line[i]:
                        if signal != 1:
                            buy_price.append(prices[i])
                            sell_price.append(np.nan)
                            signal = 1
                            tsi_signal.append(signal)
                        else:
                            buy_price.append(np.nan)
                            sell_price.append(np.nan)
                            tsi_signal.append(0)
                    elif tsi[i-1] > signal_line[i-1] and tsi[i] < signal_line[i]:
                        if signal != -1:
                            buy_price.append(np.nan)
                            sell_price.append(prices[i])
                            signal = -1
                            tsi_signal.append(signal)
                        else:
                            buy_price.append(np.nan)
                            sell_price.append(np.nan)
                            tsi_signal.append(0)
                    else:
                        buy_price.append(np.nan)
                        sell_price.append(np.nan)
                        tsi_signal.append(0)
                        
                return buy_price, sell_price, tsi_signal
            
            buy_price, sell_price, tsi_signal = implement_tsi_strategy(data1['Close'], data1['tsi'], data1['signal_line'])
            
            # STOCK POSITION
            position = []
            for i in range(len(tsi_signal)):
                if tsi_signal[i] > 1:
                    position.append(0)
                else:
                    position.append(1)
                    
            for i in range(len(data1['Close'])):
                if tsi_signal[i] == 1:
                    position[i] = 1
                elif tsi_signal[i] == -1:
                    position[i] = 0
                else:
                    position[i] = position[i-1]
                    
            Close_price = data1['Close']  
            tsi = data1['tsi']
            signal_line = data1['signal_line']
            tsi_signal = pd.DataFrame(tsi_signal).rename(columns = {0:'tsi_signal'}).set_index(data1.index)
            position = pd.DataFrame(position).rename(columns = {0:'tsi_position'}).set_index(data1.index)
            
            frames_data1 = [Close_price, tsi, signal_line, tsi_signal, position]
            strategy1 = pd.concat(frames_data1, join = 'inner', axis = 1)
            
            strategy1['ret'] =pd.DataFrame(strategy1['Close'].pct_change())
            
            strategy1['tsi_returns'] = strategy1['ret'] *strategy1['tsi_position']
            
            # fig, ax = plt.subplots()
            # plt.plot(((1+strategy1['tsi_returns'][1:]  ).cumprod()), color = 'green')
            # plt.plot(((1+strategy1['ret'][1:]).cumprod()), color = 'red')
            
            return strategy1
        #s=  get_signal('OGN', start = (2020,1,1),  end = end)     
def strategy_signal1(symbols): 
            strategy1 = pd.DataFrame()
            for tick in symbols:
                #print(tick)
              #  tick = 'TBIO'
               
                data = get_signal(tick, start ,  end )     
                f =pd.DataFrame(columns = ['g_bp','g_sp','g_p_bp','g_p_sp','g_tdate' ,'strategy1_g_signal'])
                if data['tsi_signal'][-1] == 1 and data['tsi_position'][-1] ==1:
                    d =pd.DataFrame( data.iloc[-1,:]).T
                   # buy_price.append(d['Close'].values)
                   # d.index = d.index.strftime('%d/%m/%Y')
                    d.index = pd.to_datetime(d.index, format='%Y-%m-%d')
                    d = d.reset_index()
                    f= f.append({'g_bp':d['Close'][0], 'g_sp':0,'g_p_bp':0,'g_p_sp':0,'g_tdate': d['index'][0],'strategy1_g_signal':1},ignore_index = True)
                 #   d.index = pd.to_datetime(d.index, format='%Y-%m-%d')
                   # date = d.index.values.tolist()
                elif data['tsi_signal'][-1] == -1 and data['tsi_position'][-1] ==0:
                    d =pd.DataFrame( data.iloc[-1,:]).T
                   # buy_price.append(d['Close'].values)
                  #  d.index = d.index.strftime('%d/%m/%Y')
                    d.index = pd.to_datetime(d.index, format='%Y-%m-%d')
                    d = d.reset_index()
                    f= f.append({'g_bp':0, 'g_sp':d['Close'][0],'g_p_bp':0,'g_p_sp':0,'g_tdate': d['index'][0],'strategy1_g_signal':-1},ignore_index = True)
                 #   d.index = pd.to_datetime(d.index, format='%Y-%m-%d')
                elif data['tsi_signal'][-1] == 0 and data['tsi_position'][-1] ==1:
                    data1 = data[(data['tsi_signal'] == 1) & (data['tsi_position'] ==1)]
                    d =pd.DataFrame( data1.iloc[-1,:]).T
                   # buy_p.append(d['Close'].values)
                   # d.index = d.index.strftime('%d/%m/%Y')
                    d.index = pd.to_datetime(d.index, format='%Y-%m-%d')
                    d = d.reset_index()
                    f= f.append({'g_bp':0, 'g_sp':0,'g_p_bp':d['Close'][0],'g_p_sp':0,'g_tdate': d['index'][0], 'strategy1_g_signal':0},ignore_index = True)
                 #   d.index = pd.to_datetime(d.index, format='%Y-%m-%d')
                elif data['tsi_signal'][-1] == 0 and data['tsi_position'][-1] ==0:
                    data1= data[(data['tsi_signal'] == -1) & (data['tsi_position'] ==0)]
                    d =pd.DataFrame( data1.iloc[-1,:]).T
                   # d.index = d.index.strftime('%d/%m/%Y')
                    d.index = pd.to_datetime(d.index, format='%Y-%m-%d')
                    d = d.reset_index()
                    f= f.append({'g_bp':0, 'g_sp':0,'g_p_bp':0,'g_p_sp':d['Close'][0],'g_tdate': d['index'][0],'strategy1_g_signal':0},ignore_index = True)
        
                f.index = [tick]
                Close = data.loc[data.index[-1],'Close']
                f['g_cur_p'] = [Close]
              # dat = data.index[-1]
                today = dt.today()
                f['g_tdate'] = [today]
                f['g_date'] =[today]
                strategy1 = pd.concat([f,strategy1], axis=0)
            strategy1['g_name'] = 'Green Momentum'
            
            strategy1=strategy1.sort_index()   
            
            return strategy1

#s = pd.DataFrame(symbols)
#s.to_csv(r'C:\Users\jizha\Desktop\seabridge_datapool1\stock_lists_pool_3_13.csv')
#f.to_csv(r'C:\Users\jizha\Desktop\seabridge_datapool1\stock_lists_pool_09_20_2022.csv' )  
#stock_lists = pd.read_csv(r'C:\Users\jizha\Desktop\seabridge_datapool1\stock_lists_pool_09_20_2022.csv') 
#f1.to_csv(r'C:\Users\jizha\Desktop\seabridge_datapool1\stock_lists_pool_1_26_2022.csv' )  
#stock_list0 = pd.read_csv(r'C:\Users\jizha\Desktop\seabridge_datapool1\stock_lists_pool_1_26_2022.csv')
stock_lists = pd.read_csv(r'C:\Users\jizha\Desktop\seabridge_datapool1\stock_lists_pool_05_27_2023.csv' )
#stock_lists = pd.read_csv(r'C:\Users\jizha\Desktop\seabridge_datapool1\stock_lists_pool_3_13.csv') 
symbols = list(stock_lists['0']) 
#symbols = ['AAL','AON','ARW','ASGN']
symbols.remove('GEHCV')
symbols.remove('ASML')
symbols.remove('RXDX')
symbols.remove('ALTM')
symbols.remove('YUM')
symbols.remove('L&TFH.NS')
symbols.remove('LB')
# symbols.remove('DRE')
from datetime import datetime as dt
import datetime
today = dt.today()
end = today-datetime.timedelta(1)
end  =today
#start = '2021-03-01'
start = today-datetime.timedelta(200)
#start = '2021-03-01'
n=4#umber of groups
groups = np.array_split(symbols, n)
group1 = groups[0].tolist()
group2 = groups[1].tolist()
group3 = groups[2].tolist()
group41 =groups[3].tolist()
# group42 =groups[4].tolist()
        # group43 =groups[5].tolist()
        #group41.remove('RIVN')
        
from datetime import datetime as dt
import datetime
import time
data1 =  strategy_signal1(group1) 
time.sleep(60)
#单独run 
##########################################################################################

data2 =  strategy_signal1(group2) 
time.sleep(60)
#我来学习了 

#单独run 
###############################################################################
data3 =  strategy_signal1(group3)
time.sleep(60)
#单独run 
###############################################################################
data41 =  strategy_signal1(group41)
time.sleep(60)
#单独run 
###############################################################################
# data42 =  strategy_signal1(group42)
# data43 =  strategy_signal1(group43)

        
        #单独run 
        ###############################################################################
strategy1_signal = pd.concat([data1, data2, data3, data41],axis =0)
strategy1_signal = strategy1_signal[ strategy1_signal['strategy1_g_signal'] ==1]
strategy1_signal=strategy1_signal.sort_index()      

import matplotlib.image as mpimg
import matplotlib.pyplot as plt
# Read Images
img1= mpimg.imread(r'C:/Users/jizha/App-googlesheet/icon/pa_buy.jpg')
img2= mpimg.imread(r'C:/Users/jizha/App-googlesheet/icon/pa_downtrend.jpg')
img3= mpimg.imread(r'C:/Users/jizha/App-googlesheet/icon/pa_no_signal.jpg')
img4= mpimg.imread(r'C:/Users/jizha/App-googlesheet/icon/pa_sell.jpg')
img5= mpimg.imread(r'C:/Users/jizha/App-googlesheet/icon/pa_sideways.jpg')
img6= mpimg.imread(r'C:/Users/jizha/App-googlesheet/icon/pa_uptrend.jpg')
# Output Images

def get_pa_signal(symblos1):
    for ticker in symblos1:
            print(ticker)
            fig = plt.figure(figsize=(10,10))
            plt.imshow(img1)
            plt.axis("off")
            # plt.grid(b=None)
            plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)
            path ="C:\\users\jizha\Desktop\seabridge fintech\greenline_pa_icon\\"
            plt.savefig(path +'{}.jpg'.format(ticker+"_pa_greenline_signal"), dpi = 72,transparent = True, bbox_inches = 'tight', pad_inches = 0)
            plt.show()
            
    #dr= 'https://3arbzfbsh-cname-us.ngrok.io'
    g_pa_signal_url = pd.DataFrame()
    for ticker in symblos1:
        print(ticker)
        image = pd.DataFrame()
        dr = "https://3arbzfbsh-cname-us.ngrok.io/Desktop/seabridge%20fintech/greenline_pa_icon/"+ticker+"_pa_greenline_signal.jpg"
        tick = ticker
        image['g_PA_image_buy_sell']=[ dr]
        image.index =[tick]
        g_pa_signal_url  = pd.concat([g_pa_signal_url ,image], axis =0)
    g_pa_signal_url=g_pa_signal_url.sort_index()  
    return g_pa_signal_url
     

symblos1 = list(strategy1_signal.index)
g_pa_signal_url = get_pa_signal(symblos1)

strategy1 =strategy1_signal.merge(g_pa_signal_url, left_index=True, right_index=True)

strategy1 ['g_b_r_p'] = strategy1['g_bp']+strategy1['g_bp']*0.005
strategy1['g_b_r_m'] = strategy1['g_bp'] - strategy1['g_bp']*0.005
strategy1['g_b_zone'] = 'Yes'    
strategy1[['g_bp','g_sp','g_p_bp','g_p_sp','g_cur_p','g_b_r_p','g_b_r_m']] =strategy1[['g_bp','g_sp','g_p_bp','g_p_sp','g_cur_p','g_b_r_p','g_b_r_m']].astype(float)
strategy1[['g_bp','g_sp','g_p_bp','g_p_sp','g_cur_p','g_b_r_p','g_b_r_m']]= strategy1[['g_bp','g_sp','g_p_bp','g_p_sp','g_cur_p','g_b_r_p','g_b_r_m']].applymap("{0:,.2f}".format) 
#strategy1[['g_bp','g_sp','g_p_bp','g_p_sp','g_cur_p']]= strategy1[['g_bp','g_sp','g_p_bp','g_p_sp','g_cur_p']].applymap("{0:,.2f}".format) 
#strategy1.columns =strategy1.columns.to_series().apply(lambda x: x.strip())

#strategy1['g_tdate']= pd.to_datetime(strategy1['g_tdate']).dt.date
#strategy1.dtypespip install scikit-optimize

from datetime import datetime as dt
import datetime
today = dt.today()
a=str(today.year)
b=str(today.month)
c=str(today.day)
print(c)
strategy1['g_tdate']= pd.to_datetime(strategy1['g_tdate']).dt.date
strategy1['g_date']= pd.to_datetime(strategy1['g_date']).dt.date
strategy1 .to_csv(r'C:\Users\jizha\Desktop\seabridge_datapool1\final_strategy_data_temporaly\startegy1.csv_'+a+'_'+b+'_'+c+'.csv') 

#strategy1 .to_csv('C:\\Users\\jizha\\Desktop\\seabridge_datapool1\\final_strategy_data_temporaly\\startegy1.csv_'+a+'_'+b+'_'+c+'.csv') 
#strategy1= pd.read_csv(r'C:\Users\jizha\Desktop\seabridge_datapool1\final_strategy_data_temporaly\startegy1.csv_'+a+'_'+b+'_'+c+'.csv') 




#strategy1 .to_csv(r'C:\Users\jizha\Desktop\Strategy_auto_2_21_2022\startegy1.csv_'+a+'_'+b+'_'+c+'.csv',encoding='utf-8') 
#C:\Users\jizha\Desktop\Strategy_auto_2_21_2022
#C:\Users\jizha\Desktop\Strategy_auto_2_21_2022
#strategy1_1 = strategy1.copy()
#strategy1_1[['g_tdate','g_date']] =  pd.Timestamp(strategy1_1[['g_tdate','g_date']])
#strategy1_1[['g_tdate','g_date']]= strategy1_1[['g_tdate','g_date']].astype(str)
# file = r'C:\Users\jizha\Desktop\Strategy_auto_2_21_2022\results.csv'
# with open(file, 'w') as the_file:
#         the_file.write(strategy1_1+'\n')
# #        the_file.write(enddate+'\n')
# C:\Users\jizha\Desktop\Strategy_auto_2_21_2022\results
# #print(startdate)
 #   print(enddate)
strategy1  = pd.read_csv(r'C:\Users\jizha\Desktop\seabridge_datapool1\final_strategy_data_temporaly\startegy1.csv_'+a+'_'+b+'_'+c+'.csv')


#strategy1 .to_csv(r'C:\Users\jizha\Desktop\seabridge_datapool1\final_strategy_data_temporaly\startegy1.csv_'+a+'_'+b+'_'+c+'.csv') 
strategy1 = strategy1.drop_duplicates() 