Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Analysis/ichimoku.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()


Expand Down Expand Up @@ -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:
Expand Down
143 changes: 119 additions & 24 deletions Analysis/stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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')
Expand All @@ -85,20 +90,38 @@ 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
await asyncio.sleep(1500)


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')
Expand All @@ -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')
Expand All @@ -136,55 +175,111 @@ 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
await asyncio.sleep(14000)


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)
11 changes: 11 additions & 0 deletions Inc/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)