exposing parameters for metatrand too

This commit is contained in:
Ajasra 2025-05-29 13:05:44 +08:00
parent 6195e6b1e9
commit 790bd9ccdd

View File

@ -65,6 +65,11 @@ class MetaTrendStrategy(IncStrategyBase):
name: Strategy name/identifier
weight: Strategy weight for combination (default: 1.0)
params: Strategy parameters
- timeframe: Primary timeframe for analysis (default: "15min")
- enable_logging: Enable detailed logging (default: False)
- supertrend_periods: List of periods for Supertrend indicators (default: [12, 10, 11])
- supertrend_multipliers: List of multipliers for Supertrend indicators (default: [3.0, 1.0, 2.0])
- min_trend_agreement: Minimum fraction of indicators that must agree (default: 1.0, meaning all)
"""
super().__init__(name, weight, params)
@ -76,12 +81,28 @@ class MetaTrendStrategy(IncStrategyBase):
if self.enable_logging:
logger.setLevel(logging.DEBUG)
# Initialize Supertrend collection with exact parameters from original strategy
self.supertrend_configs = [
(12, 3.0), # period=12, multiplier=3.0
(10, 1.0), # period=10, multiplier=1.0
(11, 2.0) # period=11, multiplier=2.0
]
# Get configurable Supertrend parameters from params or use defaults
default_periods = [12, 10, 11]
default_multipliers = [3.0, 1.0, 2.0]
supertrend_periods = self.params.get("supertrend_periods", default_periods)
supertrend_multipliers = self.params.get("supertrend_multipliers", default_multipliers)
# Validate parameters
if len(supertrend_periods) != len(supertrend_multipliers):
raise ValueError(f"supertrend_periods ({len(supertrend_periods)}) and "
f"supertrend_multipliers ({len(supertrend_multipliers)}) must have same length")
if len(supertrend_periods) < 1:
raise ValueError("At least one Supertrend indicator is required")
# Initialize Supertrend collection with configurable parameters
self.supertrend_configs = list(zip(supertrend_periods, supertrend_multipliers))
# Store agreement threshold
self.min_trend_agreement = self.params.get("min_trend_agreement", 1.0)
if not 0.0 <= self.min_trend_agreement <= 1.0:
raise ValueError("min_trend_agreement must be between 0.0 and 1.0")
self.supertrend_collection = SupertrendCollection(self.supertrend_configs)
@ -101,6 +122,8 @@ class MetaTrendStrategy(IncStrategyBase):
logger.info(f"MetaTrendStrategy initialized: timeframe={self.primary_timeframe}, "
f"aggregation_enabled={self._timeframe_aggregator is not None}")
logger.info(f"Supertrend configs: {self.supertrend_configs}, "
f"min_agreement={self.min_trend_agreement}")
if self.enable_logging:
logger.info(f"Using new timeframe utilities with mathematically correct aggregation")
@ -292,10 +315,10 @@ class MetaTrendStrategy(IncStrategyBase):
"""
Calculate meta-trend from SupertrendCollection results.
Meta-trend logic (matching original DefaultStrategy):
- All 3 Supertrends must agree for directional signal
- If all trends are the same, meta-trend = that trend
- If trends disagree, meta-trend = 0 (neutral)
Meta-trend logic (enhanced with configurable agreement threshold):
- Uses min_trend_agreement to determine consensus requirement
- If agreement threshold is met for a direction, meta-trend = that direction
- If no consensus, meta-trend = 0 (neutral)
Args:
supertrend_results: Results from SupertrendCollection.update()
@ -304,12 +327,26 @@ class MetaTrendStrategy(IncStrategyBase):
int: Meta-trend value (1, -1, or 0)
"""
trends = supertrend_results['trends']
total_indicators = len(trends)
# Check if all trends agree
if all(trend == trends[0] for trend in trends):
return trends[0] # All agree: return the common trend
if total_indicators == 0:
return 0
# Count votes for each direction
uptrend_votes = sum(1 for trend in trends if trend == 1)
downtrend_votes = sum(1 for trend in trends if trend == -1)
# Calculate agreement percentages
uptrend_agreement = uptrend_votes / total_indicators
downtrend_agreement = downtrend_votes / total_indicators
# Check if agreement threshold is met
if uptrend_agreement >= self.min_trend_agreement:
return 1
elif downtrend_agreement >= self.min_trend_agreement:
return -1
else:
return 0 # Neutral when trends disagree
return 0 # No consensus
def _check_entry_condition(self) -> bool:
"""