diff --git a/Analysis/ichimoku.py b/Analysis/ichimoku.py index c3a1d11..ef47b9e 100644 --- a/Analysis/ichimoku.py +++ b/Analysis/ichimoku.py @@ -19,7 +19,8 @@ import numpy as np from Inc import db, functions from Telegram.Client.message import broadcast_messages - +#ebrahimi +import time connection = db.con_db() @@ -96,6 +97,8 @@ def check(): coin_id=coin_id, current_price=close, target_price=target_price, risk=result[1], position=position, timeframe_id=timeframe_id) + #mojtaba + return [timeframe_id,coin_id,close,time.time,position] # for transaction in future # users = functions.get_user_recommendation(connection, coin_id=coin_id, analysis_id=1, timeframe_id=timeframe_id) # for user in users: diff --git a/Analysis/stream.py b/Analysis/stream.py index 758e739..5453d39 100644 --- a/Analysis/stream.py +++ b/Analysis/stream.py @@ -22,10 +22,8 @@ from Libraries import data_collector from Inc import db from Analysis import ichimoku - connection = db.con_db() - def init_statics(): # this method work with n parameters and return stored CSVs in Static with 4 timeframes data_collector.generate_data("BTCUSDT", "ETHUSDT") @@ -74,6 +72,13 @@ def append(data: pd.DataFrame, symbol: str, timeframe: str, candle): # for now we have 2 coins and 2 parameters in future need loop for all coins # there is 4 functions for 4 timeframes after all used in main async async def stream_30min_candle(*symbols: str, socket: BinanceSocketManager): + #ebrahimi + global acc,accuracy + acc=None + accuracy= pd.DataFrame(columns=['timeframe_id','coin_id','price','timestamp','position','highest','lowest','true/false']) + global num,step_a + num,step_a=0,0 + trick=False count = 0 data0_30min = pd.read_csv(f'Static/{symbols[0]}-30min.csv') data1_30min = pd.read_csv(f'Static/{symbols[1]}-30min.csv') @@ -85,13 +90,24 @@ async def stream_30min_candle(*symbols: str, socket: BinanceSocketManager): c_30m_data1 = await candle1_30min.recv() if c_30m_data0['k']['x']: data0_30min = append(data0_30min, symbols[0], "30min", c_30m_data0) - ichimoku.signal(data=data0_30min, gain=0.003, cost=1, coin_id=1, timeframe_id=1) + #ebrahimi + acc=ichimoku.signal(data=data0_30min, gain=0.003, cost=1, coin_id=1, timeframe_id=1) + trick=True count += 1 + highest=float(c_30m_data0['k']['h']) + lowest=float(c_30m_data0['k']['l']) + function(acc=acc,dataframe=accuracy,trick=trick,highest=highest,lowest=lowest) + trick=False if c_30m_data1['k']['x']: data1_30min = append(data1_30min, symbols[1], "30min", c_30m_data1) - ichimoku.signal(data=data1_30min, gain=0.003, cost=1, coin_id=2, timeframe_id=1) + #ebrahimi + acc=ichimoku.signal(data=data1_30min, gain=0.003, cost=1, coin_id=2, timeframe_id=1) + trick=True count += 1 - + highest=float(c_30m_data1['k']['h']) + lowest=float(c_30m_data1['k']['l']) + function(acc=acc,dataframe=accuracy,trick=trick,highest=highest,lowest=lowest) + trick=False # 30min sleep for new data if count == 2: count = 0 @@ -99,6 +115,13 @@ async def stream_30min_candle(*symbols: str, socket: BinanceSocketManager): async def stream_1hour_candle(*symbols: str, socket: BinanceSocketManager): + #ebrahimi + global acc,accuracy + acc=None + accuracy= pd.DataFrame(columns=['timeframe_id','coin_id','price','timestamp','position','highest','lowest','true/false']) + global num,step_a + num,step_a=0,0 + trick=False count = 0 data0_1hour = pd.read_csv(f'Static/{symbols[0]}-1hour.csv') data1_1hour = pd.read_csv(f'Static/{symbols[1]}-1hour.csv') @@ -110,21 +133,37 @@ async def stream_1hour_candle(*symbols: str, socket: BinanceSocketManager): c_1h_data1 = await candle1_1hour.recv() if c_1h_data0['k']['x']: data0_1hour = append(data0_1hour, symbols[0], "1hour", c_1h_data0) - ichimoku.signal(data=data0_1hour, gain=0.003, cost=1, coin_id=1, timeframe_id=2) + #ebrahimi + acc=ichimoku.signal(data=data0_1hour, gain=0.003, cost=1, coin_id=1, timeframe_id=2) + trick=True count += 1 - + highest=float(c_1h_data0['k']['h']) + lowest=float(c_1h_data0['k']['l']) + function(acc=acc,dataframe=accuracy,trick=trick,highest=highest,lowest=lowest) + trick=False if c_1h_data1['k']['x']: data1_1hour = append(data1_1hour, symbols[1], "1hour", c_1h_data1) - ichimoku.signal(data=data1_1hour, gain=0.003, cost=1, coin_id=2, timeframe_id=2) + #ebrahimi + acc=ichimoku.signal(data=data1_1hour, gain=0.003, cost=1, coin_id=2, timeframe_id=2) + trick=True count += 1 - + highest=float(c_1h_data1['k']['h']) + lowest=float(c_1h_data1['k']['l']) + function(acc=acc,dataframe=accuracy,trick=trick,highest=highest,lowest=lowest) + trick=False # 1hour sleep for new data if count == 2: count = 0 await asyncio.sleep(3000) - async def stream_4hour_candle(*symbols: str, socket: BinanceSocketManager): + #ebrahimi + global acc,accuracy + acc=None + accuracy= pd.DataFrame(columns=['timeframe_id','coin_id','price','timestamp','position','highest','lowest','true/false']) + global num,step_a + num,step_a=0,0 + trick=False count = 0 data0_4hour = pd.read_csv(f'Static/{symbols[0]}-4hour.csv') data1_4hour = pd.read_csv(f'Static/{symbols[1]}-4hour.csv') @@ -136,14 +175,24 @@ async def stream_4hour_candle(*symbols: str, socket: BinanceSocketManager): c_4h_data1 = await candle1_4hour.recv() if c_4h_data0['k']['x']: data0_4hour = append(data0_4hour, symbols[0], "4hour", c_4h_data0) - ichimoku.signal(data=data0_4hour, gain=0.003, cost=1, coin_id=1, timeframe_id=3) + #ebrahimi + acc=ichimoku.signal(data=data0_4hour, gain=0.003, cost=1, coin_id=1, timeframe_id=3) + trick=True count += 1 - + highest=float(c_4h_data0['k']['h']) + lowest=float(c_4h_data0['k']['l']) + function(acc=acc,dataframe=accuracy,trick=trick,highest=highest,lowest=lowest) + trick=False if c_4h_data1['k']['x']: data1_4hour = append(data1_4hour, symbols[1], "15min", c_4h_data1) - ichimoku.signal(data=data1_4hour, gain=0.003, cost=1, coin_id=2, timeframe_id=3) + #ebrahimi + acc=ichimoku.signal(data=data1_4hour, gain=0.003, cost=1, coin_id=2, timeframe_id=3) + trick=True count += 1 - + highest=float(c_4h_data1['k']['h']) + lowest=float(c_4h_data1['k']['l']) + function(acc=acc,dataframe=accuracy,trick=trick,highest=highest,lowest=lowest) + trick=False # sleep 4hours for new data if count == 2: count = 0 @@ -151,40 +200,86 @@ async def stream_4hour_candle(*symbols: str, socket: BinanceSocketManager): async def stream_1day_candle(*symbols: str, socket: BinanceSocketManager): + #ebrahimi + accuracy_1day0= pd.DataFrame(columns=['timeframe_id','coin_id','price','timestamp','position','highest','lowest','true/false']) + accuracy_1day1= pd.DataFrame(columns=['timeframe_id','coin_id','price','timestamp','position','highest','lowest','true/false']) + trick0,trick1=False,False + acc0,acc1=None,None + num0,num1=-1,-1 count = 0 data0_1day = pd.read_csv(f'Static/{symbols[0]}-1day.csv') data1_1day = pd.read_csv(f'Static/{symbols[1]}-1day.csv') - candle0_1day = socket.kline_socket(symbol=symbols[0], interval=Client.KLINE_INTERVAL_1DAY) - candle1_1day = socket.kline_socket(symbol=symbols[1], interval=Client.KLINE_INTERVAL_1DAY) + candle0_1day = socket.kline_socket(symbol=symbols[0], interval=Client.KLINE_INTERVAL_1MINUTE) + candle1_1day = socket.kline_socket(symbol=symbols[1], interval=Client.KLINE_INTERVAL_1MINUTE) async with candle0_1day, candle1_1day: while True: c_1d_data0 = await candle0_1day.recv() c_1d_data1 = await candle1_1day.recv() if c_1d_data0['k']['x']: data0_1day = append(data0_1day, symbols[0], "1day", c_1d_data0) - ichimoku.signal(data=data0_1day, gain=0.003, cost=1, coin_id=1, timeframe_id=4) + #ebrahimi + acc0=ichimoku.signal(data=data0_1day, gain=0.003, cost=1, coin_id=1, timeframe_id=4) + if acc0: + trick0=True + num0+=1 count += 1 if c_1d_data1['k']['x']: data1_1day = append(data1_1day, symbols[1], "1day", c_1d_data1) - ichimoku.signal(data=data1_1day, gain=0.003, cost=1, coin_id=2, timeframe_id=4) + #ebrahimi + acc1=ichimoku.signal(data=data1_1day, gain=0.003, cost=1, coin_id=2, timeframe_id=4) + if acc1: + trick1=True + num1+=1 count += 1 + highest=float(c_1d_data1['k']['h']) + lowest=float(c_1d_data1['k']['l']) # sleep 24hour for new data if count == 2: count = 0 - await asyncio.sleep(85000) - - + function(acc=acc0,dataframe=accuracy_1day0,trick=trick0,highest=highest,lowest=lowest,num=num0) + function(acc=acc1,dataframe=accuracy_1day1,trick=trick1,highest=highest,lowest=lowest,num=num1) + await asyncio.sleep(1) + #ebrahimi + trick0=False + trick1=False async def stream(): # init statics for clean date init_statics() client = await AsyncClient.create() bm = BinanceSocketManager(client) - await asyncio.gather(stream_30min_candle("BTCUSDT", "ETHUSDT", socket=bm), + await asyncio.gather( + stream_1day_candle("BTCUSDT", "ETHUSDT", socket=bm)) +'''stream_30min_candle("BTCUSDT", "ETHUSDT", socket=bm), stream_1hour_candle("BTCUSDT", "ETHUSDT", socket=bm), stream_4hour_candle("BTCUSDT", "ETHUSDT", socket=bm), - stream_1day_candle("BTCUSDT", "ETHUSDT", socket=bm)) - + interval=Client.KLINE_INTERVAL_1DAY''' # use this in main def run(): asyncio.run(stream()) +def function(acc,dataframe,trick,highest,lowest,num): + if trick: + acc.extend(['nan','nan','nan']) + dataframe.loc[num]=acc + num+=1 + if num>=1 : + dataframe.loc[num-1][-3] = highest + dataframe.loc[num-1][-2] = lowest + for xi in range(2,4): + if num>=xi: + if dataframe.loc[num-xi][-3] <= highest: + dataframe.loc[num-xi][-3] = highest + if dataframe.loc[num-xi][-2] >= lowest: + dataframe.loc[num-xi][-2] = lowest + if xi==3: + if dataframe.loc[num-xi][-4] == 'buy': + if dataframe.loc[num-xi][2] >= dataframe.loc[num-xi][-3]: + dataframe.loc[num-xi][-1]=1 + else: + dataframe.loc[num-xi][-1]=0 + elif dataframe.loc[num-xi][-4] =='sell': + if dataframe.loc[num-xi][2] <= dataframe.loc[num-xi][-2]: + dataframe.loc[num-xi][-1]=1 + else: + dataframe.loc[num-xi][-1]=0 + print(dataframe) diff --git a/Inc/functions.py b/Inc/functions.py index 66e57ac..0c5d0db 100644 --- a/Inc/functions.py +++ b/Inc/functions.py @@ -601,4 +601,15 @@ def set_accuracy(db_connection: MySQLConnection, recom_id: int, validity: int): db_connection.commit() except mysql.connector.Error as err: return "Something went wrong: {}".format(err) +#ebrahimi +def realtime_accuracy(db_connection:MySQLConnection,timeframe_id: int,timestamp,coin_id:int,accuracy:float): + cursor = db_connection.cursor() + try: + sql = "INSERT INTO accuracy (recom_id, accuracy) VALUES (%s , %s)" + val = (recom_id,accuracy) + cursor.execute(sql, val) + db_connection.commit() + except mysql.connector.Error as err: + return "Something went wrong: {}".format(err) +