File size: 5,745 Bytes
4eee85d
 
ba5c7ef
 
 
 
4eee85d
ba5c7ef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
---
license: mit
language:
- en
library_name: transformers
pipeline_tag: depth-estimation
---
# config.py
BINANCE_API_KEY = 'your_binance_api_key'
ALPHA_VANTAGE_API_KEY = 'your_alpha_vantage_api_key'
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 = 'your_telegram_bot_api_key'

# 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()