tosin2013's picture
Update app.py
63af683 verified
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})"