Devendra21 commited on
Commit
17135bf
·
verified ·
1 Parent(s): 2882e78

Update utils/forex_signals.py

Browse files
Files changed (1) hide show
  1. utils/forex_signals.py +44 -27
utils/forex_signals.py CHANGED
@@ -1,65 +1,82 @@
 
1
  import pandas as pd
2
  import numpy as np
3
 
4
- # Define the function to calculate technical indicators
5
-
6
  def calculate_sma(data, window=14):
7
- """Calculate Simple Moving Average (SMA)"""
8
- return data['Close'].rolling(window=window).mean()
9
 
 
10
  def calculate_rsi(data, window=14):
11
- """Calculate Relative Strength Index (RSI)"""
12
- delta = data['Close'].diff()
13
  gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
14
  loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
15
  rs = gain / loss
16
  rsi = 100 - (100 / (1 + rs))
17
  return rsi
18
 
 
19
  def calculate_bollinger_bands(data, window=20, num_std_dev=2):
20
- """Calculate Bollinger Bands"""
21
- sma = calculate_sma(data, window)
22
- rolling_std = data['Close'].rolling(window=window).std()
23
  upper_band = sma + (rolling_std * num_std_dev)
24
  lower_band = sma - (rolling_std * num_std_dev)
25
  return upper_band, lower_band
26
 
27
- def generate_forex_signals(trading_capital, market_risk, user_timezone, additional_pairs=None):
28
- """Generate trading signals for the Forex market"""
29
- # Example: Fetch historical data for currency pairs (use your data source here)
30
- data = pd.read_csv('historical_forex_data.csv') # Replace with real data source
31
- signals = []
 
 
 
 
 
 
 
 
 
32
 
33
- # Generate signals for multiple pairs (additional_pairs can be used to loop through them)
34
- currency_pairs = additional_pairs if additional_pairs else ['EUR/USD', 'GBP/USD', 'USD/JPY', 'AUD/USD']
 
 
 
 
 
 
35
  for pair in currency_pairs:
36
- pair_data = data[data['Currency Pair'] == pair]
 
 
 
37
 
38
  # Calculate technical indicators
39
  sma = calculate_sma(pair_data)
40
  rsi = calculate_rsi(pair_data)
41
  upper_band, lower_band = calculate_bollinger_bands(pair_data)
42
 
43
- # Example signal generation logic (this can be customized)
44
  for i in range(len(pair_data)):
45
- if rsi[i] < 30 and pair_data['Close'][i] < lower_band[i]: # Buy signal
46
  signals.append({
47
  'currency_pair': pair,
48
- 'entry_time': pair_data['Date'][i],
49
- 'exit_time': pair_data['Date'][i] + pd.Timedelta(hours=2), # Example exit time
50
  'roi': np.random.uniform(0.1, 1), # Simulated ROI, adjust accordingly
51
  'signal_strength': np.random.uniform(50, 100) # Simulated signal strength
52
  })
53
- elif rsi[i] > 70 and pair_data['Close'][i] > upper_band[i]: # Sell signal
54
  signals.append({
55
  'currency_pair': pair,
56
- 'entry_time': pair_data['Date'][i],
57
- 'exit_time': pair_data['Date'][i] + pd.Timedelta(hours=2), # Example exit time
58
  'roi': np.random.uniform(0.1, 1), # Simulated ROI, adjust accordingly
59
  'signal_strength': np.random.uniform(50, 100) # Simulated signal strength
60
  })
61
-
62
- # Choose the best signal
63
- best_signal = max(signals, key=lambda x: x['roi']) if signals else {}
64
 
 
 
 
65
  return {"best_signal": best_signal, "all_signals": signals}
 
1
+ import requests
2
  import pandas as pd
3
  import numpy as np
4
 
5
+ # Function to calculate Simple Moving Average (SMA)
 
6
  def calculate_sma(data, window=14):
7
+ return data['close'].rolling(window=window).mean()
 
8
 
9
+ # Function to calculate Relative Strength Index (RSI)
10
  def calculate_rsi(data, window=14):
11
+ delta = data['close'].diff()
 
12
  gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
13
  loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
14
  rs = gain / loss
15
  rsi = 100 - (100 / (1 + rs))
16
  return rsi
17
 
18
+ # Function to calculate Bollinger Bands
19
  def calculate_bollinger_bands(data, window=20, num_std_dev=2):
20
+ sma = calculate_sma(data)
21
+ rolling_std = data['close'].rolling(window=window).std()
 
22
  upper_band = sma + (rolling_std * num_std_dev)
23
  lower_band = sma - (rolling_std * num_std_dev)
24
  return upper_band, lower_band
25
 
26
+ # Function to fetch Forex data from Financial Modeling Prep API
27
+ def fetch_forex_data(pair, start_date='2020-01-01', end_date='2025-01-01', api_key='your_api_key'):
28
+ url = f'https://financialmodelingprep.com/api/v3/historical-price-full/{pair}?from={start_date}&to={end_date}&apikey={api_key}'
29
+ response = requests.get(url)
30
+ data = response.json()
31
+
32
+ if 'historical' in data:
33
+ df = pd.DataFrame(data['historical'])
34
+ df['date'] = pd.to_datetime(df['date'])
35
+ df.set_index('date', inplace=True)
36
+ return df
37
+ else:
38
+ print(f"Error: No data available for {pair}.")
39
+ return pd.DataFrame()
40
 
41
+ # Function to generate Forex signals
42
+ def generate_forex_signals(trading_capital, market_risk, user_timezone, additional_pairs=None, api_key='your_api_key'):
43
+ signals = []
44
+
45
+ # List of currency pairs to generate signals for
46
+ currency_pairs = additional_pairs if additional_pairs else ['EURUSD', 'GBPUSD', 'USDJPY', 'AUDUSD']
47
+
48
+ # Loop through each currency pair
49
  for pair in currency_pairs:
50
+ pair_data = fetch_forex_data(pair, api_key=api_key)
51
+
52
+ if pair_data.empty:
53
+ continue # Skip if no data is available
54
 
55
  # Calculate technical indicators
56
  sma = calculate_sma(pair_data)
57
  rsi = calculate_rsi(pair_data)
58
  upper_band, lower_band = calculate_bollinger_bands(pair_data)
59
 
60
+ # Example signal generation logic (buy/sell based on RSI and Bollinger Bands)
61
  for i in range(len(pair_data)):
62
+ if rsi[i] < 30 and pair_data['close'][i] < lower_band[i]: # Buy signal
63
  signals.append({
64
  'currency_pair': pair,
65
+ 'entry_time': pair_data.index[i],
66
+ 'exit_time': pair_data.index[i] + pd.Timedelta(hours=2), # Example exit time
67
  'roi': np.random.uniform(0.1, 1), # Simulated ROI, adjust accordingly
68
  'signal_strength': np.random.uniform(50, 100) # Simulated signal strength
69
  })
70
+ elif rsi[i] > 70 and pair_data['close'][i] > upper_band[i]: # Sell signal
71
  signals.append({
72
  'currency_pair': pair,
73
+ 'entry_time': pair_data.index[i],
74
+ 'exit_time': pair_data.index[i] + pd.Timedelta(hours=2), # Example exit time
75
  'roi': np.random.uniform(0.1, 1), # Simulated ROI, adjust accordingly
76
  'signal_strength': np.random.uniform(50, 100) # Simulated signal strength
77
  })
 
 
 
78
 
79
+ # Find the best signal based on highest ROI
80
+ best_signal = max(signals, key=lambda x: x['roi']) if signals else {}
81
+
82
  return {"best_signal": best_signal, "all_signals": signals}