"""Induced from smart-money wallet analysis, 2026-07-07.

Source: 10 verified profitable Hyperliquid wallets (4 discovered via X/grok +
6 via official leaderboard, all verified on-chain via public API).

Factors encoded (wallets that showed them):
- Coin universe = majors + HYPE: BTC/ETH/SOL/HYPE dominate every book
  (Abraxas x2, pension-usdt.eth, 0x15b3, 0x6666, 0x082e, 0xbadb)
- Both directions profitable: HYPE longs (0x6666/0x082e) coexist with
  Abraxas HYPE shorts -> can_short = True
- Conviction swing archetype: enter big, hold days-weeks, few adjustments
  (0x15b3: 0 fills/30d; 0x082e, 0x6666: 0 fills/14d; 0xbadb: 90 fills/14d)
  -> 1h timeframe, trend-following with multi-day ROI horizon
- Dip-buying in trend (0x15b3 bought crash dips; 0xbadb ETH pullbacks)
  -> long entry = uptrend + RSI pullback; short = downtrend + RSI rally fade
  (Abraxas shorts into strength)
- Effective account leverage ~3-6x despite 10-40x per-position settings
  -> fixed leverage 3 (conservative end)

NOT encoded: the high-frequency order-working style (Abraxas, pension,
0xad22, 0xe097) - not reproducible on 1h candles; imitation, not cloning.
"""
from freqtrade.strategy import IStrategy
import talib.abstract as ta
from pandas import DataFrame


class SmartMoneySwing(IStrategy):
    INTERFACE_VERSION = 3
    timeframe = "1h"
    can_short = True
    startup_candle_count = 60

    # hold days: decaying ROI target over ~4 days (keys are MINUTES)
    minimal_roi = {"0": 0.15, "2880": 0.08, "5760": 0.04}
    stoploss = -0.08
    trailing_stop = True
    trailing_stop_positive = 0.02
    trailing_stop_positive_offset = 0.06
    trailing_only_offset_is_reached = True

    def leverage(self, pair, current_time, current_rate,
                 proposed_leverage, max_leverage, entry_tag, side, **kwargs):
        return 3

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe["ema20"] = ta.EMA(dataframe, timeperiod=20)
        dataframe["ema50"] = ta.EMA(dataframe, timeperiod=50)
        dataframe["rsi"] = ta.RSI(dataframe, timeperiod=14)
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (dataframe["ema20"] > dataframe["ema50"])
            & (dataframe["rsi"] < 40)
            & (dataframe["volume"] > 0),
            "enter_long"] = 1
        dataframe.loc[
            (dataframe["ema20"] < dataframe["ema50"])
            & (dataframe["rsi"] > 60)
            & (dataframe["volume"] > 0),
            "enter_short"] = 1
        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # trend-flip exit: low win rate on its own (v1: 19%) but cuts losers
        # before the -8% stop; removing it made results far worse (v2).
        dataframe.loc[
            (dataframe["ema20"] < dataframe["ema50"])
            & (dataframe["ema20"].shift(1) >= dataframe["ema50"].shift(1)),
            "exit_long"] = 1
        dataframe.loc[
            (dataframe["ema20"] > dataframe["ema50"])
            & (dataframe["ema20"].shift(1) <= dataframe["ema50"].shift(1)),
            "exit_short"] = 1
        return dataframe
