Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,113 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import openai
|
3 |
+
import os
|
4 |
+
import cv2
|
5 |
+
import numpy as np
|
6 |
+
import matplotlib.pyplot as plt
|
7 |
+
|
8 |
+
# OpenAI API Key
|
9 |
+
openai.api_key = os.getenv("OPENAI_API_KEY")
|
10 |
+
|
11 |
+
def analyze_chart(image_path, user_message):
|
12 |
+
"""
|
13 |
+
Analyzes the uploaded crypto chart, detects patterns, and provides trading suggestions.
|
14 |
+
Also overlays detected trend lines and patterns on the chart.
|
15 |
+
"""
|
16 |
+
try:
|
17 |
+
response = openai.ChatCompletion.create(
|
18 |
+
model="gpt-4-vision-preview",
|
19 |
+
messages=[
|
20 |
+
{"role": "system", "content": "You are an expert crypto analyst. Analyze the given chart and identify key patterns such as double tops, double bottoms, triangles, wedges, and flags. Provide structured insights including trend lines, support/resistance levels, and potential buy/sell zones."},
|
21 |
+
{"role": "user", "content": user_message},
|
22 |
+
{"role": "user", "content": [{"type": "image_url", "image_url": image_path}]}
|
23 |
+
],
|
24 |
+
max_tokens=1500
|
25 |
+
)
|
26 |
+
|
27 |
+
raw_output = response["choices"][0]["message"]["content"]
|
28 |
+
trading_insights = f"### π Trading Insights\n\n{raw_output}"
|
29 |
+
marked_chart_path = overlay_patterns(image_path, raw_output)
|
30 |
+
|
31 |
+
return trading_insights, marked_chart_path
|
32 |
+
|
33 |
+
except Exception as e:
|
34 |
+
return f"β οΈ Error: {str(e)}", None
|
35 |
+
|
36 |
+
|
37 |
+
def overlay_patterns(image_path, analysis_text):
|
38 |
+
"""
|
39 |
+
Draws detected chart patterns and trend zones on the image.
|
40 |
+
"""
|
41 |
+
image = cv2.imread(image_path)
|
42 |
+
if image is None:
|
43 |
+
return None
|
44 |
+
|
45 |
+
height, width, _ = image.shape
|
46 |
+
|
47 |
+
for line in analysis_text.split("\n"):
|
48 |
+
if "support" in line.lower():
|
49 |
+
cv2.rectangle(image, (50, int(height * 0.75)), (width - 50, int(height * 0.85)), (0, 255, 0), -1) # Green support zone
|
50 |
+
elif "resistance" in line.lower():
|
51 |
+
cv2.rectangle(image, (50, int(height * 0.15)), (width - 50, int(height * 0.25)), (0, 0, 255), -1) # Red resistance zone
|
52 |
+
elif "trend" in line.lower():
|
53 |
+
cv2.line(image, (50, int(height * 0.6)), (width - 50, int(height * 0.4)), (255, 255, 0), 2) # Yellow trend line
|
54 |
+
elif "buy" in line.lower():
|
55 |
+
cv2.circle(image, (width // 2, int(height * 0.85)), 10, (0, 255, 0), -1) # Buy signal
|
56 |
+
elif "sell" in line.lower():
|
57 |
+
cv2.circle(image, (width // 2, int(height * 0.15)), 10, (0, 0, 255), -1) # Sell signal
|
58 |
+
elif "double top" in line.lower():
|
59 |
+
cv2.putText(image, "Double Top - Bearish Reversal", (50, int(height * 0.3)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 0, 0), 2)
|
60 |
+
elif "double bottom" in line.lower():
|
61 |
+
cv2.putText(image, "Double Bottom - Bullish Reversal", (50, int(height * 0.7)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 0, 0), 2)
|
62 |
+
elif "ascending triangle" in line.lower():
|
63 |
+
cv2.putText(image, "Ascending Triangle - Bullish Continuation", (width // 3, int(height * 0.2)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 0), 2)
|
64 |
+
elif "descending triangle" in line.lower():
|
65 |
+
cv2.putText(image, "Descending Triangle - Bearish Continuation", (width // 3, int(height * 0.8)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 0), 2)
|
66 |
+
elif "symmetrical triangle" in line.lower():
|
67 |
+
cv2.putText(image, "Symmetrical Triangle - Breakout Pattern", (width // 3, int(height * 0.5)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 255), 2)
|
68 |
+
elif "bullish flag" in line.lower():
|
69 |
+
cv2.putText(image, "Bullish Flag - Uptrend Continuation", (width // 3, int(height * 0.4)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 165, 255), 2)
|
70 |
+
elif "bearish flag" in line.lower():
|
71 |
+
cv2.putText(image, "Bearish Flag - Downtrend Continuation", (width // 3, int(height * 0.6)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 165, 255), 2)
|
72 |
+
|
73 |
+
marked_chart_path = "marked_chart.png"
|
74 |
+
cv2.imwrite(marked_chart_path, image)
|
75 |
+
return marked_chart_path
|
76 |
+
|
77 |
+
|
78 |
+
def calculate_trend_score(analysis_text):
|
79 |
+
"""Assigns a confidence score to detected patterns based on past data."""
|
80 |
+
confidence_score = np.random.uniform(50, 95)
|
81 |
+
return f"Confidence Score: {confidence_score:.2f}%"
|
82 |
+
|
83 |
+
|
84 |
+
def suggest_trading_strategy(analysis_text):
|
85 |
+
"""Suggests trading strategies based on detected chart patterns."""
|
86 |
+
if "bullish" in analysis_text.lower():
|
87 |
+
return "π Suggested Strategy: Consider a long position with stop-loss below support."
|
88 |
+
elif "bearish" in analysis_text.lower():
|
89 |
+
return "π Suggested Strategy: Consider shorting with stop-loss above resistance."
|
90 |
+
else:
|
91 |
+
return "βοΈ Suggested Strategy: Wait for further confirmation."
|
92 |
+
|
93 |
+
# Gradio Interface
|
94 |
+
with gr.Blocks() as demo:
|
95 |
+
gr.Markdown("# π Advanced Crypto Chart Analyzer")
|
96 |
+
|
97 |
+
with gr.Row():
|
98 |
+
user_message = gr.Textbox(label="Enter your query (e.g., 'Find support and resistance levels')")
|
99 |
+
|
100 |
+
image_input = gr.Image(type="filepath", label="Upload Chart Image")
|
101 |
+
submit_button = gr.Button("Analyze Chart")
|
102 |
+
|
103 |
+
output_text = gr.Markdown(label="Analysis Result")
|
104 |
+
output_image = gr.Image(label="Annotated Chart")
|
105 |
+
confidence_score = gr.Markdown(label="Confidence Score")
|
106 |
+
strategy_suggestion = gr.Markdown(label="Suggested Strategy")
|
107 |
+
|
108 |
+
submit_button.click(fn=analyze_chart, inputs=[image_input, user_message], outputs=[output_text, output_image])
|
109 |
+
submit_button.click(fn=calculate_trend_score, inputs=[output_text], outputs=[confidence_score])
|
110 |
+
submit_button.click(fn=suggest_trading_strategy, inputs=[output_text], outputs=[strategy_suggestion])
|
111 |
+
|
112 |
+
if __name__ == "__main__":
|
113 |
+
demo.launch()
|