diff --git a/scripts/build_platform_config.py b/scripts/build_platform_config.py
index 16e6efa..7dd9459 100644
--- a/scripts/build_platform_config.py
+++ b/scripts/build_platform_config.py
@@ -229,10 +229,109 @@ def build_strategy_profiles(config: dict) -> str:
return payload
+def inject_index_html(config: dict) -> None:
+ """Inject generated config block into index.html."""
+ index_path = ROOT / "web" / "strategy-switch-console" / "index.html"
+ html = index_path.read_text(encoding="utf-8")
+
+ platforms = config["platforms"]
+ strategies = config["strategies"]
+
+ # Generate injection block
+ pc = {}
+ dao = {}
+ for pid, pdata in platforms.items():
+ caps = pdata["capabilities"]
+ depl = pdata["deployment"]
+ pc[pid] = {
+ "dry_run_only": depl.get("dry_run_only", False),
+ "margin_policy": caps.get("margin_policy", False),
+ "reserved_cash": caps.get("reserved_cash", False),
+ "income_layer": caps.get("income_layer", False),
+ "option_overlay": caps.get("option_overlay", False),
+ "dca": caps.get("dca", False),
+ "execution_mode": depl.get("default_execution_mode", "live"),
+ "service_name": depl.get("service_name", ""),
+ "default_execution_mode": depl.get("default_execution_mode", "live"),
+ }
+ acct = pdata.get("default_account", {})
+ entry = {
+ "key": acct.get("key", pid),
+ "label": acct.get("label", pdata.get("label", pid)),
+ "target_name": acct.get("target_name", acct.get("key", pid)),
+ "supported_domains": acct.get("supported_domains", pdata.get("supported_domains", [])),
+ "cash_currency": acct.get("cash_currency", "USD"),
+ }
+ for fld in ("default_strategy_profile", "service_name", "account_scope",
+ "deployment_selector", "account_selector", "default_execution_mode",
+ "min_reserved_cash_usd", "reserved_cash_ratio",
+ "cash_only_execution_mode", "dca_mode", "dca_base_investment_usd"):
+ val = acct.get(fld)
+ if val: entry[fld] = val
+ if "service_name" not in entry:
+ entry["service_name"] = depl.get("service_name", "")
+ if "default_execution_mode" not in entry:
+ entry["default_execution_mode"] = depl.get("default_execution_mode", "live")
+ dao[pid] = [entry]
+
+ dca = {}
+ inc_layer = {}
+ opt_overlay = {}
+ for sid, sdata in strategies.items():
+ feat = sdata.get("features", {})
+ dd = sdata.get("dca_defaults")
+ if dd:
+ dca[sid] = {"defaultMode": dd.get("default_mode", "fixed"),
+ "defaultBaseInvestmentUsd": str(dd.get("default_base_investment_usd", "1000"))}
+ if feat.get("income_layer"):
+ idl = sdata.get("income_layer_defaults", {})
+ inc_layer[sid] = {"startUsd": int(idl.get("start_usd", 0)),
+ "maxRatio": str(idl.get("max_ratio", "")),
+ "allocations": idl.get("allocations", {})}
+ if feat.get("option_overlay"):
+ odl = sdata.get("option_overlay_defaults", {})
+ families = []
+ if odl.get("growth_enabled"):
+ families.append({"family": "growth", "recipe": odl["growth_recipe"],
+ "startUsd": odl["growth_start_usd"],
+ "ratio": str(odl.get("nav_budget_ratio", "")), "ratioKind": "budget"})
+ if odl.get("income_enabled"):
+ families.append({"family": "income", "recipe": odl["income_recipe"],
+ "startUsd": odl["income_start_usd"],
+ "ratio": str(odl.get("nav_risk_ratio", "")), "ratioKind": "risk"})
+ opt_overlay[sid] = {"liveGate": odl.get("live_gate", ""),
+ "liveStatus": odl.get("live_status", ""),
+ "families": families}
+
+ block_lines = [
+ "",
+ '",
+ ]
+ block = "\n".join(block_lines)
+
+ # Replace existing block or inject before
+ existing_start = html.find('', existing_start) + 9
+ html = html[:existing_start] + block + html[existing_end:]
+ else:
+ head_end = html.find('')
+ html = html[:head_end] + "\n" + block + "\n" + html[head_end:]
+
+ index_path.write_text(html, encoding="utf-8")
+ print(f"Injected config into: {index_path}")
+
+
def main() -> int:
config = json.loads(SOURCE.read_text(encoding="utf-8"))
- # Generate config.js
+ # Generate config.js (ES module for worker.js)
module = build_config_module(config)
TARGET.write_text(module, encoding="utf-8")
@@ -240,6 +339,9 @@ def main() -> int:
profiles = build_strategy_profiles(config)
STRATEGY_TARGET.write_text(profiles, encoding="utf-8")
+ # Inject config block into index.html
+ inject_index_html(config)
+
print(f"Generated: {TARGET}")
print(f"Generated: {STRATEGY_TARGET}")
return 0
diff --git a/web/strategy-switch-console/index.html b/web/strategy-switch-console/index.html
index 203caf0..53fe17f 100644
--- a/web/strategy-switch-console/index.html
+++ b/web/strategy-switch-console/index.html
@@ -1317,6 +1317,16 @@
}
}
+
+
+
+
@@ -1525,7 +1535,7 @@ 切换摘要
// Alias for backward compatibility
const defaultRepositories = platformRepositories;
- const defaultAccountOptions = {
+ const defaultAccountOptions = window.__DEFAULT_ACCOUNT_OPTIONS__ || {
binance: [{"key": "default", "label": "Binance", "target_name": "default", "cash_currency": "USD", "default_strategy_profile": "crypto_equity_combo", "supported_domains": ["crypto"]}],
firstrade: [{"key": "preview", "label": "Firstrade", "target_name": "preview", "supported_domains": ["us_equity"], "cash_currency": "USD", "default_execution_mode": "live", "service_name": "firstrade-quant-service"}],
ibkr: [{"key": "preview", "label": "IBKR", "target_name": "preview", "supported_domains": ["us_equity", "hk_equity"], "cash_currency": "USD", "default_execution_mode": "live"}],
@@ -1541,7 +1551,7 @@ 切换摘要
us_equity: { zh: "美股", en: "US Equity" },
};
- const platformConfig = {
+ const platformConfig = window.__PLATFORM_CONFIG__ || {
binance: {
dry_run_only: false,
margin_policy: false,
@@ -1655,7 +1665,7 @@ 切换摘要
const incomeLayerEnabledVariable = "INCOME_LAYER_ENABLED";
const incomeLayerStartUsdVariable = "INCOME_LAYER_START_USD";
const incomeLayerMaxRatioVariable = "INCOME_LAYER_MAX_RATIO";
- const dcaProfileDefaults = {
+ const dcaProfileDefaults = window.__DCA_PROFILE_DEFAULTS__ || {
nasdaq_sp500_smart_dca: { defaultMode: "fixed", defaultBaseInvestmentUsd: "1000" },
ibit_smart_dca: { defaultMode: "fixed", defaultBaseInvestmentUsd: "1000" },
crypto_btc_dca: { defaultMode: "fixed", defaultBaseInvestmentUsd: "100" },
@@ -1733,8 +1743,8 @@ 切换摘要
maxRatio: "0.25",
allocations: { SCHD: 0.25, DGRO: 0.25, SGOV: 0.20, SPYI: 0.15, QQQI: 0.15 },
}};
- let incomeLayerDefaults = {};
- const fallbackOptionOverlayDefaults = {
+ let incomeLayerDefaults = window.__INCOME_LAYER_DEFAULTS__ || {};
+ const fallbackOptionOverlayDefaults = window.__OPTION_OVERLAY_DEFAULTS__ || {
tqqq_growth_income: {
liveGate: "promotion_required",
liveStatus: "research_only",
diff --git a/web/strategy-switch-console/page_asset.js b/web/strategy-switch-console/page_asset.js
index aaa9413..da9a6e0 100644
--- a/web/strategy-switch-console/page_asset.js
+++ b/web/strategy-switch-console/page_asset.js
@@ -1,2 +1,2 @@
// Generated by scripts/sync_strategy_switch_page_asset.py; do not edit by hand.
-export const PAGE_HTML = "\n\n\n \n \n \n QuantRuntimeSettings Strategy Switch\n \n \n\n\n \n \n
策略切换
\n
选平台、目标账号和策略,一次执行完成切换。
\n
\n \n \n\n \n \n
初始化控制台\n
读取策略配置
\n
正在读取登录状态、账号配置和当前状态。
\n
\n
\n \n\n \n \n\n \n \n
\n 当前平台\n \n
\n\n
登录后查看账号配置。
\n\n
\n
\n GitHub OAuth 保护\n 只允许白名单账号进入私有配置。\n
\n
\n Worker 端触发\n 令牌保留在服务端,浏览器只提交切换意图。\n
\n
\n 变更可回溯\n 切换由 GitHub Actions 执行,便于审计和回滚。\n
\n
\n\n
\n\n
\n
\n
登录后才可执行切换。
\n
\n
\n
\n\n \n \n \n\n \n\n\n";
+export const PAGE_HTML = "\n\n\n \n \n \n QuantRuntimeSettings Strategy Switch\n \n \n\n\n\n\n\n\n \n \n
策略切换
\n
选平台、目标账号和策略,一次执行完成切换。
\n
\n \n \n\n \n \n
初始化控制台\n
读取策略配置
\n
正在读取登录状态、账号配置和当前状态。
\n
\n
\n \n\n \n \n\n \n \n
\n 当前平台\n \n
\n\n
登录后查看账号配置。
\n\n
\n
\n GitHub OAuth 保护\n 只允许白名单账号进入私有配置。\n
\n
\n Worker 端触发\n 令牌保留在服务端,浏览器只提交切换意图。\n
\n
\n 变更可回溯\n 切换由 GitHub Actions 执行,便于审计和回滚。\n
\n
\n\n
\n\n
\n
\n
登录后才可执行切换。
\n
\n
\n
\n\n \n \n \n\n \n\n\n";
diff --git a/web/strategy-switch-console/strategy_profiles_asset.js b/web/strategy-switch-console/strategy_profiles_asset.js
index 9196271..b5816ea 100644
--- a/web/strategy-switch-console/strategy_profiles_asset.js
+++ b/web/strategy-switch-console/strategy_profiles_asset.js
@@ -1,283 +1,2 @@
-// Generated by scripts/build_platform_config.py from platform-config.json
-export const DEFAULT_STRATEGY_PROFILES = [
- {
- "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": true,
- "combo_enabled": false,
- "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
- },
- "option_overlay_live_gate": "promotion_required",
- "option_overlay_live_status": "research_only",
- "option_growth_overlay_enabled": true,
- "option_growth_overlay_recipe": "tqqq_leaps_growth_v1",
- "option_growth_overlay_start_usd": "250000",
- "option_growth_overlay_nav_budget_ratio": "0.03"
- },
- {
- "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": true,
- "combo_enabled": false,
- "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
- },
- "option_overlay_live_gate": "promotion_required",
- "option_overlay_live_status": "research_only"
- },
- {
- "profile": "nasdaq_sp500_smart_dca",
- "label": "纳指标普定投",
- "label_en": "NASDAQ/S&P 500 DCA",
- "label_zh": "纳指标普定投",
- "domain": "us_equity",
- "runtime_enabled": true,
- "income_layer_enabled": false,
- "option_overlay_enabled": false,
- "combo_enabled": false,
- "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,
- "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": true,
- "combo_enabled": false,
- "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
- },
- "option_overlay_live_gate": "promotion_required",
- "option_overlay_live_status": "research_only",
- "option_growth_overlay_enabled": true,
- "option_growth_overlay_recipe": "spy_leaps_growth_v1",
- "option_growth_overlay_start_usd": "500000",
- "option_growth_overlay_nav_budget_ratio": "0.015"
- },
- {
- "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": true,
- "combo_enabled": false,
- "income_layer_start_usd": "300000",
- "income_layer_max_ratio": "0.25",
- "income_layer_allocations": {
- "SCHD": 0.45,
- "DGRO": 0.3,
- "SGOV": 0.25
- },
- "option_overlay_live_gate": "promotion_required",
- "option_overlay_live_status": "research_only",
- "option_growth_overlay_enabled": true,
- "option_growth_overlay_recipe": "spy_leaps_growth_v1",
- "option_growth_overlay_start_usd": "300000",
- "option_growth_overlay_nav_budget_ratio": "0.015"
- },
- {
- "profile": "us_equity_combo",
- "label": "美股核心组合",
- "label_en": "US Core Combo",
- "label_zh": "美股核心组合",
- "domain": "us_equity",
- "runtime_enabled": true,
- "income_layer_enabled": true,
- "option_overlay_enabled": true,
- "combo_enabled": true,
- "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
- },
- "option_overlay_live_gate": "promotion_required",
- "option_overlay_live_status": "research_only",
- "option_growth_overlay_enabled": true,
- "option_growth_overlay_recipe": "spy_leaps_growth_v1",
- "option_growth_overlay_start_usd": "300000",
- "option_growth_overlay_nav_budget_ratio": "0.015"
- },
- {
- "profile": "us_equity_combo_leveraged",
- "label": "美股加速组合",
- "label_en": "US Alpha Combo",
- "label_zh": "美股加速组合",
- "domain": "us_equity",
- "runtime_enabled": true,
- "income_layer_enabled": false,
- "option_overlay_enabled": false,
- "combo_enabled": true,
- "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": true,
- "income_layer_enabled": false,
- "option_overlay_enabled": false,
- "combo_enabled": false
- },
- {
- "profile": "hk_low_vol_dividend_quality_snapshot",
- "label": "港股红利质量",
- "label_en": "HK Dividend Quality",
- "label_zh": "港股红利质量",
- "domain": "hk_equity",
- "runtime_enabled": true,
- "income_layer_enabled": false,
- "option_overlay_enabled": false,
- "combo_enabled": false
- },
- {
- "profile": "hk_equity_combo",
- "label": "港股恒生组合",
- "label_en": "HK Core Combo",
- "label_zh": "港股恒生组合",
- "domain": "hk_equity",
- "runtime_enabled": true,
- "income_layer_enabled": false,
- "option_overlay_enabled": false,
- "combo_enabled": true,
- "combo_mode": "dynamic"
- },
- {
- "profile": "cn_industry_etf_rotation_aggressive",
- "label": "A股ETF轮动",
- "label_en": "CN ETF Rotation",
- "label_zh": "A股ETF轮动",
- "domain": "cn_equity",
- "runtime_enabled": true,
- "income_layer_enabled": false,
- "option_overlay_enabled": false,
- "combo_enabled": false
- },
- {
- "profile": "cn_stock_momentum_rotation",
- "label": "A股个股动量",
- "label_en": "CN Stock Momentum",
- "label_zh": "A股个股动量",
- "domain": "cn_equity",
- "runtime_enabled": true,
- "income_layer_enabled": false,
- "option_overlay_enabled": false,
- "combo_enabled": false
- },
- {
- "profile": "cn_dividend_quality_snapshot",
- "label": "A股红利质量",
- "label_en": "CN Dividend Quality",
- "label_zh": "A股红利质量",
- "domain": "cn_equity",
- "runtime_enabled": true,
- "income_layer_enabled": false,
- "option_overlay_enabled": false,
- "combo_enabled": false
- },
- {
- "profile": "cn_equity_combo",
- "label": "A股进取组合",
- "label_en": "CN Alpha Combo",
- "label_zh": "A股进取组合",
- "domain": "cn_equity",
- "runtime_enabled": true,
- "income_layer_enabled": false,
- "option_overlay_enabled": false,
- "combo_enabled": true,
- "combo_mode": "dynamic"
- },
- {
- "profile": "crypto_btc_dca",
- "label": "BTC定投",
- "label_en": "BTC DCA",
- "label_zh": "BTC定投",
- "domain": "crypto",
- "runtime_enabled": true,
- "income_layer_enabled": false,
- "option_overlay_enabled": false,
- "combo_enabled": false,
- "dca_enabled": true,
- "dca_default_mode": "fixed",
- "dca_default_base_investment_usd": "100"
- },
- {
- "profile": "crypto_trend_rotation",
- "label": "山寨趋势轮动",
- "label_en": "Altcoin Trend",
- "label_zh": "山寨趋势轮动",
- "domain": "crypto",
- "runtime_enabled": true,
- "income_layer_enabled": false,
- "option_overlay_enabled": false,
- "combo_enabled": false
- },
- {
- "profile": "crypto_equity_combo",
- "label": "加密动量组合",
- "label_en": "Crypto Core Combo",
- "label_zh": "加密动量组合",
- "domain": "crypto",
- "runtime_enabled": true,
- "income_layer_enabled": false,
- "option_overlay_enabled": false,
- "combo_enabled": true,
- "combo_mode": "dynamic"
- }
-];
+// Generated by scripts/sync_strategy_switch_page_asset.py; do not edit by hand.
+export const DEFAULT_STRATEGY_PROFILES = [{"profile": "ibit_smart_dca", "label": "IBIT Bitcoin DCA", "label_en": "IBIT Bitcoin DCA", "label_zh": "IBIT比特币定投", "domain": "us_equity", "runtime_enabled": true, "dca_enabled": true, "dca_default_mode": "fixed", "dca_default_base_investment_usd": "1000"}, {"profile": "global_etf_rotation", "label": "Global ETF Rotation", "label_en": "Global ETF Rotation", "label_zh": "全球ETF轮动", "domain": "us_equity", "runtime_enabled": true, "income_layer_enabled": true, "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}, "option_overlay_enabled": true, "option_overlay_live_gate": "promotion_required", "option_overlay_live_status": "research_only", "option_growth_overlay_enabled": true, "option_growth_overlay_recipe": "spy_leaps_growth_v1", "option_growth_overlay_start_usd": "500000", "option_growth_overlay_nav_budget_ratio": 0.015}, {"profile": "soxl_soxx_trend_income", "label": "Semiconductor Trend Income", "label_en": "Semiconductor Trend Income", "label_zh": "半导体趋势收益", "domain": "us_equity", "runtime_enabled": true, "income_layer_enabled": true, "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}, "option_overlay_enabled": true, "option_overlay_live_gate": "promotion_required", "option_overlay_live_status": "research_only", "option_income_overlay_enabled": true, "option_income_overlay_recipe": "soxx_put_credit_spread_income_v1", "option_income_overlay_start_usd": "150000", "option_income_overlay_nav_risk_ratio": 0.01}, {"profile": "nasdaq_sp500_smart_dca", "label": "NASDAQ/S&P 500 DCA", "label_en": "NASDAQ/S&P 500 DCA", "label_zh": "纳指标普定投", "domain": "us_equity", "runtime_enabled": true, "dca_enabled": true, "dca_default_mode": "fixed", "dca_default_base_investment_usd": "1000"}, {"profile": "tqqq_growth_income", "label": "NASDAQ Growth Income", "label_en": "NASDAQ Growth Income", "label_zh": "纳斯达克增长收益", "domain": "us_equity", "runtime_enabled": true, "income_layer_enabled": true, "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}, "option_overlay_enabled": true, "option_overlay_live_gate": "promotion_required", "option_overlay_live_status": "research_only", "option_growth_overlay_enabled": true, "option_growth_overlay_recipe": "tqqq_leaps_growth_v1", "option_growth_overlay_start_usd": "250000", "option_growth_overlay_nav_budget_ratio": 0.03}, {"profile": "russell_top50_leader_rotation", "label": "Russell Top50 Leaders", "label_en": "Russell Top50 Leaders", "label_zh": "罗素Top50领涨", "domain": "us_equity", "runtime_enabled": true, "income_layer_enabled": true, "income_layer_start_usd": "300000", "income_layer_max_ratio": "0.25", "income_layer_allocations": {"SCHD": 0.45, "DGRO": 0.3, "SGOV": 0.25}, "option_overlay_enabled": true, "option_overlay_live_gate": "promotion_required", "option_overlay_live_status": "research_only", "option_growth_overlay_enabled": true, "option_growth_overlay_recipe": "spy_leaps_growth_v1", "option_growth_overlay_start_usd": "300000", "option_growth_overlay_nav_budget_ratio": 0.015}, {"profile": "us_equity_combo_leveraged", "label": "US Alpha Combo", "label_en": "US Alpha Combo", "label_zh": "美股加速组合", "domain": "us_equity", "runtime_enabled": true, "combo_enabled": true, "combo_mode": "dynamic"}, {"profile": "us_equity_combo", "label": "US Core Combo", "label_en": "US Core Combo", "label_zh": "美股核心组合", "domain": "us_equity", "runtime_enabled": true, "income_layer_enabled": true, "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}, "option_overlay_enabled": true, "option_overlay_live_gate": "promotion_required", "option_overlay_live_status": "research_only", "option_growth_overlay_enabled": true, "option_growth_overlay_recipe": "spy_leaps_growth_v1", "option_growth_overlay_start_usd": "300000", "option_growth_overlay_nav_budget_ratio": 0.015, "combo_enabled": true, "combo_mode": "dynamic"}, {"profile": "hk_global_etf_tactical_rotation", "label": "HK ETF Tactical Rotation", "label_en": "HK ETF Tactical Rotation", "label_zh": "港股ETF战术轮动", "domain": "hk_equity", "runtime_enabled": true}, {"profile": "hk_equity_combo", "label": "HK Core Combo", "label_en": "HK Core Combo", "label_zh": "港股恒生组合", "domain": "hk_equity", "runtime_enabled": true, "combo_enabled": true, "combo_mode": "dynamic"}, {"profile": "hk_low_vol_dividend_quality_snapshot", "label": "HK Dividend Quality", "label_en": "HK Dividend Quality", "label_zh": "港股红利质量", "domain": "hk_equity", "runtime_enabled": true}, {"profile": "cn_industry_etf_rotation_aggressive", "label": "CN ETF Rotation", "label_en": "CN ETF Rotation", "label_zh": "A股ETF轮动", "domain": "cn_equity", "runtime_enabled": true}, {"profile": "cn_stock_momentum_rotation", "label": "CN Stock Momentum", "label_en": "CN Stock Momentum", "label_zh": "A股个股动量", "domain": "cn_equity", "runtime_enabled": true}, {"profile": "cn_dividend_quality_snapshot", "label": "CN Dividend Quality", "label_en": "CN Dividend Quality", "label_zh": "A股红利质量", "domain": "cn_equity", "runtime_enabled": true}, {"profile": "cn_equity_combo", "label": "CN Alpha Combo", "label_en": "CN Alpha Combo", "label_zh": "A股进取组合", "domain": "cn_equity", "runtime_enabled": true, "combo_enabled": true, "combo_mode": "dynamic"}, {"profile": "crypto_btc_dca", "label": "BTC DCA", "label_en": "BTC DCA", "label_zh": "BTC定投", "domain": "crypto", "runtime_enabled": true, "dca_enabled": true, "dca_default_mode": "fixed", "dca_default_base_investment_usd": "100"}, {"profile": "crypto_equity_combo", "label": "Crypto Core Combo", "label_en": "Crypto Core Combo", "label_zh": "加密动量组合", "domain": "crypto", "runtime_enabled": true, "combo_enabled": true, "combo_mode": "dynamic"}, {"profile": "crypto_trend_rotation", "label": "Altcoin Trend", "label_en": "Altcoin Trend", "label_zh": "山寨趋势轮动", "domain": "crypto", "runtime_enabled": true}];