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})"