feat: Enhance SunnyBands target calculation with more aggressive pricing strategy
This commit is contained in:
parent
e7a32dd9ab
commit
1daf868a4d
@ -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
|
||||
})
|
||||
|
||||
@ -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({
|
||||
|
||||
Loading…
Reference in New Issue
Block a user