Hopper1394's picture
Create app.py
f0cfef4 verified
BINANCE_API_KEY = 'https://api.binance.com/api/v3/ticker/price?symbol='
ALPHA_VANTAGE_API_KEY = 'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=IBM&apikey=demo'
YAHOO_FINANCE_API_KEY = 'your_yahoo_finance_api_key'
TRADING_VIEW_API_KEY = 'your_trading_view_api_key'
BINOMO_API_KEY = 'your_binomo_api_key'
TELEGRAM_BOT_API_KEY = '7074501421:AAEOoCMvXxr_T6sYIXAvHIDr515pLZ_ERtE'
# data_acquisition.py
import requests
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from telegram.ext import Updater, CommandHandler
def fetch_binance_data(pair):
url = f"https://api.binance.com/api/v3/klines?symbol={pair}&interval=1h"
response = requests.get(url)
data = response.json()
df = pd.DataFrame(data, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume', 'close_time', 'quote_asset_volume', 'number_of_trades', 'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
return df[['timestamp', 'open', 'high', 'low', 'close', 'volume']]
def fetch_alpha_vantage_data(pair):
symbol = pair.split("USDT")[0] # Assuming pair like BTCUSDT
url = f"https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol={symbol}&interval=60min&apikey={ALPHA_VANTAGE_API_KEY}"
response = requests.get(url)
data = response.json()
time_series_key = 'Time Series (60min)'
if time_series_key not in data:
raise ValueError(f"Error fetching data from Alpha Vantage: {data}")
df = pd.DataFrame(data[time_series_key]).T
df.columns = ['open', 'high', 'low', 'close', 'volume']
df.index = pd.to_datetime(df.index)
return df.reset_index().rename(columns={'index': 'timestamp'})
def fetch_yahoo_finance_data(pair):
url = f"https://yfapi.net/v8/finance/chart/{pair}?interval=60m"
headers = {'x-api-key': YAHOO_FINANCE_API_KEY}
response = requests.get(url, headers=headers)
data = response.json()
timestamps = data['chart']['result'][0]['timestamp']
ohlc = data['chart']['result'][0]['indicators']['quote'][0]
df = pd.DataFrame({
'timestamp': pd.to_datetime(timestamps, unit='s'),
'open': ohlc['open'],
'high': ohlc['high'],
'low': ohlc['low'],
'close': ohlc['close'],
'volume': ohlc['volume']
})
return df
def fetch_trading_view_data(pair):
# Placeholder for TradingView API data fetching
raise NotImplementedError("TradingView API integration not implemented.")
def fetch_binomo_data(pair):
# Placeholder for Binomo API data fetching
raise NotImplementedError("Binomo API integration not implemented.")
def get_combined_data(pair):
df_binance = fetch_binance_data(pair)
df_alpha = fetch_alpha_vantage_data(pair)
df_yahoo = fetch_yahoo_finance_data(pair)
# Merge dataframes on timestamp
df = pd.merge(df_binance, df_alpha, on='timestamp', suffixes=('_binance', '_alpha'))
df = pd.merge(df, df_yahoo, on='timestamp', suffixes=('', '_yahoo'))
# Drop any redundant columns or handle conflicts
return df
def preprocess_data(df):
df = df.dropna()
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df[['open', 'high', 'low', 'close', 'volume']])
return scaled_data, scaler
def create_dataset(data, time_step=60):
X, Y = [], []
for i in range(len(data) - time_step - 1):
a = data[i:(i + time_step), :]
X.append(a)
Y.append(data[i + time_step, 3]) # Assuming 'close' price is the target
return np.array(X), np.array(Y)
def build_model(input_shape):
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=input_shape))
model.add(LSTM(50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(25))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')
return model
def train_model(df):
data, scaler = preprocess_data(df)
X, Y = create_dataset(data)
X_train, Y_train = X[:int(len(X) * 0.8)], Y[:int(len(Y) * 0.8)]
X_val, Y_val = X[int(len(X) * 0.8):], Y[int(len(Y) * 0.8):]
model = build_model((X_train.shape[1], X_train.shape[2]))
model.fit(X_train, Y_train, validation_data=(X_val, Y_val), epochs=20, batch_size=32)
return model, scaler
def generate_signal(pair):
df = get_combined_data(pair)
model, scaler = train_model(df)
recent_data = df.tail(60).drop(columns=['timestamp'])
scaled_recent_data = scaler.transform(recent_data)
prediction = model.predict(np.expand_dims(scaled_recent_data, axis=0))
last_close = df['close'].iloc[-1]
if prediction > last_close:
return "Buy"
else:
return "Sell"
def start(update, context):
context.bot.send_message(chat_id=update.effective_chat.id, text="I'm a trading bot, how can I help you today?")
def signal(update, context):
pair = context.args[0] if context.args else 'BTCUSDT'
try:
trade_signal = generate_signal(pair)
context.bot.send_message(chat_id=update.effective_chat.id, text=f"Trade Signal for {pair}: {trade_signal}")
except Exception as e:
context.bot.send_message(chat_id=update.effective_chat.id, text=f"Error: {e}")
def main():
updater = Updater(token=TELEGRAM_BOT_API_KEY, use_context=True)
dispatcher = updater.dispatcher
start_handler = CommandHandler('start', start)
signal_handler = CommandHandler('signal', signal)
dispatcher.add_handler(start_handler)
dispatcher.add_handler(signal_handler)
updater.start_polling()
if __name__ == '__main__':
main()