diff --git a/src/indicators/sunny_bands.py b/src/indicators/sunny_bands.py index 2c566bc..d3b601e 100644 --- a/src/indicators/sunny_bands.py +++ b/src/indicators/sunny_bands.py @@ -23,6 +23,26 @@ class SunnyBands: tr = pd.concat([tr1, tr2, tr3], axis=1).max(axis=1) return tr.rolling(window=self.length).mean() + def calculate_target(self, dma: float, upper_band: float) -> float: + """ + Calculate a more aggressive price target + + Args: + dma (float): Current DMA value + upper_band (float): Current upper band value + + Returns: + float: Calculated target price + """ + # Calculate band width + band_width = upper_band - dma + + # Target is 2-3x the band width above the upper band + target_multiple = 2.5 # Can be adjusted between 2-3x for different aggressiveness + target = upper_band + (band_width * target_multiple) + + return target + def calculate(self, df: pd.DataFrame) -> pd.DataFrame: """ Calculate SunnyBands indicator @@ -44,6 +64,9 @@ class SunnyBands: upper_band = dma + (atr * self.atr_multiplier) lower_band = dma - (atr * self.atr_multiplier) + # Calculate targets for each row + targets = [self.calculate_target(d, u) for d, u in zip(dma, upper_band)] + # Generate signals bullish = (df['close'] > lower_band) & (df['close'].shift(1) <= lower_band) bearish = (df['close'] < upper_band) & (df['close'].shift(1) >= upper_band) @@ -53,6 +76,7 @@ class SunnyBands: 'dma': dma, 'upper_band': upper_band, 'lower_band': lower_band, + 'target': targets, # Add targets to results 'bullish_signal': bullish, 'bearish_signal': bearish }) diff --git a/src/screener/t_sunnyband.py b/src/screener/t_sunnyband.py index df41769..0e92cb2 100644 --- a/src/screener/t_sunnyband.py +++ b/src/screener/t_sunnyband.py @@ -305,33 +305,26 @@ def run_sunny_scanner(min_price: float, max_price: float, min_volume: int, portf if results['bullish_signal'].iloc[-1]: entry_price = last_day['close'] - dma = results['dma'].iloc[-1] - upper_band = results['upper_band'].iloc[-1] - band_range = upper_band - dma - target_price = upper_band + band_range - - signal_data = { - 'ticker': ticker, - 'entry': entry_price, - 'target': target_price - } + target_price = results['target'].iloc[-1] # Use the new target calculation if calculator: position = calculator.calculate_position_size(entry_price, target_price) - signal_data.update({ - 'shares': position['shares'], - 'position_size': position['position_value'], - 'stop_loss': position['stop_loss'], - 'risk': position['potential_loss'], - 'reward': position['potential_profit'], - 'r_r': position['risk_reward_ratio'] - }) - - bullish_signals.append(signal_data) - print(f"\n🟢 {ticker} Entry: ${entry_price:.2f} Target: ${target_price:.2f}") - if calculator: - print(f" Shares: {signal_data['shares']} | Risk: ${abs(signal_data['risk']):.2f} | " - f"Reward: ${signal_data['reward']:.2f} | R/R: {signal_data['r_r']:.2f}") + if position['shares'] > 0: + signal_data = { + 'ticker': ticker, + 'entry': entry_price, + 'target': target_price, + 'shares': position['shares'], + 'position_size': position['position_value'], + 'stop_loss': position['stop_loss'], + 'risk': position['potential_loss'], + 'reward': position['potential_profit'], + 'r_r': position['risk_reward_ratio'] + } + bullish_signals.append(signal_data) + print(f"\n🟢 {ticker} Entry: ${entry_price:.2f} Target: ${target_price:.2f}") + print(f" Shares: {signal_data['shares']} | Risk: ${abs(signal_data['risk']):.2f} | " + f"Reward: ${signal_data['reward']:.2f} | R/R: {signal_data['r_r']:.2f}") elif results['bearish_signal'].iloc[-1]: bearish_signals.append({