daafa999 commited on
Commit
c7ca078
·
verified ·
1 Parent(s): 30c3765

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +97 -49
app.py CHANGED
@@ -1,7 +1,7 @@
1
  import os
2
  import time
3
- import traceback
4
  import logging
 
5
  from datetime import datetime
6
 
7
  import gradio as gr
@@ -38,10 +38,12 @@ SYMBOLS = [
38
  WINDOW = 20
39
 
40
  MODEL_DIR = "models"
 
 
41
 
42
  os.makedirs(MODEL_DIR, exist_ok=True)
43
-
44
- # TELEGRAM
45
 
46
  BOT_TOKEN = "YOUR_BOT_TOKEN"
47
  CHAT_ID = "YOUR_CHAT_ID"
@@ -58,26 +60,35 @@ logger = logging.getLogger("crypto_ai")
58
 
59
  # ============================================================
60
 
61
- # PATH
62
 
63
  # ============================================================
64
 
65
  def model_path(symbol):
66
 
67
 
68
- return os.path.join(
69
- MODEL_DIR,
70
- f"{symbol}_model.pkl"
71
- )
72
 
73
 
74
  def scaler_path(symbol):
75
 
76
 
77
- return os.path.join(
78
- MODEL_DIR,
79
- f"{symbol}_scaler.pkl"
80
- )
 
 
 
 
 
 
 
 
 
81
 
82
 
83
  # ============================================================
@@ -109,6 +120,7 @@ try:
109
  )
110
 
111
  except Exception as e:
 
112
  logger.warning(e)
113
 
114
 
@@ -122,9 +134,15 @@ def clean_columns(df):
122
 
123
 
124
  if isinstance(df.columns, pd.MultiIndex):
125
- df.columns = df.columns.get_level_values(0)
126
 
127
- df.columns = [str(c).lower() for c in df.columns]
 
 
 
 
 
 
 
128
 
129
  return df
130
 
@@ -147,6 +165,8 @@ try:
147
 
148
  df = clean_columns(df)
149
 
 
 
150
  return df, True
151
 
152
  except Exception as e:
@@ -168,7 +188,10 @@ def fetch_and_prepare(symbol):
168
  df, is_real = safe_download(symbol)
169
 
170
  if df is None:
171
- return None, None, None, False
 
 
 
172
 
173
  df = df.resample("4h").agg({
174
  "open": "first",
@@ -200,10 +223,20 @@ df["rsi"] = (
200
 
201
  # MACD
202
 
203
- ema12 = df["close"].ewm(span=12).mean()
204
- ema26 = df["close"].ewm(span=26).mean()
 
 
 
 
 
 
 
 
 
205
 
206
  df["macd"] = ema12 - ema26
 
207
  df["macd_signal"] = (
208
  df["macd"]
209
  .ewm(span=9)
@@ -285,18 +318,6 @@ adx = ADXIndicator(
285
 
286
  df["adx"] = adx.adx()
287
 
288
- # TREND STRENGTH
289
-
290
- df["trend_strength"] = (
291
- abs(
292
- df["ema50"]
293
- -
294
- df["ema200"]
295
- )
296
- /
297
- df["close"]
298
- )
299
-
300
  # VOLATILITY
301
 
302
  df["volatility"] = (
@@ -306,14 +327,16 @@ df["volatility"] = (
306
  .std()
307
  )
308
 
309
- # MARKET REGIME
310
 
311
  def detect_regime(row):
312
 
313
  if row["volatility"] < 0.01:
 
314
  return "SIDEWAYS"
315
 
316
  if row["ema50"] > row["ema200"]:
 
317
  return "BULL"
318
 
319
  return "BEAR"
@@ -372,7 +395,6 @@ feat_cols = [
372
  "bb_lower",
373
  "atr",
374
  "adx",
375
- "trend_strength",
376
  "return1",
377
  "return4"
378
  ]
@@ -386,6 +408,10 @@ for i in range(WINDOW, len(df)):
386
  i-WINDOW:i
387
  ][feat_cols].values
388
 
 
 
 
 
389
  X_list.append(
390
  window.flatten()
391
  )
@@ -397,7 +423,7 @@ for i in range(WINDOW, len(df)):
397
  X = np.array(X_list)
398
  y = np.array(y_list)
399
 
400
- return X, y, df, feat_cols, is_real
401
 
402
 
403
  # ============================================================
@@ -409,11 +435,12 @@ return X, y, df, feat_cols, is_real
409
  def run_train(symbol):
410
 
411
 
412
- X, y, df, feat_cols, is_real = (
413
  fetch_and_prepare(symbol)
414
  )
415
 
416
  if X is None:
 
417
  return
418
 
419
  scaler = MinMaxScaler()
@@ -490,9 +517,13 @@ def trade_levels(df, signal):
490
 
491
  last = df.iloc[-1]
492
 
493
- close_price = float(last["close"])
 
 
494
 
495
- atr = float(last["atr"])
 
 
496
 
497
  if signal == "BUY":
498
 
@@ -512,7 +543,10 @@ elif signal == "SELL":
512
 
513
  else:
514
 
515
- tp1 = tp2 = tp3 = sl = close_price
 
 
 
516
 
517
  return {
518
  "entry": close_price,
@@ -540,7 +574,7 @@ if not os.path.exists(
540
 
541
  run_train(symbol)
542
 
543
- X, y, df, feat_cols, is_real = (
544
  fetch_and_prepare(symbol)
545
  )
546
 
@@ -571,9 +605,10 @@ proba = model.predict_proba(
571
  latest_scaled
572
  )[0]
573
 
574
- confidence = float(
575
- np.max(proba)
576
- ) * 100
 
577
 
578
  last = df.iloc[-1]
579
 
@@ -583,12 +618,6 @@ bull_trend = (
583
  last["ema200"]
584
  )
585
 
586
- bear_trend = (
587
- last["ema50"]
588
- <
589
- last["ema200"]
590
- )
591
-
592
  strong_volume = (
593
  last["volume"]
594
  >
@@ -639,6 +668,23 @@ levels = trade_levels(
639
  signal
640
  )
641
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
642
  # TELEGRAM
643
 
644
  previous = LAST_SIGNALS.get(symbol)
@@ -680,7 +726,7 @@ return {
680
 
681
  # ============================================================
682
 
683
- # SCAN ALL
684
 
685
  # ============================================================
686
 
@@ -693,7 +739,7 @@ global LAST_RETRAIN
693
 
694
  now = time.time()
695
 
696
- # AUTO RETRAIN
697
 
698
  if now - LAST_RETRAIN > 21600:
699
 
@@ -717,7 +763,9 @@ for symbol in SYMBOLS:
717
 
718
  except Exception as e:
719
 
720
- logger.error(traceback.format_exc())
 
 
721
 
722
  df = pd.DataFrame(rows)
723
 
 
1
  import os
2
  import time
 
3
  import logging
4
+ import traceback
5
  from datetime import datetime
6
 
7
  import gradio as gr
 
38
  WINDOW = 20
39
 
40
  MODEL_DIR = "models"
41
+ DATA_DIR = "data"
42
+ LOG_DIR = "logs"
43
 
44
  os.makedirs(MODEL_DIR, exist_ok=True)
45
+ os.makedirs(DATA_DIR, exist_ok=True)
46
+ os.makedirs(LOG_DIR, exist_ok=True)
47
 
48
  BOT_TOKEN = "YOUR_BOT_TOKEN"
49
  CHAT_ID = "YOUR_CHAT_ID"
 
60
 
61
  # ============================================================
62
 
63
+ # PATHS
64
 
65
  # ============================================================
66
 
67
  def model_path(symbol):
68
 
69
 
70
+ return os.path.join(
71
+ MODEL_DIR,
72
+ f"{symbol}_model.pkl"
73
+ )
74
 
75
 
76
  def scaler_path(symbol):
77
 
78
 
79
+ return os.path.join(
80
+ MODEL_DIR,
81
+ f"{symbol}_scaler.pkl"
82
+ )
83
+
84
+
85
+ def data_path(symbol):
86
+
87
+
88
+ return os.path.join(
89
+ DATA_DIR,
90
+ f"{symbol}.csv"
91
+ )
92
 
93
 
94
  # ============================================================
 
120
  )
121
 
122
  except Exception as e:
123
+
124
  logger.warning(e)
125
 
126
 
 
134
 
135
 
136
  if isinstance(df.columns, pd.MultiIndex):
 
137
 
138
+ df.columns = (
139
+ df.columns.get_level_values(0)
140
+ )
141
+
142
+ df.columns = [
143
+ str(c).lower()
144
+ for c in df.columns
145
+ ]
146
 
147
  return df
148
 
 
165
 
166
  df = clean_columns(df)
167
 
168
+ df.to_csv(data_path(symbol))
169
+
170
  return df, True
171
 
172
  except Exception as e:
 
188
  df, is_real = safe_download(symbol)
189
 
190
  if df is None:
191
+
192
+ return None, None, None, None
193
+
194
+ df.index = pd.to_datetime(df.index)
195
 
196
  df = df.resample("4h").agg({
197
  "open": "first",
 
223
 
224
  # MACD
225
 
226
+ ema12 = (
227
+ df["close"]
228
+ .ewm(span=12)
229
+ .mean()
230
+ )
231
+
232
+ ema26 = (
233
+ df["close"]
234
+ .ewm(span=26)
235
+ .mean()
236
+ )
237
 
238
  df["macd"] = ema12 - ema26
239
+
240
  df["macd_signal"] = (
241
  df["macd"]
242
  .ewm(span=9)
 
318
 
319
  df["adx"] = adx.adx()
320
 
 
 
 
 
 
 
 
 
 
 
 
 
321
  # VOLATILITY
322
 
323
  df["volatility"] = (
 
327
  .std()
328
  )
329
 
330
+ # REGIME
331
 
332
  def detect_regime(row):
333
 
334
  if row["volatility"] < 0.01:
335
+
336
  return "SIDEWAYS"
337
 
338
  if row["ema50"] > row["ema200"]:
339
+
340
  return "BULL"
341
 
342
  return "BEAR"
 
395
  "bb_lower",
396
  "atr",
397
  "adx",
 
398
  "return1",
399
  "return4"
400
  ]
 
408
  i-WINDOW:i
409
  ][feat_cols].values
410
 
411
+ if np.isnan(window).any():
412
+
413
+ continue
414
+
415
  X_list.append(
416
  window.flatten()
417
  )
 
423
  X = np.array(X_list)
424
  y = np.array(y_list)
425
 
426
+ return X, y, df, feat_cols
427
 
428
 
429
  # ============================================================
 
435
  def run_train(symbol):
436
 
437
 
438
+ X, y, df, feat_cols = (
439
  fetch_and_prepare(symbol)
440
  )
441
 
442
  if X is None:
443
+
444
  return
445
 
446
  scaler = MinMaxScaler()
 
517
 
518
  last = df.iloc[-1]
519
 
520
+ close_price = float(
521
+ last["close"]
522
+ )
523
 
524
+ atr = float(
525
+ last["atr"]
526
+ )
527
 
528
  if signal == "BUY":
529
 
 
543
 
544
  else:
545
 
546
+ tp1 = close_price
547
+ tp2 = close_price
548
+ tp3 = close_price
549
+ sl = close_price
550
 
551
  return {
552
  "entry": close_price,
 
574
 
575
  run_train(symbol)
576
 
577
+ X, y, df, feat_cols = (
578
  fetch_and_prepare(symbol)
579
  )
580
 
 
605
  latest_scaled
606
  )[0]
607
 
608
+ confidence = (
609
+ float(np.max(proba))
610
+ * 100
611
+ )
612
 
613
  last = df.iloc[-1]
614
 
 
618
  last["ema200"]
619
  )
620
 
 
 
 
 
 
 
621
  strong_volume = (
622
  last["volume"]
623
  >
 
668
  signal
669
  )
670
 
671
+ # LOG
672
+
673
+ with open(
674
+ os.path.join(
675
+ LOG_DIR,
676
+ "signals.log"
677
+ ),
678
+ "a"
679
+ ) as f:
680
+
681
+ f.write(
682
+ f"{datetime.utcnow()} | "
683
+ f"{symbol} | "
684
+ f"{signal} | "
685
+ f"{confidence:.2f}\n"
686
+ )
687
+
688
  # TELEGRAM
689
 
690
  previous = LAST_SIGNALS.get(symbol)
 
726
 
727
  # ============================================================
728
 
729
+ # REALTIME SCAN
730
 
731
  # ============================================================
732
 
 
739
 
740
  now = time.time()
741
 
742
+ # AUTO RETRAIN 6 JAM
743
 
744
  if now - LAST_RETRAIN > 21600:
745
 
 
763
 
764
  except Exception as e:
765
 
766
+ logger.error(
767
+ traceback.format_exc()
768
+ )
769
 
770
  df = pd.DataFrame(rows)
771