Update app.py
Browse files
app.py
CHANGED
|
@@ -321,7 +321,10 @@ def calculate_cci(df, window=20):
|
|
| 321 |
cci = (typical_price - sma) / (0.015 * mean_deviation)
|
| 322 |
return cci
|
| 323 |
|
| 324 |
-
|
|
|
|
|
|
|
|
|
|
| 325 |
# Calculate various indicators
|
| 326 |
df['SMA_30'] = calculate_sma(df, 30)
|
| 327 |
df['SMA_100'] = calculate_sma(df, 100)
|
|
@@ -333,34 +336,44 @@ def generate_trading_signals(df):
|
|
| 333 |
df['CMF'] = calculate_cmf(df)
|
| 334 |
df['CCI'] = calculate_cci(df)
|
| 335 |
|
| 336 |
-
#
|
| 337 |
-
df['SMA_Signal'] = np.where(df['SMA_30'] > df['SMA_100']
|
|
|
|
| 338 |
|
| 339 |
macd, signal = calculate_macd(df)
|
| 340 |
-
df['MACD_Signal'] = np.select([(macd > signal) & (macd.shift(1) <= signal.shift(1)),
|
| 341 |
-
(macd < signal) & (macd.shift(1) >= signal.shift(1))],[1, -1], default=0)
|
| 342 |
-
|
| 343 |
-
df['RSI_Signal'] = np.where(df['RSI'] < 25, 1, 0)
|
| 344 |
-
df['RSI_Signal'] = np.where(df['RSI'] > 90, -1, df['RSI_Signal'])
|
| 345 |
|
| 346 |
-
|
| 347 |
-
df['
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 348 |
|
| 349 |
-
|
|
|
|
| 350 |
df['Stochastic_Signal'] = np.where((df['SlowK'] > 95) & (df['SlowD'] > 95), -1, df['Stochastic_Signal'])
|
| 351 |
|
| 352 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 353 |
|
| 354 |
-
df['CCI_Signal'] = np.where(df['CCI'] < -195, 1, 0)
|
| 355 |
-
df['CCI_Signal'] = np.where(df['CCI'] > 190, -1, df['CCI_Signal'])
|
| 356 |
-
|
| 357 |
-
# Combined signal for stronger buy/sell points
|
| 358 |
-
df['Combined_Signal'] = df[['RSI_Signal', 'BB_Signal',
|
| 359 |
-
'Stochastic_Signal', 'CMF_Signal',
|
| 360 |
-
'CCI_Signal']].sum(axis=1)
|
| 361 |
-
|
| 362 |
return df
|
| 363 |
|
|
|
|
| 364 |
def plot_combined_signals(df, ticker):
|
| 365 |
# Create a figure
|
| 366 |
fig = go.Figure()
|
|
@@ -451,11 +464,11 @@ def plot_individual_signals(df, ticker):
|
|
| 451 |
|
| 452 |
|
| 453 |
signal_colors = {
|
| 454 |
-
'RSI_Signal': {'buy': '
|
| 455 |
-
'BB_Signal': {'buy': '
|
| 456 |
-
'Stochastic_Signal': {'buy': '
|
| 457 |
-
'CMF_Signal': {'buy': '
|
| 458 |
-
'CCI_Signal': {'buy': '
|
| 459 |
}
|
| 460 |
|
| 461 |
|
|
|
|
| 321 |
cci = (typical_price - sma) / (0.015 * mean_deviation)
|
| 322 |
return cci
|
| 323 |
|
| 324 |
+
import numpy as np
|
| 325 |
+
import pandas as pd
|
| 326 |
+
|
| 327 |
+
def generate_ultra_strict_signals(df):
|
| 328 |
# Calculate various indicators
|
| 329 |
df['SMA_30'] = calculate_sma(df, 30)
|
| 330 |
df['SMA_100'] = calculate_sma(df, 100)
|
|
|
|
| 336 |
df['CMF'] = calculate_cmf(df)
|
| 337 |
df['CCI'] = calculate_cci(df)
|
| 338 |
|
| 339 |
+
# Ultra-strict SMA Signal - Require at least 3% difference
|
| 340 |
+
df['SMA_Signal'] = np.where((df['SMA_30'] > df['SMA_100']) &
|
| 341 |
+
((df['SMA_30'] - df['SMA_100']) / df['SMA_100'] > 0.03), 1, 0)
|
| 342 |
|
| 343 |
macd, signal = calculate_macd(df)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 344 |
|
| 345 |
+
# Ultra-strict MACD Signal - Require a difference of at least 1.0
|
| 346 |
+
df['MACD_Signal'] = np.select([
|
| 347 |
+
(macd > signal) & (macd.shift(1) <= signal.shift(1)) & ((macd - signal) > 1.0),
|
| 348 |
+
(macd < signal) & (macd.shift(1) >= signal.shift(1)) & ((signal - macd) > 1.0)
|
| 349 |
+
], [1, -1], default=0)
|
| 350 |
+
|
| 351 |
+
# Ultra-strict RSI Signal - Extreme thresholds
|
| 352 |
+
df['RSI_Signal'] = np.where(df['RSI'] < 15, 1, 0)
|
| 353 |
+
df['RSI_Signal'] = np.where(df['RSI'] > 85, -1, df['RSI_Signal'])
|
| 354 |
+
|
| 355 |
+
# Ultra-strict Bollinger Bands Signal - Require extreme deviations
|
| 356 |
+
df['BB_Signal'] = np.where(df['Close'] < df['LowerBB'] * 0.97, 1, 0)
|
| 357 |
+
df['BB_Signal'] = np.where(df['Close'] > df['UpperBB'] * 1.03, -1, df['BB_Signal'])
|
| 358 |
|
| 359 |
+
# Ultra-strict Stochastic Signal - Extreme overbought/oversold conditions
|
| 360 |
+
df['Stochastic_Signal'] = np.where((df['SlowK'] < 5) & (df['SlowD'] < 5), 1, 0)
|
| 361 |
df['Stochastic_Signal'] = np.where((df['SlowK'] > 95) & (df['SlowD'] > 95), -1, df['Stochastic_Signal'])
|
| 362 |
|
| 363 |
+
# Ultra-strict CMF Signal - Require stronger money flow confirmation
|
| 364 |
+
df['CMF_Signal'] = np.where(df['CMF'] > 0.5, -1, np.where(df['CMF'] < -0.5, 1, 0))
|
| 365 |
+
|
| 366 |
+
# Ultra-strict CCI Signal - Require extreme deviations
|
| 367 |
+
df['CCI_Signal'] = np.where(df['CCI'] < -250, 1, 0)
|
| 368 |
+
df['CCI_Signal'] = np.where(df['CCI'] > 250, -1, df['CCI_Signal'])
|
| 369 |
+
|
| 370 |
+
# Combined signal for ultra-strict confirmations
|
| 371 |
+
df['Combined_Signal'] = df[['MACD_Signal', 'RSI_Signal', 'BB_Signal',
|
| 372 |
+
'Stochastic_Signal', 'CMF_Signal', 'CCI_Signal']].sum(axis=1)
|
| 373 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 374 |
return df
|
| 375 |
|
| 376 |
+
|
| 377 |
def plot_combined_signals(df, ticker):
|
| 378 |
# Create a figure
|
| 379 |
fig = go.Figure()
|
|
|
|
| 464 |
|
| 465 |
|
| 466 |
signal_colors = {
|
| 467 |
+
'RSI_Signal': {'buy': 'violet', 'sell': 'lightpink'}, # Light purple / Pale butter
|
| 468 |
+
'BB_Signal': {'buy': 'violet', 'sell': 'lightpink'}, # Purple / Chiffon yellow
|
| 469 |
+
'Stochastic_Signal': {'buy': 'violet', 'sell': 'lightpink'}, # Purple / Corn silk
|
| 470 |
+
'CMF_Signal': {'buy': 'violet', 'sell': 'lightpink'}, # Deep purple / Lemon chiffon
|
| 471 |
+
'CCI_Signal': {'buy': 'violet', 'sell': 'lightpink'} # Dark purple / Soft maize
|
| 472 |
}
|
| 473 |
|
| 474 |
|