import ccxt import pandas as pd import streamlit as st import xgboost as xgb from sklearn.metrics import r2_score from sklearn.model_selection import train_test_split exchange = ccxt.mexc({ 'apiKey': 'mx0vglbkoCOwmqV5tn', 'secret': 'c6d8cc8953fd405787ed54e3488ae0db', 'enableRateLimit': True, }) def fetch_ohlcv_data(symbol, timeframe, limit): return exchange.fetch_ohlcv(symbol, timeframe, since=None, limit=limit) def data_to_dataframe(data): df = pd.DataFrame(data, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']) df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms') df.set_index('timestamp', inplace=True) return df def prepare_dataset(df, lags): X = pd.DataFrame() y = pd.DataFrame() for lag in range(1, lags + 1): shifted_close = df['close'].shift(lag) X[f'close_lag_{lag}'] = shifted_close y = df['close'].shift(-1) return X, y def train_xgboost_model(X_train, y_train): dtrain = xgb.DMatrix(X_train, label=y_train) params = { 'objective': 'reg:squarederror', 'eval_metric': 'rmse', } try: model = xgb.train(params, dtrain) except xgb.core.XGBoostError as e: print(f"Error training XGBoost model: {e}") return None return model def predict_next_hour_price(df, model, lags): X_test = pd.DataFrame() for lag in range(1, lags + 1): shifted_close = df['close'].shift(lag) X_test[f'close_lag_{lag}'] = shifted_close X_test = X_test.tail(1) dtest = xgb.DMatrix(X_test) try: next_hour_price = model.predict(dtest) except xgb.core.XGBoostError as e: print(f"Error making prediction with XGBoost model: {e}") return None return next_hour_price def evaluate_prediction_accuracy(y_test, y_pred): accuracy = r2_score(y_test, y_pred) return accuracy def execute_trade(exchange, symbol, side, amount): order = exchange.create_market_order(symbol, side, amount) return order symbol = 'BTC/USDT' timeframe = '1h' limit = 100 lags = 12 test_size = 0.3 ohlcv_data = fetch_ohlcv_data(symbol, timeframe, limit) df = data_to_dataframe(ohlcv_data) if st.button("hoo"): st.write(df) X, y = prepare_dataset(df, lags) if X.isnull().values.any() or y.isnull().values.any(): print("Error: Null values found in X or y") else: X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size) model = train_xgboost_model(X_train, y_train) if model is None: print("Error: XGBoost model could not be trained") else: y_pred = model.predict(X_test) accuracy = evaluate_prediction_accuracy(y_test, y_pred) if accuracy > 0.9: latest_data = df.tail(lags) predicted_price = predict_next_hour_price(latest_data, model, lags) if predicted_price is None: print("Error: XGBoost model could not make prediction") else: current_price = latest_data['close'].iloc[-1] if predicted_price > current_price: # Buy BTC amount = 0.001 # Set the amount you want to trade order = execute_trade(exchange, symbol, 'buy', amount) print(f"Bought {amount} BTC at {current_price}") elif predicted_price < current_price: # Sell BTC amount = 0.001 # Set the amount you want to trade order = execute_trade(exchange, symbol, 'sell', amount) print(f"Sold {amount} BTC at {current_price}") else: print("Accuracy is low, not placing order.")