Feat: Add candlestick pattern selection to technical scanner page
This commit is contained in:
parent
11da880979
commit
e3ac3bebc1
@ -1,6 +1,7 @@
|
|||||||
import streamlit as st
|
import streamlit as st
|
||||||
from screener.scanner_controller import run_technical_scanner
|
from screener.scanner_controller import run_technical_scanner
|
||||||
from utils.report_utils import load_scanner_reports
|
from utils.report_utils import load_scanner_reports
|
||||||
|
from screener.t_candlestick import CANDLESTICK_PATTERNS
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
|
||||||
def technical_scanner_page():
|
def technical_scanner_page():
|
||||||
@ -16,6 +17,17 @@ def technical_scanner_page():
|
|||||||
key="tech_scanner_type"
|
key="tech_scanner_type"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Add candlestick pattern selection when Candlestick scanner is chosen
|
||||||
|
selected_patterns = None
|
||||||
|
if scanner_type == "Candlestick":
|
||||||
|
selected_patterns = st.multiselect(
|
||||||
|
"Select Candlestick Patterns",
|
||||||
|
options=list(CANDLESTICK_PATTERNS.keys()),
|
||||||
|
default=list(CANDLESTICK_PATTERNS.keys()),
|
||||||
|
format_func=lambda x: CANDLESTICK_PATTERNS[x]['description'],
|
||||||
|
help="Choose which candlestick patterns to scan for"
|
||||||
|
)
|
||||||
|
|
||||||
# Add interval selection
|
# Add interval selection
|
||||||
interval = st.selectbox(
|
interval = st.selectbox(
|
||||||
"Select Time Interval",
|
"Select Time Interval",
|
||||||
@ -52,16 +64,22 @@ def technical_scanner_page():
|
|||||||
if st.button("Run Scanner"):
|
if st.button("Run Scanner"):
|
||||||
with st.spinner("Running scanner..."):
|
with st.spinner("Running scanner..."):
|
||||||
try:
|
try:
|
||||||
signals = run_technical_scanner(
|
scanner_args = {
|
||||||
scanner_choice=scanner_type.lower().replace(" ", "_"),
|
"scanner_choice": scanner_type.lower().replace(" ", "_"),
|
||||||
start_date=start_date.strftime("%Y-%m-%d"),
|
"start_date": start_date.strftime("%Y-%m-%d"),
|
||||||
end_date=end_date.strftime("%Y-%m-%d"),
|
"end_date": end_date.strftime("%Y-%m-%d"),
|
||||||
min_price=min_price,
|
"min_price": min_price,
|
||||||
max_price=max_price,
|
"max_price": max_price,
|
||||||
min_volume=min_volume,
|
"min_volume": min_volume,
|
||||||
portfolio_size=portfolio_size,
|
"portfolio_size": portfolio_size,
|
||||||
interval=selected_interval
|
"interval": selected_interval
|
||||||
)
|
}
|
||||||
|
|
||||||
|
# Add selected patterns if using candlestick scanner
|
||||||
|
if scanner_type == "Candlestick":
|
||||||
|
scanner_args["selected_patterns"] = selected_patterns
|
||||||
|
|
||||||
|
signals = run_technical_scanner(**scanner_args)
|
||||||
if signals:
|
if signals:
|
||||||
st.success(f"Found {len(signals)} signals")
|
st.success(f"Found {len(signals)} signals")
|
||||||
# Create a summary table
|
# Create a summary table
|
||||||
|
|||||||
@ -3,10 +3,12 @@ from screener.t_sunnyband import run_sunny_scanner
|
|||||||
from screener.t_atr_ema import run_atr_ema_scanner
|
from screener.t_atr_ema import run_atr_ema_scanner
|
||||||
from screener.t_atr_ema_v2 import run_atr_ema_scanner_v2
|
from screener.t_atr_ema_v2 import run_atr_ema_scanner_v2
|
||||||
from screener.t_heikinashi import run_heikin_ashi_scanner
|
from screener.t_heikinashi import run_heikin_ashi_scanner
|
||||||
|
from screener.t_candlestick import run_candlestick_scanner
|
||||||
|
|
||||||
def run_technical_scanner(scanner_choice: str, start_date: str, end_date: str,
|
def run_technical_scanner(scanner_choice: str, start_date: str, end_date: str,
|
||||||
min_price: float, max_price: float, min_volume: int,
|
min_price: float, max_price: float, min_volume: int,
|
||||||
portfolio_size: float, interval: str = "1d"):
|
portfolio_size: float, interval: str = "1d",
|
||||||
|
selected_patterns: list = None):
|
||||||
"""
|
"""
|
||||||
Run the selected technical scanner with provided parameters
|
Run the selected technical scanner with provided parameters
|
||||||
|
|
||||||
@ -28,7 +30,8 @@ def run_technical_scanner(scanner_choice: str, start_date: str, end_date: str,
|
|||||||
"sunnybands": lambda: run_sunny_scanner(min_price, max_price, min_volume, portfolio_size, interval, start_dt, end_dt),
|
"sunnybands": lambda: run_sunny_scanner(min_price, max_price, min_volume, portfolio_size, interval, start_dt, end_dt),
|
||||||
"atr-ema": lambda: run_atr_ema_scanner(min_price, max_price, min_volume, portfolio_size, interval, start_dt, end_dt),
|
"atr-ema": lambda: run_atr_ema_scanner(min_price, max_price, min_volume, portfolio_size, interval, start_dt, end_dt),
|
||||||
"atr-ema_v2": lambda: run_atr_ema_scanner_v2(min_price, max_price, min_volume, portfolio_size, interval, start_dt, end_dt),
|
"atr-ema_v2": lambda: run_atr_ema_scanner_v2(min_price, max_price, min_volume, portfolio_size, interval, start_dt, end_dt),
|
||||||
"heikin-ashi": lambda: run_heikin_ashi_scanner(min_price, max_price, min_volume, portfolio_size, interval, start_dt, end_dt)
|
"heikin-ashi": lambda: run_heikin_ashi_scanner(min_price, max_price, min_volume, portfolio_size, interval, start_dt, end_dt),
|
||||||
|
"candlestick": lambda: run_candlestick_scanner(min_price, max_price, min_volume, portfolio_size, interval, start_dt, end_dt, selected_patterns)
|
||||||
}
|
}
|
||||||
|
|
||||||
scanner_func = scanner_map.get(scanner_choice)
|
scanner_func = scanner_map.get(scanner_choice)
|
||||||
|
|||||||
@ -33,7 +33,7 @@ CANDLESTICK_PATTERNS = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def check_entry_signal(df: pd.DataFrame) -> list:
|
def check_entry_signal(df: pd.DataFrame, selected_patterns: list = None) -> list:
|
||||||
"""
|
"""
|
||||||
Check for bullish candlestick patterns
|
Check for bullish candlestick patterns
|
||||||
|
|
||||||
@ -48,9 +48,13 @@ def check_entry_signal(df: pd.DataFrame) -> list:
|
|||||||
|
|
||||||
signals = []
|
signals = []
|
||||||
|
|
||||||
# Calculate all patterns
|
# Use selected patterns or all patterns if none selected
|
||||||
|
patterns_to_scan = {k: v for k, v in CANDLESTICK_PATTERNS.items()
|
||||||
|
if selected_patterns is None or k in selected_patterns}
|
||||||
|
|
||||||
|
# Calculate patterns
|
||||||
pattern_signals = {}
|
pattern_signals = {}
|
||||||
for pattern_name, pattern_info in CANDLESTICK_PATTERNS.items():
|
for pattern_name, pattern_info in patterns_to_scan.items():
|
||||||
pattern_signals[pattern_name] = pattern_info['function'](
|
pattern_signals[pattern_name] = pattern_info['function'](
|
||||||
df['open'].values,
|
df['open'].values,
|
||||||
df['high'].values,
|
df['high'].values,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user