File size: 3,882 Bytes
7a7a869
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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',
    }

    model = xgb.train(params, dtrain)
    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)
    next_hour_price = model.predict(dtest)
    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, leverage):
    order = exchange.create_market_order(symbol, side, amount)

    # Set leverage for the order
    if leverage is not None and leverage != 1:
        position = exchange.fetch_position(symbol)
        if position is not None:
            current_leverage = position['info']['leverage']
            if current_leverage != leverage:
                # Update leverage for the position
                exchange.set_leverage(leverage, symbol)

    return order

symbol = 'BTC/USDT'
timeframe = '1h'
limit = 100
lags = 12
test_size = 0.3
leverage = 5

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)

# Replace missing values with the mean of the column
X = X.fillna(X.mean())
y = y.fillna(y.mean())

#X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size)

#model, scaler = train_xgboost_model(X_train, y_train)

#y_pred = model.predict(X_test)

# Inverse transform the predicted values to get the original scale
#y_pred = scaler.inverse_transform(y_pred.reshape(-1, 1))

#accuracy = evaluate_prediction_accuracy(y_test, y_pred)

#X, y = prepare_dataset(df, lags)
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)
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)
    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, leverage)
        print(f"Bought {amount} BTC at {current_price} with {leverage}x leverage")
    elif predicted_price < current_price:
        # Sell BTC
        amount = 0.001  # Set the amount you want to trade
        order = execute_trade(exchange, symbol, 'sell', amount, leverage)
        print(f"Sold {amount} BTC at {current_price} with {leverage}x leverage")
else:
    print("Accuracy is low, not placing order.")