From d83f24ceea24382cf29772e84c524f6e3eb0b506 Mon Sep 17 00:00:00 2001 From: Pigbibi <20649888+Pigbibi@users.noreply.github.com> Date: Sun, 1 Nov 2026 15:02:26 +0800 Subject: [PATCH] fix: Restore Global ETF selection for new targets Co-Authored-By: Codex --- platform-config.json | 14 +++--- python/tests/test_frozen_selection.py | 28 ++++++++--- python/tests/test_runtime_settings.py | 17 ++++--- .../frozen_strategy_selection_validation.mjs | 48 ++++++++++++++++++- web/strategy-switch-console/config.js | 24 +++++----- .../runtime-catalog-projection.json | 24 +++++----- .../strategy-profiles.example.json | 2 +- .../strategy_profiles_asset.js | 14 +++--- 8 files changed, 122 insertions(+), 49 deletions(-) diff --git a/platform-config.json b/platform-config.json index 890d7836..f7e4cca0 100644 --- a/platform-config.json +++ b/platform-config.json @@ -697,17 +697,19 @@ } }, "global_etf_rotation": { - "frozen": true, + "frozen": false, "label": "全球ETF轮动", "label_en": "Global ETF Rotation", "domain": "us_equity", - "runtime_enabled": false, - "lifecycle_stage": "research_active", - "can_switch_live": false, + "runtime_enabled": true, + "lifecycle_stage": "runtime_enabled", + "can_switch_live": true, "allowed_execution_modes": [ - "dry_run" + "paper", + "dry_run", + "live" ], - "blocked_live_reason": "research_backtest_only_requires_evidence_package", + "blocked_live_reason": null, "live_continuity": { "eligible": true, "allowed_platforms": [ diff --git a/python/tests/test_frozen_selection.py b/python/tests/test_frozen_selection.py index 0f05a73a..05c63b42 100644 --- a/python/tests/test_frozen_selection.py +++ b/python/tests/test_frozen_selection.py @@ -21,15 +21,11 @@ def load(name): class FrozenSelectionTest(unittest.TestCase): def test_full_target_validation_rejects_retired_profile_spellings(self): cases = ( - ('examples/targets/ibkr/us_combo.example.json', 'global_etf_rotation'), ('python/tests/fixtures/retired_hk_combo_target.json', 'hk_global_etf_tactical_rotation'), ('python/tests/fixtures/retired_cn_combo_target.json', 'cn_industry_etf_rotation'), ) for filename, canonical in cases: profiles = [canonical, canonical.replace('_', '-'), canonical.upper().replace('_', '-')] - if canonical == 'global_etf_rotation': - profiles.extend(('global_macro_etf_rotation', 'global-macro-etf-rotation', - 'global_etf_confidence_vol_gate', 'global-etf-confidence-vol-gate')) for profile in profiles: with self.subTest(profile=profile): target = json.loads((ROOT / filename).read_text()) @@ -40,7 +36,7 @@ def test_full_target_validation_rejects_retired_profile_spellings(self): self.assertEqual(target, original) def test_core_profile_spellings_keep_existing_dry_run_policy(self): - cores = ('tqqq_growth_income', 'soxl_soxx_trend_income', + cores = ('global_etf_rotation', 'tqqq_growth_income', 'soxl_soxx_trend_income', 'russell_top50_leader_rotation', 'ibit_smart_dca', 'nasdaq_sp500_smart_dca') for canonical in cores: for profile in (canonical, canonical.replace('_', '-')): @@ -50,6 +46,24 @@ def test_core_profile_spellings_keep_existing_dry_run_policy(self): {'platform_id': 'ibkr', 'strategy_profile': profile, 'execution_mode': 'dry_run'}, errors) self.assertEqual(errors, []) + def test_global_etf_new_targets_accept_live_without_legacy_continuity(self): + profiles = ('global_etf_rotation', 'global-etf-rotation', + 'global_macro_etf_rotation', 'global-etf-confidence-vol-gate') + for platform in ('ibkr', 'longbridge', 'schwab', 'firstrade'): + for profile in profiles: + for mode in ('live', 'dry_run'): + with self.subTest(platform=platform, profile=profile, mode=mode): + target = {'platform_id': platform, 'strategy_profile': profile, 'execution_mode': mode} + original = copy.deepcopy(target) + errors = [] + runtime.validate_runtime_target_strategy_policy(target, errors) + self.assertEqual(errors, []) + self.assertEqual(target, original) + errors = [] + runtime.validate_runtime_target_strategy_policy( + {'platform_id': 'binance', 'strategy_profile': 'global_etf_rotation', 'execution_mode': 'live'}, errors) + self.assertTrue(any('domain us_equity is not supported' in error for error in errors)) + def test_display_alias_cannot_skip_strategy_policy(self): errors = [] runtime.validate_runtime_target_strategy_policy( @@ -79,7 +93,7 @@ def test_ssot_projection_and_boolean_validation(self): config = build.load_config() entries = {p['profile']: p for p in build.strategy_to_json_compat(config['strategies'])} frozen = {p for p, item in config['strategies'].items() if item.get('frozen') is True} - self.assertEqual(len(frozen), 14) + self.assertEqual(len(frozen), 13) self.assertTrue(all(entries[p]['frozen'] is True for p in frozen)) self.assertTrue(all(not entries[p].get('frozen', False) for p in ('tqqq_growth_income', 'soxl_soxx_trend_income', 'russell_top50_leader_rotation', 'ibit_smart_dca', 'nasdaq_sp500_smart_dca', 'us_equity_combo', 'crypto_btc_dca'))) config['strategies']['global_etf_rotation']['frozen'] = 'true' @@ -87,6 +101,8 @@ def test_ssot_projection_and_boolean_validation(self): def test_new_frozen_selection_and_valid_risk_reducing_continuity(self): config = build.load_config() + # Synthetic freeze keeps coverage of the independent safety policy. + config['strategies']['global_etf_rotation']['frozen'] = True with patch.object(runtime, 'load_platform_config', return_value=config): for profile in ('global_etf_rotation', 'global_macro_etf_rotation', 'global_etf_confidence_vol_gate'): for mode in ('dry_run', 'paper', 'live'): diff --git a/python/tests/test_runtime_settings.py b/python/tests/test_runtime_settings.py index b5a92a05..bd1f9c2e 100644 --- a/python/tests/test_runtime_settings.py +++ b/python/tests/test_runtime_settings.py @@ -688,12 +688,12 @@ def test_platform_health_report_summarizes_current_config(self): self.assertEqual(report["status"], "attention_required") self.assertEqual(report["schema_version"], "platform_health_report.v1") - self.assertEqual(report["summary"]["runtime_enabled_switchable_count"], 4) + self.assertEqual(report["summary"]["runtime_enabled_switchable_count"], 5) self.assertIn("codex_repair_context", report) self.assertIn("automation_registry", report) self.assertIn("automation_lane_counts", report["summary"]) self.assertEqual(report["summary"]["dry_run_uncovered_strategy_count"], 0) - self.assertEqual(report["summary"]["dry_run_covered_strategy_count"], 13) + self.assertEqual(report["summary"]["dry_run_covered_strategy_count"], 14) self.assertGreater(report["summary"]["dry_run_route_count"], 0) self.assertGreater( report["summary"]["declared_dry_run_route_count"], @@ -735,7 +735,7 @@ def test_strategy_platform_dry_run_coverage_uses_verified_snapshot_artifact(self self.assertEqual(route["blocked_reason"], "frozen_for_new_selection") self.assertNotIn("hk_low_vol_dividend_quality_snapshot", coverage["artifact_blocked_profiles"]) self.assertEqual(coverage["summary"]["declared_dry_run_route_count"], 63) - self.assertEqual(coverage["summary"]["buildable_dry_run_route_count"], 40) + self.assertEqual(coverage["summary"]["buildable_dry_run_route_count"], 44) def test_feature_snapshot_platform_coverage_matches_runtime_injection(self): self.assertEqual( @@ -914,6 +914,7 @@ def test_confirmed_legacy_ibkr_profiles_are_continuity_eligible(self): strategy = build_config.load_config()["strategies"][profile] restored_live = { + "global_etf_rotation", "tqqq_growth_income", "russell_top50_leader_rotation", } @@ -1067,7 +1068,7 @@ def test_runtime_catalog_projection_is_exact_and_never_claims_observed_runtime(s projection["summary"]["strategy_profile_count"], len(config["strategies"]), ) - self.assertEqual(projection["summary"]["live_switchable_count"], 4) + self.assertEqual(projection["summary"]["live_switchable_count"], 5) self.assertEqual( projection["source"]["content_sha256"], build_platform_config._config_content_sha256(config), @@ -1084,7 +1085,7 @@ def test_historical_lifecycle_inventory_is_explicitly_non_authoritative(self): self.assertEqual(matrix["superseded_by"]["candidate_lifecycle"], "GET /api/control-plane") self.assertEqual(matrix["superseded_by"]["target_execution_evidence"], "GET /api/execution-evidence") - def test_global_and_hk_global_etf_rotation_profiles_are_research_only(self): + def test_hk_global_etf_rotation_profile_remains_research_only(self): expected = { "lifecycle_stage": "research_active", "runtime_enabled": False, @@ -1100,7 +1101,7 @@ def test_global_and_hk_global_etf_rotation_profiles_are_research_only(self): ) } - for profile in ("global_etf_rotation", "hk_global_etf_tactical_rotation"): + for profile in ("hk_global_etf_tactical_rotation",): with self.subTest(profile=profile): self.assertEqual( {field: config["strategies"][profile][field] for field in expected}, @@ -3802,7 +3803,9 @@ def disabled_profile_target_pair(self, variable_scope="environment"): return [old_target], [new_target] def test_frozen_existing_disabled_target_can_move_to_core_only_after_disabled_readback(self): - self.enterContext(patch.object(runtime_settings, "load_platform_config", return_value=build_config.load_config())) + config = build_config.load_config() + config["strategies"]["global_etf_rotation"]["frozen"] = True + self.enterContext(patch.object(runtime_settings, "load_platform_config", return_value=config)) args = build_runtime_switch.build_parser().parse_args([ "--platform", "longbridge", "--target-name", "paper", "--strategy-profile", "tqqq_growth_income", "--execution-mode", "dry_run", "--variable-scope", "environment", "--github-environment", "longbridge-paper", diff --git a/tests/frozen_strategy_selection_validation.mjs b/tests/frozen_strategy_selection_validation.mjs index cfd3f61d..b105046b 100644 --- a/tests/frozen_strategy_selection_validation.mjs +++ b/tests/frozen_strategy_selection_validation.mjs @@ -4,7 +4,7 @@ import { DEFAULT_STRATEGY_PROFILES } from '../web/strategy-switch-console/strate import { PLATFORM_CONFIG } from '../web/strategy-switch-console/config.js'; const frozen = DEFAULT_STRATEGY_PROFILES.filter(p => p.frozen === true); -assert.equal(frozen.length, 14); +assert.equal(frozen.length, 13); for (const item of frozen) { const platform = item.domain === 'cn_equity' ? 'qmt' : 'ibkr'; const account = {key:'synthetic', supported_domains:[item.domain]}; @@ -13,6 +13,28 @@ for (const item of frozen) { assert.equal(__test.accountDraftStrategyChoices(platform, account, stale).length, 0); assert.throws(() => __test.assertStrategyAllowedForAccount({platform, strategy_profile:item.profile, execution_mode:'dry_run'}, account, stale), /frozen/); } +// The bundled Global ETFs policy permits new compatible targets without continuity. +const globalPolicy = DEFAULT_STRATEGY_PROFILES.find(p => p.profile === 'global_etf_rotation'); +const restored = __test.normalizeStrategyProfilesPayload([globalPolicy]); +assert.equal(restored[0].runtime_enabled, true); +assert.equal(restored[0].can_switch_live, true); +assert.notEqual(restored[0].frozen, true); +for (const platform of ['ibkr', 'longbridge', 'schwab', 'firstrade']) { + const account = {key:'synthetic-new', supported_domains:['us_equity']}; + assert(__test.accountDraftStrategyChoices(platform, account, restored) + .some(p => p.profile === 'global_etf_rotation')); + for (const execution_mode of ['live', 'dry_run']) { + assert.doesNotThrow(() => __test.assertStrategyAllowedForAccount( + {platform, strategy_profile:'global_etf_rotation', execution_mode}, account, restored)); + } +} +assert.throws(() => __test.assertStrategyAllowedForAccount( + {platform:'binance', strategy_profile:'global_etf_rotation', execution_mode:'live'}, + {key:'synthetic-crypto', supported_domains:['crypto']}, restored), /domain/); + +// A synthetic freeze retains the independent stale-catalog and continuity tests. +const originalGlobalFrozen = globalPolicy.frozen; +globalPolicy.frozen = true; const retired = ['global_etf_rotation', 'global_macro_etf_rotation', 'global_etf_confidence_vol_gate']; const core = ['tqqq_growth_income', 'soxl_soxx_trend_income', 'russell_top50_leader_rotation', 'ibit_smart_dca', 'nasdaq_sp500_smart_dca']; const stale = __test.normalizeStrategyProfilesPayload([...retired, ...core].map(profile => ({profile, domain: 'us_equity', allowed_execution_modes: ['paper', 'dry_run']}))); @@ -94,6 +116,30 @@ for (const [canonical, platform, alias] of [ assert.equal(result.status, 409, alias); assert.equal(aliasWrites, 0, alias); } +globalPolicy.frozen = originalGlobalFrozen; +// A registered target can select Global ETFs without legacy continuity. +const restoredKv = new Map([ + ['strategy_profiles', JSON.stringify(DEFAULT_STRATEGY_PROFILES)], + ['account_options', JSON.stringify({ibkr:[]})], +]); +const restoredEnv = {STRATEGY_SWITCH_SYNC_TOKEN:'synthetic', STRATEGY_SWITCH_CONFIG:{ + get:async key => restoredKv.get(key) || null, + put:async (key, value) => {restoredKv.set(key, value);}, +}}; +const newTarget = {...payload, target_name:'synthetic-new', account_selector:'SYNTHETIC_NEW', + deployment_selector:'synthetic-new', account_scope:'synthetic-new', service_name:'synthetic-new-service'}; +for (const key of ['live_continuity_state', 'live_continuity_baseline_id', 'live_continuity_captured_at']) { + delete newTarget[key]; +} +restoredKv.set('account_options', JSON.stringify({ibkr:[{ + key:'synthetic-new', label:'Synthetic new target', target_name:newTarget.target_name, + account_selector:newTarget.account_selector, deployment_selector:newTarget.deployment_selector, + account_scope:newTarget.account_scope, service_name:newTarget.service_name, + supported_domains:['us_equity'], default_strategy_profile:'tqqq_growth_income', +}]})); +const newTargetResponse = await worker.fetch(request(newTarget), restoredEnv); +assert.equal(newTargetResponse.status, 200, JSON.stringify(await newTargetResponse.clone().json())); +assert.equal((await newTargetResponse.json()).account_options_sync.synced, true); const unchanged = __test.normalizeStrategyProfilesPayload([ {profile:'tqqq-growth-income', domain:'us_equity', allowed_execution_modes:['dry_run']}, {profile:'synthetic-unknown', domain:'us_equity', allowed_execution_modes:['dry_run']}, diff --git a/web/strategy-switch-console/config.js b/web/strategy-switch-console/config.js index dda6a3c3..9d175a96 100644 --- a/web/strategy-switch-console/config.js +++ b/web/strategy-switch-console/config.js @@ -162,7 +162,7 @@ export const RUNTIME_CATALOG_PROJECTION = { "data_status": "catalog_only", "source": { "path": "platform-config.json", - "content_sha256": "sha256:aff12367a16bbe7ed8b53fb12481ab3abbfa14a7fb048ff51215f75867719dab", + "content_sha256": "sha256:b9952fdc4f8c52f9804ae6bee3180951b1ad452ec1bcefc56e223e2028b2cfca", "catalog_as_of": "2026-08-19" }, "policy": { @@ -186,12 +186,12 @@ export const RUNTIME_CATALOG_PROJECTION = { }, "summary": { "strategy_profile_count": 27, - "runtime_enabled_count": 4, - "live_switchable_count": 4, + "runtime_enabled_count": 5, + "live_switchable_count": 5, "lifecycle_stage_counts": { "live_candidate": 1, - "research_active": 18, - "runtime_enabled": 4, + "research_active": 17, + "runtime_enabled": 5, "shadow_active": 4 } }, @@ -280,14 +280,16 @@ export const RUNTIME_CATALOG_PROJECTION = { "label_en": "Global ETF Rotation", "label_zh": "全球ETF轮动", "domain": "us_equity", - "lifecycle_stage": "research_active", - "runtime_enabled": false, - "frozen": true, - "can_switch_live": false, + "lifecycle_stage": "runtime_enabled", + "runtime_enabled": true, + "frozen": false, + "can_switch_live": true, "allowed_execution_modes": [ - "dry_run" + "paper", + "dry_run", + "live" ], - "blocked_live_reason": "research_backtest_only_requires_evidence_package" + "blocked_live_reason": "" }, { "profile": "russell_top50_leader_rotation", diff --git a/web/strategy-switch-console/runtime-catalog-projection.json b/web/strategy-switch-console/runtime-catalog-projection.json index c9e1efaa..46654e81 100644 --- a/web/strategy-switch-console/runtime-catalog-projection.json +++ b/web/strategy-switch-console/runtime-catalog-projection.json @@ -22,7 +22,7 @@ "schema_version": "qsl.runtime_catalog_projection.v1", "source": { "catalog_as_of": "2026-08-19", - "content_sha256": "sha256:aff12367a16bbe7ed8b53fb12481ab3abbfa14a7fb048ff51215f75867719dab", + "content_sha256": "sha256:b9952fdc4f8c52f9804ae6bee3180951b1ad452ec1bcefc56e223e2028b2cfca", "path": "platform-config.json" }, "strategies": [ @@ -106,18 +106,20 @@ }, { "allowed_execution_modes": [ - "dry_run" + "paper", + "dry_run", + "live" ], - "blocked_live_reason": "research_backtest_only_requires_evidence_package", - "can_switch_live": false, + "blocked_live_reason": "", + "can_switch_live": true, "domain": "us_equity", - "frozen": true, + "frozen": false, "label": "全球ETF轮动", "label_en": "Global ETF Rotation", "label_zh": "全球ETF轮动", - "lifecycle_stage": "research_active", + "lifecycle_stage": "runtime_enabled", "profile": "global_etf_rotation", - "runtime_enabled": false + "runtime_enabled": true }, { "allowed_execution_modes": [ @@ -440,12 +442,12 @@ "summary": { "lifecycle_stage_counts": { "live_candidate": 1, - "research_active": 18, - "runtime_enabled": 4, + "research_active": 17, + "runtime_enabled": 5, "shadow_active": 4 }, - "live_switchable_count": 4, - "runtime_enabled_count": 4, + "live_switchable_count": 5, + "runtime_enabled_count": 5, "strategy_profile_count": 27 } } diff --git a/web/strategy-switch-console/strategy-profiles.example.json b/web/strategy-switch-console/strategy-profiles.example.json index 6d8fa0b3..f8d13540 100644 --- a/web/strategy-switch-console/strategy-profiles.example.json +++ b/web/strategy-switch-console/strategy-profiles.example.json @@ -1 +1 @@ -[{"profile":"tqqq_growth_income","label":"纳斯达克增长收益","label_en":"NASDAQ Growth Income","label_zh":"纳斯达克增长收益","domain":"us_equity","runtime_enabled":true,"income_layer_enabled":true,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"runtime_enabled","can_switch_live":true,"allowed_execution_modes":["paper","dry_run","live"],"blocked_live_reason":"","live_continuity":{"eligible":true,"allowed_platforms":["ibkr"]},"income_layer_start_usd":"250000","income_layer_max_ratio":"0.55","income_layer_allocations":{"SCHD":0.3,"DGRO":0.2,"SGOV":0.4,"SPYI":0.08,"QQQI":0.02}},{"profile":"soxl_soxx_trend_income","label":"半导体趋势收益","label_en":"Semiconductor Trend Income","label_zh":"半导体趋势收益","domain":"us_equity","runtime_enabled":true,"income_layer_enabled":true,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"runtime_enabled","can_switch_live":true,"allowed_execution_modes":["paper","dry_run","live"],"blocked_live_reason":"","live_continuity":{"eligible":true,"allowed_platforms":["longbridge","ibkr","schwab"]},"income_layer_start_usd":"150000","income_layer_max_ratio":"0.95","income_layer_allocations":{"SCHD":0.15,"DGRO":0.1,"SGOV":0.7,"SPYI":0.04,"QQQI":0.01}},{"profile":"soxl_soxx_core_only_p2_v7_longterm_compounding_cash_reserve","label":"SOXL/SOXX 核心复利(现金保留)","label_en":"SOXL/SOXX Core Compounding (Cash Reserve)","label_zh":"SOXL/SOXX 核心复利(现金保留)","domain":"us_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"research_only_named_profile","live_continuity":{"eligible":false,"allowed_platforms":[]},"research_candidate_identity":{"candidate_id":"soxl_soxx_core_only_p2_v7_longterm_compounding_cash_reserve","config_sha256":"843ab4e93e81985c2b3becc61a2f0b971508ccf25afa59acf402e75f574514d1"}},{"profile":"nasdaq_sp500_smart_dca","label":"纳指标普定投","label_en":"NASDAQ/S&P 500 DCA","label_zh":"纳指标普定投","domain":"us_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"missing_current_promotion_evidence_and_preauthorized_autonomy_policy","live_continuity":{"eligible":false,"allowed_platforms":[]},"dca_enabled":true,"dca_default_mode":"fixed","dca_default_base_investment_usd":"1000"},{"profile":"ibit_smart_dca","label":"IBIT比特币定投","label_en":"IBIT Bitcoin DCA","label_zh":"IBIT比特币定投","domain":"us_equity","runtime_enabled":true,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"runtime_enabled","can_switch_live":true,"allowed_execution_modes":["paper","dry_run","live"],"blocked_live_reason":"","live_continuity":{"eligible":true,"allowed_platforms":["firstrade"]},"dca_enabled":true,"dca_default_mode":"fixed","dca_default_base_investment_usd":"1000"},{"profile":"global_etf_rotation","label":"全球ETF轮动","label_en":"Global ETF Rotation","label_zh":"全球ETF轮动","domain":"us_equity","runtime_enabled":false,"income_layer_enabled":true,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":true,"allowed_platforms":["ibkr"]},"income_layer_start_usd":"500000","income_layer_max_ratio":"0.15","income_layer_allocations":{"SCHD":0.4,"DGRO":0.25,"SGOV":0.3,"SPYI":0.05}},{"profile":"russell_top50_leader_rotation","label":"罗素Top50领涨","label_en":"Russell Top50 Leaders","label_zh":"罗素Top50领涨","domain":"us_equity","runtime_enabled":true,"income_layer_enabled":true,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"runtime_enabled","can_switch_live":true,"allowed_execution_modes":["paper","dry_run","live"],"blocked_live_reason":"","live_continuity":{"eligible":true,"allowed_platforms":["ibkr","longbridge"]},"income_layer_start_usd":"300000","income_layer_max_ratio":"0.25","income_layer_allocations":{"SCHD":0.45,"DGRO":0.3,"SGOV":0.25}},{"profile":"tecl_xlk_trend_income","label":"TECL/XLK趋势收益","label_en":"TECL/XLK Trend Income","label_zh":"TECL/XLK趋势收益","domain":"us_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"failed_promotion_vs_live_profiles","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"us_equity_combo","label":"美股核心收益组合","label_en":"US Core Income Combo","label_zh":"美股核心收益组合","domain":"us_equity","runtime_enabled":false,"income_layer_enabled":true,"option_overlay_enabled":false,"combo_enabled":true,"lifecycle_stage":"shadow_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"shadow_candidate_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]},"combo_mode":"dynamic","income_layer_start_usd":"300000","income_layer_max_ratio":"0.25","income_layer_allocations":{"SCHD":0.25,"DGRO":0.25,"SGOV":0.2,"SPYI":0.15,"QQQI":0.15}},{"profile":"us_equity_combo_core","label":"美股核心组合","label_en":"US Core Combo","label_zh":"美股核心组合","domain":"us_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":true,"lifecycle_stage":"shadow_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"shadow_candidate_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]},"combo_mode":"dynamic"},{"profile":"us_equity_combo_leveraged","label":"美股加速组合","label_en":"US Alpha Combo","label_zh":"美股加速组合","domain":"us_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":true,"lifecycle_stage":"shadow_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"shadow_candidate_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]},"combo_mode":"dynamic"},{"profile":"hk_global_etf_tactical_rotation","label":"港股ETF战术轮动","label_en":"HK ETF Tactical Rotation","label_zh":"港股ETF战术轮动","domain":"hk_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"hk_low_vol_dividend_quality_snapshot","label":"港股红利质量","label_en":"HK Dividend Quality","label_zh":"港股红利质量","domain":"hk_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"missing_current_promotion_evidence_and_preauthorized_autonomy_policy","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"hk_equity_combo","label":"港股恒生组合","label_en":"HK Core Combo","label_zh":"港股恒生组合","domain":"hk_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":true,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]},"combo_mode":"dynamic"},{"profile":"cn_industry_etf_rotation","label":"A股行业ETF轮动","label_en":"CN Industry ETF Rotation","label_zh":"A股行业ETF轮动","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"missing_current_promotion_evidence_and_preauthorized_autonomy_policy","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_industry_etf_rotation_aggressive","label":"A股ETF轮动","label_en":"CN ETF Rotation","label_zh":"A股ETF轮动","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"live_candidate","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"live_candidate_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_index_etf_tactical_rotation","label":"A股宽基ETF战术轮动","label_en":"CN Index ETF Tactical Rotation","label_zh":"A股宽基ETF战术轮动","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_chinext_tactical_rotation","label":"创业板战术轮动","label_en":"CN ChiNext Tactical Rotation","label_zh":"创业板战术轮动","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_chinext_growth_momentum_quality","label":"创业板成长动量质量","label_en":"CN ChiNext Growth Momentum Quality","label_zh":"创业板成长动量质量","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_dividend_quality_snapshot","label":"A股红利质量","label_en":"CN Dividend Quality","label_zh":"A股红利质量","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_chinext_growth_momentum_quality_snapshot","label":"创业板成长质量快照","label_en":"CN ChiNext Growth Quality Snapshot","label_zh":"创业板成长质量快照","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_star_growth_momentum_quality","label":"科创板成长动量质量","label_en":"CN STAR Growth Momentum Quality","label_zh":"科创板成长动量质量","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_equity_combo","label":"A股进取组合","label_en":"CN Alpha Combo","label_zh":"A股进取组合","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":true,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]},"combo_mode":"dynamic"},{"profile":"crypto_live_pool_rotation","label":"加密池轮动","label_en":"Crypto Pool Rotation","label_zh":"加密池轮动","domain":"crypto","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"missing_current_promotion_evidence_and_preauthorized_autonomy_policy","live_continuity":{"eligible":true,"allowed_platforms":["binance"]}},{"profile":"crypto_btc_dca","label":"BTC定投","label_en":"BTC DCA","label_zh":"BTC定投","domain":"crypto","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"shadow_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"shadow_candidate_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"crypto_trend_rotation","label":"山寨趋势轮动","label_en":"Altcoin Trend","label_zh":"山寨趋势轮动","domain":"crypto","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"crypto_equity_combo","label":"加密动量组合","label_en":"Crypto Core Combo","label_zh":"加密动量组合","domain":"crypto","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]},"combo_mode":"dynamic"}] +[{"profile":"tqqq_growth_income","label":"纳斯达克增长收益","label_en":"NASDAQ Growth Income","label_zh":"纳斯达克增长收益","domain":"us_equity","runtime_enabled":true,"income_layer_enabled":true,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"runtime_enabled","can_switch_live":true,"allowed_execution_modes":["paper","dry_run","live"],"blocked_live_reason":"","live_continuity":{"eligible":true,"allowed_platforms":["ibkr"]},"income_layer_start_usd":"250000","income_layer_max_ratio":"0.55","income_layer_allocations":{"SCHD":0.3,"DGRO":0.2,"SGOV":0.4,"SPYI":0.08,"QQQI":0.02}},{"profile":"soxl_soxx_trend_income","label":"半导体趋势收益","label_en":"Semiconductor Trend Income","label_zh":"半导体趋势收益","domain":"us_equity","runtime_enabled":true,"income_layer_enabled":true,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"runtime_enabled","can_switch_live":true,"allowed_execution_modes":["paper","dry_run","live"],"blocked_live_reason":"","live_continuity":{"eligible":true,"allowed_platforms":["longbridge","ibkr","schwab"]},"income_layer_start_usd":"150000","income_layer_max_ratio":"0.95","income_layer_allocations":{"SCHD":0.15,"DGRO":0.1,"SGOV":0.7,"SPYI":0.04,"QQQI":0.01}},{"profile":"soxl_soxx_core_only_p2_v7_longterm_compounding_cash_reserve","label":"SOXL/SOXX 核心复利(现金保留)","label_en":"SOXL/SOXX Core Compounding (Cash Reserve)","label_zh":"SOXL/SOXX 核心复利(现金保留)","domain":"us_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"research_only_named_profile","live_continuity":{"eligible":false,"allowed_platforms":[]},"research_candidate_identity":{"candidate_id":"soxl_soxx_core_only_p2_v7_longterm_compounding_cash_reserve","config_sha256":"843ab4e93e81985c2b3becc61a2f0b971508ccf25afa59acf402e75f574514d1"}},{"profile":"nasdaq_sp500_smart_dca","label":"纳指标普定投","label_en":"NASDAQ/S&P 500 DCA","label_zh":"纳指标普定投","domain":"us_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"missing_current_promotion_evidence_and_preauthorized_autonomy_policy","live_continuity":{"eligible":false,"allowed_platforms":[]},"dca_enabled":true,"dca_default_mode":"fixed","dca_default_base_investment_usd":"1000"},{"profile":"ibit_smart_dca","label":"IBIT比特币定投","label_en":"IBIT Bitcoin DCA","label_zh":"IBIT比特币定投","domain":"us_equity","runtime_enabled":true,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"runtime_enabled","can_switch_live":true,"allowed_execution_modes":["paper","dry_run","live"],"blocked_live_reason":"","live_continuity":{"eligible":true,"allowed_platforms":["firstrade"]},"dca_enabled":true,"dca_default_mode":"fixed","dca_default_base_investment_usd":"1000"},{"profile":"global_etf_rotation","label":"全球ETF轮动","label_en":"Global ETF Rotation","label_zh":"全球ETF轮动","domain":"us_equity","runtime_enabled":true,"income_layer_enabled":true,"option_overlay_enabled":false,"combo_enabled":false,"frozen":false,"lifecycle_stage":"runtime_enabled","can_switch_live":true,"allowed_execution_modes":["paper","dry_run","live"],"blocked_live_reason":"","live_continuity":{"eligible":true,"allowed_platforms":["ibkr"]},"income_layer_start_usd":"500000","income_layer_max_ratio":"0.15","income_layer_allocations":{"SCHD":0.4,"DGRO":0.25,"SGOV":0.3,"SPYI":0.05}},{"profile":"russell_top50_leader_rotation","label":"罗素Top50领涨","label_en":"Russell Top50 Leaders","label_zh":"罗素Top50领涨","domain":"us_equity","runtime_enabled":true,"income_layer_enabled":true,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"runtime_enabled","can_switch_live":true,"allowed_execution_modes":["paper","dry_run","live"],"blocked_live_reason":"","live_continuity":{"eligible":true,"allowed_platforms":["ibkr","longbridge"]},"income_layer_start_usd":"300000","income_layer_max_ratio":"0.25","income_layer_allocations":{"SCHD":0.45,"DGRO":0.3,"SGOV":0.25}},{"profile":"tecl_xlk_trend_income","label":"TECL/XLK趋势收益","label_en":"TECL/XLK Trend Income","label_zh":"TECL/XLK趋势收益","domain":"us_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"failed_promotion_vs_live_profiles","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"us_equity_combo","label":"美股核心收益组合","label_en":"US Core Income Combo","label_zh":"美股核心收益组合","domain":"us_equity","runtime_enabled":false,"income_layer_enabled":true,"option_overlay_enabled":false,"combo_enabled":true,"lifecycle_stage":"shadow_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"shadow_candidate_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]},"combo_mode":"dynamic","income_layer_start_usd":"300000","income_layer_max_ratio":"0.25","income_layer_allocations":{"SCHD":0.25,"DGRO":0.25,"SGOV":0.2,"SPYI":0.15,"QQQI":0.15}},{"profile":"us_equity_combo_core","label":"美股核心组合","label_en":"US Core Combo","label_zh":"美股核心组合","domain":"us_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":true,"lifecycle_stage":"shadow_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"shadow_candidate_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]},"combo_mode":"dynamic"},{"profile":"us_equity_combo_leveraged","label":"美股加速组合","label_en":"US Alpha Combo","label_zh":"美股加速组合","domain":"us_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":true,"lifecycle_stage":"shadow_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"shadow_candidate_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]},"combo_mode":"dynamic"},{"profile":"hk_global_etf_tactical_rotation","label":"港股ETF战术轮动","label_en":"HK ETF Tactical Rotation","label_zh":"港股ETF战术轮动","domain":"hk_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"hk_low_vol_dividend_quality_snapshot","label":"港股红利质量","label_en":"HK Dividend Quality","label_zh":"港股红利质量","domain":"hk_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"missing_current_promotion_evidence_and_preauthorized_autonomy_policy","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"hk_equity_combo","label":"港股恒生组合","label_en":"HK Core Combo","label_zh":"港股恒生组合","domain":"hk_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":true,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]},"combo_mode":"dynamic"},{"profile":"cn_industry_etf_rotation","label":"A股行业ETF轮动","label_en":"CN Industry ETF Rotation","label_zh":"A股行业ETF轮动","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"missing_current_promotion_evidence_and_preauthorized_autonomy_policy","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_industry_etf_rotation_aggressive","label":"A股ETF轮动","label_en":"CN ETF Rotation","label_zh":"A股ETF轮动","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"live_candidate","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"live_candidate_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_index_etf_tactical_rotation","label":"A股宽基ETF战术轮动","label_en":"CN Index ETF Tactical Rotation","label_zh":"A股宽基ETF战术轮动","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_chinext_tactical_rotation","label":"创业板战术轮动","label_en":"CN ChiNext Tactical Rotation","label_zh":"创业板战术轮动","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_chinext_growth_momentum_quality","label":"创业板成长动量质量","label_en":"CN ChiNext Growth Momentum Quality","label_zh":"创业板成长动量质量","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_dividend_quality_snapshot","label":"A股红利质量","label_en":"CN Dividend Quality","label_zh":"A股红利质量","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_chinext_growth_momentum_quality_snapshot","label":"创业板成长质量快照","label_en":"CN ChiNext Growth Quality Snapshot","label_zh":"创业板成长质量快照","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_star_growth_momentum_quality","label":"科创板成长动量质量","label_en":"CN STAR Growth Momentum Quality","label_zh":"科创板成长动量质量","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"cn_equity_combo","label":"A股进取组合","label_en":"CN Alpha Combo","label_zh":"A股进取组合","domain":"cn_equity","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":true,"frozen":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]},"combo_mode":"dynamic"},{"profile":"crypto_live_pool_rotation","label":"加密池轮动","label_en":"Crypto Pool Rotation","label_zh":"加密池轮动","domain":"crypto","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"missing_current_promotion_evidence_and_preauthorized_autonomy_policy","live_continuity":{"eligible":true,"allowed_platforms":["binance"]}},{"profile":"crypto_btc_dca","label":"BTC定投","label_en":"BTC DCA","label_zh":"BTC定投","domain":"crypto","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"shadow_active","can_switch_live":false,"allowed_execution_modes":["paper","dry_run"],"blocked_live_reason":"shadow_candidate_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"crypto_trend_rotation","label":"山寨趋势轮动","label_en":"Altcoin Trend","label_zh":"山寨趋势轮动","domain":"crypto","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":false,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]}},{"profile":"crypto_equity_combo","label":"加密动量组合","label_en":"Crypto Core Combo","label_zh":"加密动量组合","domain":"crypto","runtime_enabled":false,"income_layer_enabled":false,"option_overlay_enabled":false,"combo_enabled":true,"lifecycle_stage":"research_active","can_switch_live":false,"allowed_execution_modes":["dry_run"],"blocked_live_reason":"research_backtest_only_requires_evidence_package","live_continuity":{"eligible":false,"allowed_platforms":[]},"combo_mode":"dynamic"}] diff --git a/web/strategy-switch-console/strategy_profiles_asset.js b/web/strategy-switch-console/strategy_profiles_asset.js index 390c7be8..ffc03dbf 100644 --- a/web/strategy-switch-console/strategy_profiles_asset.js +++ b/web/strategy-switch-console/strategy_profiles_asset.js @@ -155,17 +155,19 @@ export const DEFAULT_STRATEGY_PROFILES = [ "label_en": "Global ETF Rotation", "label_zh": "全球ETF轮动", "domain": "us_equity", - "runtime_enabled": false, + "runtime_enabled": true, "income_layer_enabled": true, "option_overlay_enabled": false, "combo_enabled": false, - "frozen": true, - "lifecycle_stage": "research_active", - "can_switch_live": false, + "frozen": false, + "lifecycle_stage": "runtime_enabled", + "can_switch_live": true, "allowed_execution_modes": [ - "dry_run" + "paper", + "dry_run", + "live" ], - "blocked_live_reason": "research_backtest_only_requires_evidence_package", + "blocked_live_reason": "", "live_continuity": { "eligible": true, "allowed_platforms": [