Feat: Add candlestick pattern selection to technical scanner page

This commit is contained in:
Bobby (aider) 2025-02-19 22:11:58 -08:00
parent 11da880979
commit e3ac3bebc1
3 changed files with 40 additions and 15 deletions

View File

@ -1,6 +1,7 @@
import streamlit as st
from screener.scanner_controller import run_technical_scanner
from utils.report_utils import load_scanner_reports
from screener.t_candlestick import CANDLESTICK_PATTERNS
import pandas as pd
def technical_scanner_page():
@ -16,6 +17,17 @@ def technical_scanner_page():
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
interval = st.selectbox(
"Select Time Interval",
@ -52,16 +64,22 @@ def technical_scanner_page():
if st.button("Run Scanner"):
with st.spinner("Running scanner..."):
try:
signals = run_technical_scanner(
scanner_choice=scanner_type.lower().replace(" ", "_"),
start_date=start_date.strftime("%Y-%m-%d"),
end_date=end_date.strftime("%Y-%m-%d"),
min_price=min_price,
max_price=max_price,
min_volume=min_volume,
portfolio_size=portfolio_size,
interval=selected_interval
)
scanner_args = {
"scanner_choice": scanner_type.lower().replace(" ", "_"),
"start_date": start_date.strftime("%Y-%m-%d"),
"end_date": end_date.strftime("%Y-%m-%d"),
"min_price": min_price,
"max_price": max_price,
"min_volume": min_volume,
"portfolio_size": portfolio_size,
"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:
st.success(f"Found {len(signals)} signals")
# Create a summary table

View File

@ -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_v2 import run_atr_ema_scanner_v2
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,
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
@ -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),
"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),
"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)

View File

@ -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
@ -48,9 +48,13 @@ def check_entry_signal(df: pd.DataFrame) -> list:
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 = {}
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'](
df['open'].values,
df['high'].values,