# -*- coding: utf-8 -*-
"""
changelog.py — 系统更新日志
记录每次策略调整、参数变更、模块更新的历史
"""

CHANGELOG = [
    {
        "version": "v1.0",
        "date": "2026-04-07",
        "changes": [
            "初始化15因子评分系统",
            "OKX合约交易 + Deribit期权数据",
            "归一化净差法总分算法",
            "Coinglass清算地图因子",
            "DeepSeek新闻情绪分析",
        ]
    },
    {
        "version": "v1.1",
        "date": "2026-04-07",
        "changes": [
            "聪明钱因子四维升级（合约/现货分歧+稳定币+鲸鱼+TVL）",
            "权重调整：LC 0.07→0.12，SM 0.08→0.15",
            "Gamma因子连续化，逆势减半",
            "强趋势压制均值回归因子（1H+4H同向时打5折）",
        ]
    },
    {
        "version": "v1.2",
        "date": "2026-04-07 22:00",
        "changes": [
            "项目模块化重构（单体2600行→13个模块）",
            "config.py / exchange / data / factors / strategy / notify",
            "setting.py依赖去除，API Key内嵌",
            "删除reports/旧数据（~216MB），日志截断4.2MB→52KB",
        ]
    },
    {
        "version": "v1.3",
        "date": "2026-04-08 08:57",
        "changes": [
            "诊断频繁止损：1H/4H分歧期每30分钟翻转开仓",
            "新增 REQUIRE_TREND_ALIGN=True：1H+4H必须同向才能开仓",
            "SCORE_THRESHOLD: 0.25→0.35",
            "MIN_FACTORS_AGREE: 2→3",
            "止盈/止损检测bug修复：改用开仓时权益对比，扣除手续费容差",
        ]
    },
    {
        "version": "v1.4",
        "date": "2026-04-08 09:18",
        "changes": [
            "聪明钱因子(SM)暂停，权重归零",
            "SM权重0.15转移到NEWS，NEWS: 0.07→0.22",
        ]
    },
    {
        "version": "v1.5",
        "date": "2026-04-08 09:39",
        "changes": [
            "ECharts因子走势图（factor_chart.py）",
            "ETH价格归一化到[-1,1]，与因子统一坐标轴",
            "新闻/快讯事件竖线标注，开仓/平仓标记点",
            "上下双图：因子值 + 变化速率（一阶差分）",
            "自定义图例按钮：点击同步控制上下两图",
        ]
    },
    {
        "version": "v2.0",
        "date": "2026-04-08 12:36",
        "changes": [
            "因子方向校正（基于实盘观察）：",
            "  OB挂单 → 取反（买盘多=消化压力=看空）",
            "  MP期权痛点 → 取反（痛点在上方=压制回落=看空）",
            "  MR均值回归 → 取反（RSI超买+涨幅大=追涨=看多）",
            "FR资金费率 → 修复死区（0.0003→0.00005），ETH正常FR0.01%现在可产生信号",
            "权重重新标定（v2.1）：",
            "  TR⬆0.04→0.08  TK⬆0.07→0.10  VD⬆0.08→0.10",
            "  BTC⬆0.04→0.06  LC⬆0.12→0.13",
            "  OI⬇0.04→0.02  IV⬇0.04→0.02",
            "新增权重自更新模块（weight_updater.py）",
            "  基于历史快照相关性滚动调整权重，LR=0.15",
            "新增系统更新日志（changelog.py）",
        ]
    },
    {
        "version": "v2.1",
        "date": "2026-04-08 23:14",
        "changes": [
            "权重 v2.2（基于实盘观察二次校正）：",
            "  TR⬆⬆ 0.08→0.15  趋势盘核心，大幅提权",
            "  TK⬇  0.10→0.07  先验有效但信噪比一般",
            "  OI⬇  0.02→0.01  几乎无影响",
            "  FR⬇  0.04→0.02  几乎无影响",
            "  MP⬇  0.04→0.02  反向但信号稀疏",
            "  VD⬇  0.10→0.06  不稳定",
            "  BTC  0.06→0.07  趋势盘实时有效，微提",
            "  IV⬇  0.02→0.01  几乎无影响",
            "  LC⬆  0.13→0.15  有效核心",
            "  MR   0.05→0.06  震荡盘有效（趋势盘后续动态调权）",
            "  NEWS 0.17→0.19  承接降权余量",
            "图表架构升级：壳+JSON分离，JS轮询不再整页刷新，图例/缩放状态完全保留",
            "factor_chart.py --watch 后台持续更新 chart_data.json（每30秒）",
        ]
    },
]


def print_changelog(last_n=None):
    entries = CHANGELOG[-last_n:] if last_n else CHANGELOG
    for e in entries:
        print(f"\n{'='*50}")
        print(f"  {e['version']}  {e['date']}")
        print(f"{'='*50}")
        for c in e['changes']:
            print(f"  • {c}")


def latest_version():
    return CHANGELOG[-1]['version']


def changelog_for_tg(last_n=1):
    """返回适合Telegram推送的更新日志"""
    entries = CHANGELOG[-last_n:]
    lines = []
    for e in entries:
        lines.append(f"📋 *{e['version']}* `{e['date']}`")
        for c in e['changes']:
            lines.append(f"  • {c}")
    return '\n'.join(lines)


if __name__ == '__main__':
    print_changelog()
    print(f"\n当前版本: {latest_version()}")
