Mrlongpro commited on
Commit
6de6d01
·
verified ·
1 Parent(s): b87bc46

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +63 -41
app.py CHANGED
@@ -3,69 +3,91 @@ import time
3
  import pandas as pd
4
  import gradio as gr
5
  from fastapi import FastAPI
 
6
 
7
- # ===== FASTAPI BACKEND =====
8
  app = FastAPI()
9
 
10
  URL = "https://histdatafeed.vps.com.vn/tradingview/history"
11
 
12
- def get_data():
13
- params = {
14
- "symbol": "VN30F1M",
15
- "resolution": "1",
16
- "from": int(time.time()) - 3600,
17
- "to": int(time.time()),
18
- "countback": 200
19
- }
20
- res = requests.get(URL, params=params)
21
- data = res.json()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
- df = pd.DataFrame({
24
- "time": data["t"],
25
- "open": data["o"],
26
- "high": data["h"],
27
- "low": data["l"],
28
- "close": data["c"],
29
- "volume": data["v"]
30
- })
31
 
32
- return df
 
 
33
 
34
- def generate_signal(df):
 
 
 
35
  df["ma20"] = df["close"].rolling(20).mean()
36
 
37
  if df["close"].iloc[-1] > df["ma20"].iloc[-1]:
38
- return "BUY"
39
  else:
40
- return "SELL"
 
 
 
 
 
 
 
 
 
 
41
 
42
- # ===== API CHO MT5 =====
43
  @app.get("/signal")
44
  def signal():
45
- df = get_data()
46
- sig = generate_signal(df)
47
-
48
  return {
49
- "signal": sig,
50
- "price": float(df["close"].iloc[-1]),
51
- "time": int(df["time"].iloc[-1])
52
  }
53
 
54
- # ===== GRADIO UI =====
55
- def ui_signal():
56
- df = get_data()
57
- sig = generate_signal(df)
58
- price = df["close"].iloc[-1]
59
-
60
- return f"Signal: {sig} | Price: {price}"
61
 
62
  interface = gr.Interface(
63
- fn=ui_signal,
64
  inputs=[],
65
  outputs="text",
66
- title="VN30F1M AI Signal",
67
  live=True
68
- )
69
 
70
- # ===== COMBINE =====
71
  app = gr.mount_gradio_app(app, interface, path="/")
 
3
  import pandas as pd
4
  import gradio as gr
5
  from fastapi import FastAPI
6
+ import threading
7
 
 
8
  app = FastAPI()
9
 
10
  URL = "https://histdatafeed.vps.com.vn/tradingview/history"
11
 
12
+ # ===== CACHE GLOBAL =====
13
+ latest_data = None
14
+ latest_signal = None
15
+ last_update = 0
16
+
17
+ # ===== FETCH DATA =====
18
+ def fetch_data():
19
+ global latest_data, last_update
20
+
21
+ try:
22
+ params = {
23
+ "symbol": "VN30F1M",
24
+ "resolution": "1",
25
+ "from": int(time.time()) - 3600,
26
+ "to": int(time.time()),
27
+ "countback": 200
28
+ }
29
+
30
+ res = requests.get(URL, params=params, timeout=5)
31
+ data = res.json()
32
+
33
+ df = pd.DataFrame({
34
+ "time": data["t"],
35
+ "open": data["o"],
36
+ "high": data["h"],
37
+ "low": data["l"],
38
+ "close": data["c"],
39
+ "volume": data["v"]
40
+ })
41
+
42
+ latest_data = df
43
+ last_update = time.time()
44
 
45
+ except Exception as e:
46
+ print("Fetch error:", e)
 
 
 
 
 
 
47
 
48
+ # ===== AI SIGNAL =====
49
+ def compute_signal():
50
+ global latest_data, latest_signal
51
 
52
+ if latest_data is None or len(latest_data) < 20:
53
+ return "WAIT"
54
+
55
+ df = latest_data.copy()
56
  df["ma20"] = df["close"].rolling(20).mean()
57
 
58
  if df["close"].iloc[-1] > df["ma20"].iloc[-1]:
59
+ latest_signal = "BUY"
60
  else:
61
+ latest_signal = "SELL"
62
+
63
+ # ===== HEARTBEAT LOOP =====
64
+ def heartbeat():
65
+ while True:
66
+ fetch_data()
67
+ compute_signal()
68
+ print("Heartbeat update:", latest_signal)
69
+ time.sleep(10) # 10s update
70
+
71
+ threading.Thread(target=heartbeat, daemon=True).start()
72
 
73
+ # ===== API =====
74
  @app.get("/signal")
75
  def signal():
 
 
 
76
  return {
77
+ "signal": latest_signal,
78
+ "price": float(latest_data["close"].iloc[-1]) if latest_data is not None else 0,
79
+ "time": int(last_update)
80
  }
81
 
82
+ # ===== UI =====
83
+ def ui():
84
+ return f"Signal: {latest_signal} | Updated: {int(last_update)}"
 
 
 
 
85
 
86
  interface = gr.Interface(
87
+ fn=ui,
88
  inputs=[],
89
  outputs="text",
 
90
  live=True
91
+ ).queue()
92
 
 
93
  app = gr.mount_gradio_app(app, interface, path="/")