feat: Enhance SunnyBands target calculation with more aggressive pricing strategy

This commit is contained in:
Bobby Abellana (aider) 2025-02-06 23:30:06 -08:00
parent e7a32dd9ab
commit 1daf868a4d
No known key found for this signature in database
GPG Key ID: 647714CC45F3647B
2 changed files with 41 additions and 24 deletions

View File

@ -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
})

View File

@ -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({