# source: https://raw.githubusercontent.com/xingdong23/zhixing_trader/c1f77a4aee5ce557da0865f6b727031ac167f114/crypto_strategy_trading/freqtrade_bot/my_strategies/blowup/strategy.py
"""
5分钟爆破猎手 (5-Minute Blow-Up Hunter)

核心逻辑:
- 只在高波动时段交易 (UTC 00:00-04:00, 14:00-18:00)
- 突破前20根K线最高点
- 成交量 > 50周期均量 * 1.8
- 10x杠杆，止盈1%，止损0.33%
- 5分钟K线收盘强制平仓

风险/收益 = 1:3，胜率25%即可盈亏平衡
"""
from freqtrade.strategy import IStrategy
from pandas import DataFrame
import talib.abstract as ta
import numpy as np


class Github_xingdong23_zhixing_trader__strategy__20251210_133220(IStrategy):
    """5分钟突破+放量高杠杆策略"""
    
    INTERFACE_VERSION = 3
    
    # 时间框架
    timeframe = '5m'
    
    # 风险管理 - 10x杠杆下的止损止盈 (优化后参数)
    stoploss = -0.003  # 0.3% 价格止损 → 3% 账户风险 (10x)
    
    # 止盈设置: 0.5% 价格 → 5% 账户收益 (10x)
    minimal_roi = {
        "0": 0.005,  # 0.5% 止盈
        "15": 0.003, # 15分钟后 0.3% 止盈
    }
    
    # 强制5分钟后平仓（通过ROI实现接近效果）
    # 实际实盘需要自定义逻辑
    
    # 预热周期
    startup_candle_count: int = 60
    
    # 策略参数
    breakout_period = 20      # 突破周期
    volume_ma_period = 50     # 成交量均线周期
    volume_multiplier = 1.8   # 成交量倍数阈值
    
    # 交易时段 (UTC小时)
    trading_hours_session1 = [0, 1, 2, 3]        # UTC 00:00-04:00
    trading_hours_session2 = [14, 15, 16, 17]    # UTC 14:00-18:00
    
    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """计算技术指标"""
        
        # 前20根K线最高价（不含当前）
        dataframe['highest_20'] = dataframe['high'].shift(1).rolling(window=self.breakout_period).max()
        
        # 50周期成交量均线
        dataframe['volume_ma'] = ta.SMA(dataframe['volume'], timeperiod=self.volume_ma_period)
        
        # 成交量脉冲检测
        dataframe['volume_spike'] = dataframe['volume'] > (dataframe['volume_ma'] * self.volume_multiplier)
        
        # 突破检测
        dataframe['breakout'] = dataframe['close'] > dataframe['highest_20']
        
        # 提取UTC小时（假设数据时间戳已对齐UTC）
        dataframe['hour'] = dataframe['date'].dt.hour
        
        # 交易时段检测
        dataframe['in_session'] = dataframe['hour'].isin(
            self.trading_hours_session1 + self.trading_hours_session2
        )
        
        return dataframe
    
    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        做多信号 - 必须同时满足:
        1. 在交易时段内
        2. 收盘价突破前20根K线最高点  
        3. 成交量 > 50MA * 1.8
        """
        dataframe.loc[
            (
                (dataframe['in_session'] == True) &       # 交易时段
                (dataframe['breakout'] == True) &         # 突破
                (dataframe['volume_spike'] == True) &     # 放量
                (dataframe['volume'] > 0)                 # 有效K线
            ),
            'enter_long'] = 1
        
        return dataframe
    
    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        主动出场信号 - 止盈止损由 stoploss 和 minimal_roi 处理
        这里可以添加额外的出场逻辑（如超时强平）
        """
        # 暂时不设置主动出场，依赖ROI和止损
        # 实盘可添加：持仓超过1根K线强制平仓
        
        return dataframe
    
    def custom_stake_amount(self, pair: str, current_time, current_rate: float,
                           proposed_stake: float, min_stake: float, max_stake: float,
                           leverage: float, entry_tag: str, side: str, **kwargs) -> float:
        """
        自定义仓位计算
        单笔风险3%（9U），止损0.33% → 开仓约270U名义价值
        """
        # 账户余额 * 0.03 / 0.0033 = 开仓名义价值
        # 但这里freqtrade可能有限制，先用默认
        return proposed_stake
    
    def leverage(self, pair: str, current_time, current_rate: float,
                 proposed_leverage: float, max_leverage: float, entry_tag: str,
                 side: str, **kwargs) -> float:
        """返回10x杠杆"""
        return 10.0
