fix: Handle NaN ATR values and adjust lookback period in signal check
This commit is contained in:
parent
96b4d951b4
commit
0a7d1afcde
@ -44,11 +44,14 @@ def check_entry_signal(df: pd.DataFrame, selected_patterns: list = None) -> list
|
|||||||
Returns:
|
Returns:
|
||||||
list: List of tuples (signal, date, signal_data) for each signal found
|
list: List of tuples (signal, date, signal_data) for each signal found
|
||||||
"""
|
"""
|
||||||
if len(df) < 5: # Need at least 5 bars for pattern recognition
|
if len(df) < 14: # Need at least 14 bars for ATR calculation
|
||||||
return []
|
return []
|
||||||
|
|
||||||
signals = []
|
signals = []
|
||||||
|
|
||||||
|
# Calculate ATR first
|
||||||
|
atr = talib.ATR(df['high'].values, df['low'].values, df['close'].values, timeperiod=14)
|
||||||
|
|
||||||
# Use selected patterns or all patterns if none selected
|
# Use selected patterns or all patterns if none selected
|
||||||
patterns_to_scan = {k: v for k, v in CANDLESTICK_PATTERNS.items()
|
patterns_to_scan = {k: v for k, v in CANDLESTICK_PATTERNS.items()
|
||||||
if selected_patterns is None or k in selected_patterns}
|
if selected_patterns is None or k in selected_patterns}
|
||||||
@ -64,7 +67,7 @@ def check_entry_signal(df: pd.DataFrame, selected_patterns: list = None) -> list
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Look for signals across all candles
|
# Look for signals across all candles
|
||||||
for i in range(len(df)):
|
for i in range(14, len(df)): # Start after ATR lookback period
|
||||||
found_patterns = []
|
found_patterns = []
|
||||||
|
|
||||||
for pattern_name, pattern_values in pattern_signals.items():
|
for pattern_name, pattern_values in pattern_signals.items():
|
||||||
@ -76,11 +79,15 @@ def check_entry_signal(df: pd.DataFrame, selected_patterns: list = None) -> list
|
|||||||
# Calculate basic target and stop levels using recent price action
|
# Calculate basic target and stop levels using recent price action
|
||||||
current_price = df.iloc[i]['close']
|
current_price = df.iloc[i]['close']
|
||||||
recent_low = df.iloc[max(0, i-5):i+1]['low'].min() # Look back 5 bars for stop
|
recent_low = df.iloc[max(0, i-5):i+1]['low'].min() # Look back 5 bars for stop
|
||||||
atr = talib.ATR(df['high'].values, df['low'].values, df['close'].values, timeperiod=14)
|
|
||||||
|
|
||||||
# Use 2x ATR for target and 1x ATR for stop
|
# Default to percentage-based calculations
|
||||||
target_price = current_price + (2 * atr[i] if not pd.isna(atr[i]) else current_price * 0.02)
|
atr_value = atr[i]
|
||||||
stop_loss = max(recent_low, current_price - (atr[i] if not pd.isna(atr[i]) else current_price * 0.01))
|
if pd.isna(atr_value):
|
||||||
|
target_price = current_price * 1.02 # 2% target
|
||||||
|
stop_loss = current_price * 0.99 # 1% stop
|
||||||
|
else:
|
||||||
|
target_price = current_price + (2 * atr_value)
|
||||||
|
stop_loss = max(recent_low, current_price - atr_value)
|
||||||
|
|
||||||
signal_data = {
|
signal_data = {
|
||||||
'price': current_price,
|
'price': current_price,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user