Spaces:
Runtime error
Runtime error
File size: 13,601 Bytes
2e63bd5 c29d85f 2e63bd5 c29d85f 2e63bd5 c29d85f 2e63bd5 b36800f 2e63bd5 b36800f 2e63bd5 706c31b 33bf082 cf60193 63af683 2e63bd5 706c31b 33bf082 43f58e9 63af683 43f58e9 63af683 2e63bd5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 |
import gradio as gr
import requests
import pandas as pd
import math
import os
import matplotlib.pyplot as plt
from alpha_vantage.timeseries import TimeSeries
#symbol = 'NRDS'
#target_profit_price = 9.34
#interval = 'daily' # Specify the desired interval ('intraday', 'daily', 'weekly')
#start_date = '2023-01-01' # Specify the start date for historical data
#buy_signal = False
def get_current_stock_price(api_key, symbol):
url = f"https://finnhub.io/api/v1/quote?symbol={symbol}&token={api_key}"
response = requests.get(url)
print(response)
data = response.json()
return data['c'] # Current price
finnhub_api_key=os.environ['FINHUB_API_KEY']
def calculate_fibonacci_retracements(high, low):
# Adjust the Fibonacci ratios as needed
fibonacci_ratios = [0.236, 0.382, 0.5, 0.618, 0.786] # Example adjusted ratios
fibonacci_retracements = []
for i in range(40):
fibonacci_level = round((i+1)/(len(fibonacci_ratios)+1), 2) * fibonacci_ratios[i % len(fibonacci_ratios)]
fibonacci_retracements.append(fibonacci_level)
fibonacci_levels = {}
for r in fibonacci_retracements:
fibonacci_levels[f"{r * 100:.0f}%"] = round((low + high) - ((high - low) * r), 2)
return fibonacci_levels
from alpha_vantage.timeseries import TimeSeries
def fetch_historical_data(symbol, interval, output_size='compact', start_date=None):
# Replace with your AlphaVantage API key
api_key = os.environ['ALPHA_VANTAGE_API_KEY']
# Initialize the TimeSeries object
ts = TimeSeries(key=api_key, output_format='json')
# Map interval to the corresponding AlphaVantage function name
interval_mapping = {
'intraday': 'TIME_SERIES_INTRADAY',
'daily': 'TIME_SERIES_DAILY',
'weekly': 'TIME_SERIES_WEEKLY'
}
if interval not in interval_mapping:
raise ValueError("Invalid interval. Supported intervals: 'intraday', 'daily', 'weekly'")
# Define the function name based on the interval
function_name = interval_mapping[interval]
if interval == 'intraday':
# Adjust the interval as needed
interval = '5min'
# Fetch historical data
if interval == 'daily':
historical_data, meta_data = ts.get_daily_adjusted(symbol=symbol, outputsize=output_size)
elif interval == 'weekly':
historical_data, meta_data = ts.get_weekly_adjusted(symbol=symbol)
else:
# For intraday, you can specify the interval (e.g., '5min')
historical_data, meta_data = ts.get_intraday(symbol=symbol, interval=interval, outputsize=output_size)
return historical_data
import numpy as np
def calculate_support_resistance_levels(symbol, interval='intraday', output_size='compact'):
# Fetch historical price data from AlphaVantage
historical_data = fetch_historical_data(symbol, interval, output_size)
# Extract closing prices from historical data
closing_prices = [float(data['4. close']) for data in historical_data.values()]
print("Display historyical data")
print(closing_prices)
# Calculate moving averages (e.g., 50-day and 200-day)
moving_average_50 = np.mean(closing_prices[-50:])
moving_average_200 = np.mean(closing_prices[-200:])
# Calculate support and resistance levels
# You can customize your logic for defining these levels based on moving averages
# For example, support could be defined as the 50-day moving average, and resistance could be the 200-day moving average
support_level = moving_average_50
resistance_level = moving_average_200
return support_level, resistance_level
def calculate_entry_exit_points(symbol, target_profit_price, risk_percentage, account_balance, start_date, buy_signal_str):
# Convert string inputs to correct data types
print("Debugging information:")
print("target_profit_price:", target_profit_price)
print("risk_percentage:", risk_percentage)
print("account_balance:", account_balance)
current_price = get_current_stock_price(finnhub_api_key, symbol)
print("current_price:", current_price)
target_profit_price = float(target_profit_price)
risk_percentage = float(risk_percentage)
account_balance = float(account_balance)
buy_signal = buy_signal_str == "Buy"
print("buy_signal:", buy_signal)
# Fetch swing high and swing low using symbol, interval, and start date
swing_high, swing_low = get_swing_high_low(symbol, 'intraday', start_date)
# Calculate Fibonacci levels
fibonacci_levels = calculate_fibonacci_retracements(swing_high, swing_low)
# Calculate support and resistance levels
support_level, resistance_level = calculate_support_resistance_levels(symbol, 'intraday', start_date)
# Calculate entry and stop loss based on support and resistance
entry_point, stop_loss = calculate_entry_stop_loss(support_level, resistance_level, buy_signal)
# Calculate position size based on risk percentage and account balance
position_size = (risk_percentage / 100) * account_balance
# Calculate take profit based on Fibonacci levels and target price
take_profit, closest_levels = calculate_take_profit(target_profit_price, fibonacci_levels, buy_signal)
# Calculate profit in dollars for take profit and stop loss
if buy_signal:
profit_take_profit = (take_profit - entry_point) * position_size
profit_stop_loss = (entry_point - stop_loss) * position_size
else:
profit_take_profit = (entry_point - take_profit) * position_size
profit_stop_loss = (stop_loss - entry_point) * position_size
# Determine buy/sell flag
buy_sell_flag = "Buy" if buy_signal else "Sell"
return {
'Ticker': symbol,
'entry': entry_point,
'stop_loss': stop_loss,
'take_profit': take_profit,
'swing_high': swing_high,
'swing_low': swing_low,
'position_size': position_size,
'profit_take_profit': profit_take_profit,
'profit_stop_loss': profit_stop_loss,
'fibonacci_levels': fibonacci_levels,
'closest_levels': closest_levels,
'support_level': support_level,
'resistance_level': resistance_level,
'buy_sell_flag': buy_sell_flag
}
# Note: You would also need to adjust or create the calculate_profit function to handle profit calculation.
def calculate_entry_stop_loss(support_level, resistance_level, buy_signal):
# Calculate entry and stop loss based on support and resistance
if buy_signal:
entry_point = support_level
stop_loss = entry_point - (entry_point * 0.02) # Adjust the percentage as needed
else:
entry_point = resistance_level
stop_loss = entry_point + (entry_point * 0.02) # Adjust the percentage as needed
return entry_point, stop_loss
def calculate_take_profit(target_price, fibonacci_levels, buy_signal):
# Calculate take profit based on Fibonacci levels and target price
if buy_signal:
closest_levels = {k: v for k, v in fibonacci_levels.items() if v > target_price}
print("Closest Levels:")
print(closest_levels)
take_profit_fibonacci_level = max(closest_levels.keys())
take_profit = closest_levels[take_profit_fibonacci_level]
else:
closest_levels = {k: v for k, v in fibonacci_levels.items() if v < target_price}
print("Closest Levels:")
print(closest_levels)
if closest_levels:
take_profit_fibonacci_level = min(closest_levels.keys())
take_profit = closest_levels[take_profit_fibonacci_level]
else:
take_profit_fibonacci_level = 0
take_profit = 0 # Assuming default level and price
return take_profit, closest_levels
def get_swing_high_low(symbol, interval, start_date):
print(symbol, interval, start_date)
# Fetch historical price data from AlphaVantage
historical_data = fetch_historical_data(symbol,interval, start_date=start_date)
print("prining historical data")
print(historical_data)
# Initialize variables to store swing high and swing low prices
swing_high = None
swing_low = None
# Iterate through historical data to find swing high and swing low
for date, price_data in historical_data.items():
high_price = float(price_data['2. high'])
low_price = float(price_data['3. low'])
if swing_high is None or high_price > swing_high:
swing_high = high_price
if swing_low is None or low_price < swing_low:
swing_low = low_price
return swing_high, swing_low
import gradio as gr
def interface_wrapper(symbol, target_profit_price, risk_percentage, account_balance, start_date, buy_signal):
# Your function logic here
# Dummy return for demonstration purposes
return {
"Entry Point": 100,
"Stop Loss": 90,
"Take Profit": 110,
"Position Size": 1000,
"Profit (Take Profit)": 100,
"Profit (Stop Loss)": -100,
"Fibonacci Levels": {"38.2%": 95, "61.8%": 105},
"Buy/Sell Flag": buy_signal
}
# Ensure inputs to Gradio interface are in the correct order and use the correct components
demo = gr.Interface(
fn=calculate_entry_exit_points,
inputs=[
gr.Textbox(label="Stock Symbol"), # symbol
gr.Number(label="Target Profit Price"), # target_profit_price
gr.Slider(label="Risk Percentage", minimum=0, maximum=100, step=0.1), # risk_percentage, with default at 2%
gr.Number(label="Account Balance"), # account_balance, with default
gr.Textbox(label="Start Date", placeholder="YYYY-MM-DD"), # start_date, with default
gr.Radio(choices=["Buy", "Sell"], label="Buy/Sell Signal") # buy_signal, with default
],
outputs=gr.JSON(label="Results"),
description="Enter the necessary information to calculate entry and exit points for stock trading."
)
demo.launch(share=True) # share=True to create a public link
def plot_trade(entry, stop_loss, take_profit, fibonacci_json):
# Parse the Fibonacci levels from JSON
fibonacci_levels = json.loads(fibonacci_json)
# Prepare data for plotting
fib_levels = list(fibonacci_levels.values())
fib_labels = list(fibonacci_levels.keys())
# Initialize the plot
plt.figure(figsize=(10, 6))
plt.title("Trade Setup with Fibonacci Levels")
# Plot Fibonacci levels
for i, level in enumerate(fib_levels):
plt.axhline(y=level, linestyle='--', color='gray', alpha=0.5)
plt.text(len(fib_labels) + 1, level, f"{fib_labels[i]}: {level}", verticalalignment='center')
# Plot entry, stop_loss, and take_profit
plt.axhline(y=entry, color='blue', label='Entry')
plt.axhline(y=stop_loss, color='red', label='Stop Loss')
plt.axhline(y=take_profit, color='green', label='Take Profit')
plt.legend()
plt.xlabel("Fibonacci Levels")
plt.ylabel("Price")
plt.tight_layout()
# Save the plot to a temporary file and return its path
plt_path = "/mnt/data/trade_setup.png"
plt.savefig(plt_path)
plt.close()
return plt_path
# Example usage
#current_price = get_current_stock_price(finnhub_api_key, symbol)
# start_date = '2023-01-01'
# swing_high, swing_low = get_swing_high_low(symbol, 'weekly', start_date)
# print(f"Swing High: {swing_high}, Swing Low: {swing_low}")
# risk_percentage = 1finnhub_api_key
# account_balance = 10000
# entry_exit_points = calculate_entry_exit_points(current_price=current_price, target_price=target_profit_price, risk_percentage=1, account_balance=10000, swing_high=swing_high, swing_low=swing_low,buy_signal=buy_signal)
# Printing the output
# print("Current Price:", current_price)
# print("Price Target:", target_profit_price)
# print("Entry Price:", entry_exit_points['entry'])
# print("Stop Loss:", entry_exit_points['stop_loss'])
# print("Take Profit:", entry_exit_points['take_profit'])
# print("Position Size:", entry_exit_points['position_size'])
# print("Profit (Take Profit): $", entry_exit_points['profit_take_profit'])
# print("Profit (Stop Loss): $", entry_exit_points['profit_stop_loss'])
# print("Fibonacci Levels:", entry_exit_points['fibonacci_levels'])
# Print the closest levels and their associated prices for debugging
# if buy_signal:
# print(f"Closest levels for Buy (targeting {target_profit_price}): {entry_exit_points['closest_levels']}")
# else:
# print(f"Closest levels for Sell (targeting {target_profit_price}): {entry_exit_points['closest_levels']}")
# print("Buy/Sell Flag:", entry_exit_points['buy_sell_flag'])
# Print the structure of entry_exit_points['closest_levels']
# Extract levels and prices from entry_exit_points['closest_levels'] dictionary
# levels = list(entry_exit_points['closest_levels'].keys())
# prices = list(entry_exit_points['closest_levels'].values())
# Create a bar chart
# plt.figure(figsize=(10, 6))
# plt.bar(levels, prices, color='blue' if buy_signal else 'red')
# plt.xlabel("Fibonacci Levels")
# plt.ylabel("Price")
# plt.title("Average Price at Fibonacci Levels")
# plt.xticks(rotation=45)
# Show the chart
# plt.show()
# print(entry_exit_points['closest_levels'])
# for key, value in entry_exit_points['closest_levels'].items():
# print(f"Property: {key}, Value: {value}")
# Check if it's a buy or sell signal and adjust the title accordingly
# if buy_signal:
# title = f"Closest Levels for Buy (targeting {target_profit_price})"
# else:
# title = f"Closest Levels for Sell (targeting {target_profit_price})"
|