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)
|
tr = pd.concat([tr1, tr2, tr3], axis=1).max(axis=1)
|
||||||
return tr.rolling(window=self.length).mean()
|
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:
|
def calculate(self, df: pd.DataFrame) -> pd.DataFrame:
|
||||||
"""
|
"""
|
||||||
Calculate SunnyBands indicator
|
Calculate SunnyBands indicator
|
||||||
@ -44,6 +64,9 @@ class SunnyBands:
|
|||||||
upper_band = dma + (atr * self.atr_multiplier)
|
upper_band = dma + (atr * self.atr_multiplier)
|
||||||
lower_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
|
# Generate signals
|
||||||
bullish = (df['close'] > lower_band) & (df['close'].shift(1) <= lower_band)
|
bullish = (df['close'] > lower_band) & (df['close'].shift(1) <= lower_band)
|
||||||
bearish = (df['close'] < upper_band) & (df['close'].shift(1) >= upper_band)
|
bearish = (df['close'] < upper_band) & (df['close'].shift(1) >= upper_band)
|
||||||
@ -53,6 +76,7 @@ class SunnyBands:
|
|||||||
'dma': dma,
|
'dma': dma,
|
||||||
'upper_band': upper_band,
|
'upper_band': upper_band,
|
||||||
'lower_band': lower_band,
|
'lower_band': lower_band,
|
||||||
|
'target': targets, # Add targets to results
|
||||||
'bullish_signal': bullish,
|
'bullish_signal': bullish,
|
||||||
'bearish_signal': bearish
|
'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]:
|
if results['bullish_signal'].iloc[-1]:
|
||||||
entry_price = last_day['close']
|
entry_price = last_day['close']
|
||||||
dma = results['dma'].iloc[-1]
|
target_price = results['target'].iloc[-1] # Use the new target calculation
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
if calculator:
|
if calculator:
|
||||||
position = calculator.calculate_position_size(entry_price, target_price)
|
position = calculator.calculate_position_size(entry_price, target_price)
|
||||||
signal_data.update({
|
if position['shares'] > 0:
|
||||||
'shares': position['shares'],
|
signal_data = {
|
||||||
'position_size': position['position_value'],
|
'ticker': ticker,
|
||||||
'stop_loss': position['stop_loss'],
|
'entry': entry_price,
|
||||||
'risk': position['potential_loss'],
|
'target': target_price,
|
||||||
'reward': position['potential_profit'],
|
'shares': position['shares'],
|
||||||
'r_r': position['risk_reward_ratio']
|
'position_size': position['position_value'],
|
||||||
})
|
'stop_loss': position['stop_loss'],
|
||||||
|
'risk': position['potential_loss'],
|
||||||
bullish_signals.append(signal_data)
|
'reward': position['potential_profit'],
|
||||||
print(f"\n🟢 {ticker} Entry: ${entry_price:.2f} Target: ${target_price:.2f}")
|
'r_r': position['risk_reward_ratio']
|
||||||
if calculator:
|
}
|
||||||
print(f" Shares: {signal_data['shares']} | Risk: ${abs(signal_data['risk']):.2f} | "
|
bullish_signals.append(signal_data)
|
||||||
f"Reward: ${signal_data['reward']:.2f} | R/R: {signal_data['r_r']:.2f}")
|
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]:
|
elif results['bearish_signal'].iloc[-1]:
|
||||||
bearish_signals.append({
|
bearish_signals.append({
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user