developersajidbashir commited on
Commit
0aad598
·
verified ·
1 Parent(s): 7becd3c

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +145 -0
app.py ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gym
2
+ import numpy as np
3
+ import matplotlib.pyplot as plt
4
+ import requests
5
+ import pandas as pd
6
+ from datetime import datetime, timedelta
7
+ from stable_baselines3 import PPO
8
+ from stable_baselines3.common.vec_env import DummyVecEnv
9
+ from gym import spaces
10
+ import time
11
+ import firebase_admin
12
+ from firebase_admin import credentials, db
13
+ import os
14
+
15
+ cred = credentials.Certificate("credentials.json")
16
+ firebase_admin.initialize_app(cred, {"databaseURL": "https://socail-swap-default-rtdb.asia-southeast1.firebasedatabase.app/"})
17
+ ref = db.reference()
18
+ stopmodel = False
19
+ buy_signals = []
20
+ sell_signals = []
21
+
22
+ class TradingEnv(gym.Env):
23
+ def __init__(self, data, window_size=50):
24
+ super(TradingEnv, self).__init__()
25
+ self.data = data
26
+ self.window_size = window_size
27
+ self.current_step = window_size
28
+ self.action_space = spaces.Discrete(3)
29
+ self.observation_space = spaces.Box(
30
+ low=0, high=1, shape=(window_size, 2), dtype=np.float32)
31
+
32
+ def reset(self):
33
+ self.current_step = self.window_size
34
+ return self._get_observation()
35
+
36
+ def _get_observation(self):
37
+ window_data = self.data[self.current_step-self.window_size:self.current_step]
38
+ obs = window_data[['Close', 'EMA']].values
39
+ obs = (obs - obs.min()) / (obs.max() - obs.min())
40
+ return obs
41
+
42
+ def step(self, action):
43
+ reward = 0
44
+ done = False
45
+ self.current_step += 1
46
+
47
+ if self.current_step >= len(self.data):
48
+ done = True
49
+ else:
50
+ if action == 1:
51
+ reward = self.data['Close'].iloc[self.current_step] - self.data['Close'].iloc[self.current_step - 1]
52
+ elif action == 2:
53
+ reward = self.data['Close'].iloc[self.current_step - 1] - self.data['Close'].iloc[self.current_step]
54
+
55
+ return self._get_observation(), reward, done, {}
56
+
57
+ def fetch_data(symbol='ETHUSDT', interval='1h', start_date='2021-01-01'):
58
+ end_date = datetime.utcnow()
59
+ start_date = datetime.strptime(start_date, '%Y-%m-%d')
60
+ klines = []
61
+
62
+ while start_date < end_date:
63
+ url = f'https://api.binance.com/api/v3/klines?symbol={symbol}&interval={interval}&startTime={int(start_date.timestamp() * 1000)}'
64
+ response = requests.get(url)
65
+ data = response.json()
66
+ if not data:
67
+ break
68
+ klines += data
69
+ start_date = datetime.utcfromtimestamp(data[-1][6] / 1000)
70
+
71
+ df = pd.DataFrame(klines, 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'])
72
+ df['Close'] = df['Close'].astype(float)
73
+ df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
74
+ df.set_index('timestamp', inplace=True)
75
+ return df[['Close']]
76
+
77
+ def calculate_ema(data, span=20):
78
+ data['EMA'] = data['Close'].ewm(span=span, adjust=False).mean()
79
+ return data
80
+
81
+ def run_model():
82
+ while True:
83
+ try:
84
+ new_data = fetch_data(start_date=(datetime.utcnow() - timedelta(days=3)).strftime('%Y-%m-%d'))
85
+ new_data = calculate_ema(new_data)
86
+
87
+ if len(new_data) < 50:
88
+ print("Not enough data to update the environment.")
89
+ time.sleep(3600)
90
+ continue
91
+
92
+ env = DummyVecEnv([lambda: TradingEnv(new_data)])
93
+ model.set_env(env)
94
+
95
+ obs = env.reset()
96
+ dates = new_data.index[50:]
97
+ prices = new_data['Close'][50:]
98
+ emas = new_data['EMA'][50:]
99
+ actions = []
100
+
101
+ for date, price, ema in zip(dates, prices, emas):
102
+ action, _ = model.predict(obs)
103
+ actions.append(action[0])
104
+ obs, _, done, _ = env.step(action)
105
+ if done:
106
+ break
107
+
108
+ new_buy_signals = [(date, price, ema) for date, price, ema, action in zip(dates, prices, emas, actions) if action == 1 and date not in [signal[0] for signal in buy_signals]]
109
+ new_sell_signals = [(date, price, ema) for date, price, ema, action in zip(dates, prices, emas, actions) if action == 2 and date not in [signal[0] for signal in sell_signals]]
110
+
111
+ for signal in new_buy_signals:
112
+ if signal[0] not in [s[0] for s in buy_signals] and signal[0] not in [s[0] for s in sell_signals]:
113
+ buy_signals.append(signal)
114
+
115
+
116
+ for signal in new_sell_signals:
117
+ if signal[0] not in [s[0] for s in sell_signals] and signal[0] not in [s[0] for s in buy_signals]:
118
+ sell_signals.append(signal)
119
+
120
+ buy_signals_data = [{'timestamp': signal[0].strftime('%Y-%m-%d %H:%M:%S'), 'type': 'b', 'price': round(signal[1], 2), 'ema': round(signal[2],2)} for signal in buy_signals]
121
+ sell_signals_data = [{'timestamp': signal[0].strftime('%Y-%m-%d %H:%M:%S'), 'type': 's', 'price': round(signal[1], 2), 'ema': round(signal[2],2)} for signal in sell_signals]
122
+
123
+ all_signals_data = buy_signals_data + sell_signals_data
124
+
125
+ ref.child('signals').child('data').set(all_signals_data)
126
+ time.sleep(3600)
127
+ except Exception as e:
128
+ print(f"An error occurred: {e}")
129
+ break
130
+
131
+ if __name__ == "__main__":
132
+ data = fetch_data()
133
+ data = calculate_ema(data)
134
+ if len(data) < 50:
135
+ raise ValueError("Not enough data to fill the window size.")
136
+
137
+ env = DummyVecEnv([lambda: TradingEnv(data)])
138
+
139
+ if os.path.exists("./ppo_trading_agent.zip"):
140
+ model = PPO.load("ppo_trading_agent", env=env)
141
+ else:
142
+ model = PPO('MlpPolicy', env, verbose=1)
143
+ model.learn(total_timesteps=10000)
144
+ print("Ender function")
145
+ run_model()