Refine strategies: fix IndexBreakoutPro, lower score inflation, enhance base class

- Fix IndexBreakoutPro: added try/except for pandas_ta import (was crashing)
- Re-enable IndexBreakoutPro in strategy_map (was disabled 'temporarily' with import error)
- Lower inflated complexity scores: Hybrid 8→6, Crypto 12→7 (EXPERT→INTERMEDIATE)
- Enhance BaseStrategy with get_stop_loss(), get_take_profit(), validate() methods
- Fix mutable default arg (params: dict = {} → params: dict = None)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
chrisnov-it
2026-06-23 14:19:32 +08:00
parent 8dfa15d2bc
commit 9c5e8c32f7
3 changed files with 52 additions and 20 deletions
+32 -2
View File
@@ -7,9 +7,9 @@ class BaseStrategy(ABC):
Kelas dasar abstrak untuk semua strategi trading.
Setiap strategi harus mewarisi kelas ini dan mengimplementasikan metode `analyze`.
"""
def __init__(self, bot_instance, params: dict = {}):
def __init__(self, bot_instance, params: dict = None):
self.bot = bot_instance
self.params = params
self.params = params or {}
@abstractmethod
def analyze(self, df):
@@ -20,6 +20,36 @@ class BaseStrategy(ABC):
"""
raise NotImplementedError("Setiap strategi harus mengimplementasikan metode `analyze(df)`.")
def get_stop_loss(self, df, signal: str, price: float) -> float:
"""
Opsional: mengembalikan harga stop-loss yang disarankan berdasarkan logika strategi.
Default: 2% dari harga entry. Override di subclass untuk custom logic (berbasis ATR dll).
"""
if signal == "BUY":
return price * 0.98
elif signal == "SELL":
return price * 1.02
return 0.0
def get_take_profit(self, df, signal: str, price: float) -> float:
"""
Opsional: mengembalikan harga take-profit yang disarankan.
Default: 4% dari harga entry (risk-reward 2:1 dari default SL).
"""
if signal == "BUY":
return price * 1.04
elif signal == "SELL":
return price * 0.96
return 0.0
def validate(self, df) -> tuple:
"""
Opsional: memeriksa apakah kondisi pasar cocok untuk strategi ini.
Mengembalikan (valid: bool, reason: str).
Default: selalu valid.
"""
return True, ""
@classmethod
def get_definable_params(cls):
"""
+4 -1
View File
@@ -1,7 +1,10 @@
# core/strategies/index_breakout_pro.py
import pandas as pd
import pandas_ta as ta
try:
import pandas_ta as ta
except ImportError:
from core.utils.pandas_ta_compat import ta
from .base_strategy import BaseStrategy
import logging
+16 -17
View File
@@ -13,8 +13,7 @@ from .turtle_breakout import TurtleBreakoutStrategy
from .ichimoku_cloud import IchimokuCloudStrategy
from .dynamic_breakout import DynamicBreakoutStrategy
from .index_momentum import IndexMomentumStrategy
# TEMPORARILY DISABLED - needs import fix
# from .index_breakout_pro import IndexBreakoutProStrategy
from .index_breakout_pro import IndexBreakoutProStrategy
from .beginner_defaults import BEGINNER_DEFAULTS
STRATEGY_MAP = {
@@ -31,7 +30,7 @@ STRATEGY_MAP = {
'ICHIMOKU_CLOUD': IchimokuCloudStrategy,
'DYNAMIC_BREAKOUT': DynamicBreakoutStrategy,
'INDEX_MOMENTUM': IndexMomentumStrategy,
# 'INDEX_BREAKOUT_PRO': IndexBreakoutProStrategy, # TEMPORARILY DISABLED
'INDEX_BREAKOUT_PRO': IndexBreakoutProStrategy,
}
# Beginner-friendly strategy metadata
@@ -124,18 +123,18 @@ STRATEGY_METADATA = {
# 🚀 EXPERT
'QUANTUMBOTX_HYBRID': {
'difficulty': 'EXPERT',
'complexity_score': 8,
'difficulty': 'INTERMEDIATE',
'complexity_score': 6,
'recommended_for_beginners': False,
'description': 'Multi-asset adaptive strategy',
'description': 'Multi-indicator hybrid strategy for forex and crypto',
'market_types': ['FOREX', 'GOLD', 'CRYPTO'],
'learning_priority': 11
},
'QUANTUMBOTX_CRYPTO': {
'difficulty': 'EXPERT',
'complexity_score': 12,
'difficulty': 'INTERMEDIATE',
'complexity_score': 7,
'recommended_for_beginners': False,
'description': 'Crypto-specialized advanced system',
'description': 'Crypto-specialized strategy with volatility management',
'market_types': ['CRYPTO'],
'learning_priority': 12
},
@@ -149,14 +148,14 @@ STRATEGY_METADATA = {
'market_types': ['INDICES'],
'learning_priority': 8
},
# 'INDEX_BREAKOUT_PRO': {
# 'difficulty': 'ADVANCED',
# 'complexity_score': 7,
# 'recommended_for_beginners': False,
# 'description': 'Professional index breakout with institutional analysis',
# 'market_types': ['INDICES'],
# 'learning_priority': 10
# }
'INDEX_BREAKOUT_PRO': {
'difficulty': 'ADVANCED',
'complexity_score': 7,
'recommended_for_beginners': False,
'description': 'Professional index breakout with institutional analysis',
'market_types': ['INDICES'],
'learning_priority': 10
}
}
def get_beginner_strategies():