Spaces:
Sleeping
Sleeping
Update app/daily.py
Browse files- app/daily.py +20 -15
app/daily.py
CHANGED
|
@@ -11,37 +11,40 @@ from . import backblaze as b2
|
|
| 11 |
from .common import wrap_html, format_large_number
|
| 12 |
|
| 13 |
# ===========================================================
|
| 14 |
-
# Candlestick Pattern Detection
|
| 15 |
# ===========================================================
|
| 16 |
def detect_patterns(df):
|
| 17 |
patterns = []
|
| 18 |
|
| 19 |
for i in range(1, len(df)):
|
| 20 |
-
open_today
|
| 21 |
-
|
| 22 |
-
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
# Bullish Engulfing
|
| 25 |
if close_prev < open_prev and close_today > open_today and close_today > open_prev and open_today < close_prev:
|
| 26 |
-
patterns.append({"Date": df.
|
| 27 |
# Bearish Engulfing
|
| 28 |
elif close_prev > open_prev and close_today < open_today and open_today > close_prev and close_today < open_prev:
|
| 29 |
-
patterns.append({"Date": df.
|
| 30 |
# Doji
|
| 31 |
-
elif abs(close_today - open_today)/ (high-low+1e-6) < 0.1:
|
| 32 |
-
patterns.append({"Date": df.
|
| 33 |
# Hammer / Hanging Man
|
| 34 |
elif (high - max(open_today, close_today)) > 2*(max(open_today, close_today)-min(open_today, close_today)) and \
|
| 35 |
(min(open_today, close_today) - low) < 0.1*(high-low):
|
| 36 |
if close_today > open_today:
|
| 37 |
-
patterns.append({"Date": df.
|
| 38 |
else:
|
| 39 |
-
patterns.append({"Date": df.
|
| 40 |
# Gap Up / Gap Down
|
| 41 |
-
if
|
| 42 |
-
patterns.append({"Date": df.
|
| 43 |
-
elif
|
| 44 |
-
patterns.append({"Date": df.
|
| 45 |
|
| 46 |
return pd.DataFrame(patterns)
|
| 47 |
|
|
@@ -116,8 +119,10 @@ def fetch_daily(symbol, date_end, date_start, b2_save=False):
|
|
| 116 |
|
| 117 |
# Highlight patterns on chart
|
| 118 |
for _, row in patterns_df.iterrows():
|
|
|
|
|
|
|
| 119 |
fig.add_trace(go.Scatter(
|
| 120 |
-
x=[
|
| 121 |
mode="markers+text",
|
| 122 |
marker=dict(color="red", size=10, symbol="triangle-up"),
|
| 123 |
text=[row["Pattern"]],
|
|
|
|
| 11 |
from .common import wrap_html, format_large_number
|
| 12 |
|
| 13 |
# ===========================================================
|
| 14 |
+
# Candlestick Pattern Detection (scalar-safe)
|
| 15 |
# ===========================================================
|
| 16 |
def detect_patterns(df):
|
| 17 |
patterns = []
|
| 18 |
|
| 19 |
for i in range(1, len(df)):
|
| 20 |
+
open_today = df.iat[i, df.columns.get_loc("Open")]
|
| 21 |
+
close_today = df.iat[i, df.columns.get_loc("Close")]
|
| 22 |
+
open_prev = df.iat[i-1, df.columns.get_loc("Open")]
|
| 23 |
+
close_prev = df.iat[i-1, df.columns.get_loc("Close")]
|
| 24 |
+
high = df.iat[i, df.columns.get_loc("High")]
|
| 25 |
+
low = df.iat[i, df.columns.get_loc("Low")]
|
| 26 |
|
| 27 |
# Bullish Engulfing
|
| 28 |
if close_prev < open_prev and close_today > open_today and close_today > open_prev and open_today < close_prev:
|
| 29 |
+
patterns.append({"Date": df.iat[i, df.columns.get_loc("Date")], "Pattern": "Bullish Engulfing"})
|
| 30 |
# Bearish Engulfing
|
| 31 |
elif close_prev > open_prev and close_today < open_today and open_today > close_prev and close_today < open_prev:
|
| 32 |
+
patterns.append({"Date": df.iat[i, df.columns.get_loc("Date")], "Pattern": "Bearish Engulfing"})
|
| 33 |
# Doji
|
| 34 |
+
elif abs(close_today - open_today) / (high - low + 1e-6) < 0.1:
|
| 35 |
+
patterns.append({"Date": df.iat[i, df.columns.get_loc("Date")], "Pattern": "Doji"})
|
| 36 |
# Hammer / Hanging Man
|
| 37 |
elif (high - max(open_today, close_today)) > 2*(max(open_today, close_today)-min(open_today, close_today)) and \
|
| 38 |
(min(open_today, close_today) - low) < 0.1*(high-low):
|
| 39 |
if close_today > open_today:
|
| 40 |
+
patterns.append({"Date": df.iat[i, df.columns.get_loc("Date")], "Pattern": "Hammer"})
|
| 41 |
else:
|
| 42 |
+
patterns.append({"Date": df.iat[i, df.columns.get_loc("Date")], "Pattern": "Hanging Man"})
|
| 43 |
# Gap Up / Gap Down
|
| 44 |
+
if open_today > close_prev * 1.01:
|
| 45 |
+
patterns.append({"Date": df.iat[i, df.columns.get_loc("Date")], "Pattern": "Gap Up"})
|
| 46 |
+
elif open_today < close_prev * 0.99:
|
| 47 |
+
patterns.append({"Date": df.iat[i, df.columns.get_loc("Date")], "Pattern": "Gap Down"})
|
| 48 |
|
| 49 |
return pd.DataFrame(patterns)
|
| 50 |
|
|
|
|
| 119 |
|
| 120 |
# Highlight patterns on chart
|
| 121 |
for _, row in patterns_df.iterrows():
|
| 122 |
+
pattern_date = row["Date"]
|
| 123 |
+
high_value = df.loc[df["Date"]==pattern_date, "High"].values[0]
|
| 124 |
fig.add_trace(go.Scatter(
|
| 125 |
+
x=[pattern_date], y=[high_value*1.01],
|
| 126 |
mode="markers+text",
|
| 127 |
marker=dict(color="red", size=10, symbol="triangle-up"),
|
| 128 |
text=[row["Pattern"]],
|