Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion tests/strategy_switch_worker_validation.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,10 @@ assert.ok(indexHtml.includes('id="reserve-policy-stack"'));
assert.ok(indexHtml.includes('class="reserve-policy-stack"'));
assert.equal(indexHtml.match(/class="form-section dca-section"/g)?.length, 1);
assert.ok(indexHtml.includes('qmtDryRunOnlyNote'));
assert.ok(indexHtml.includes('cashOnlyExecutionMode: "允许融资"'));
assert.ok(indexHtml.includes('optionOverlayDefaultSimple: "策略默认:开启"'));
assert.ok(indexHtml.includes('cashOnlyExecutionDefault: "平台默认:允许融资"'));
assert.ok(indexHtml.includes("function effectiveOptionOverlayForAccount("));
assert.ok(indexHtml.includes("function effectiveCashOnlyExecutionForAccount("));
assert.ok(indexHtml.includes('cashOnlyExecutionValueYes: "允许融资:是"'));
assert.ok(indexHtml.includes('cashOnlyExecutionMode: "Allow margin"'));
assert.ok(indexHtml.includes('el("cash-only-execution-mode-select").addEventListener("change"'));
Expand Down
72 changes: 63 additions & 9 deletions web/strategy-switch-console/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -1787,6 +1787,9 @@ <h2 data-i18n="summary">切换摘要</h2>
incomeLayerOn: "开启,起始 {start},最高 {ratio}",
optionOverlayOff: "关闭",
optionOverlayOn: "开启(策略默认)",
optionOverlayDefaultSimple: "策略默认:开启",
optionOverlayDefault: "策略默认:开启,{detail}",
cashOnlyExecutionDefault: "平台默认:允许融资",
},
en: {
appTitle: "Strategy Switch",
Expand Down Expand Up @@ -1950,6 +1953,9 @@ <h2 data-i18n="summary">切换摘要</h2>
incomeLayerOn: "Enabled, starts at {start}, max {ratio}",
optionOverlayOff: "Disabled",
optionOverlayOn: "Enabled (strategy default)",
optionOverlayDefaultSimple: "Strategy default: enabled",
optionOverlayDefault: "Strategy default: enabled, {detail}",
cashOnlyExecutionDefault: "Platform default: margin allowed",
},
};

Expand Down Expand Up @@ -2468,22 +2474,68 @@ <h2 data-i18n="summary">切换摘要</h2>
return enabled ? t("cashOnlyExecutionValueNo") : t("cashOnlyExecutionValueYes");
}

function platformCashOnlyExecutionDefault() {
return false;
}

function effectiveCashOnlyExecutionForAccount(platform, account) {
const configured = currentCashOnlyExecutionForAccount(platform, account);
if (configured !== null) return configured;
if (!platformSupportsMarginPolicy(platform)) return null;
return platformCashOnlyExecutionDefault();
}

function currentCashOnlyExecutionForAccount(platform, account) {
return cleanOptionalBoolean(currentEntryForAccount(platform, account)?.cash_only_execution);
}

function currentCashOnlyExecutionText(platform = state.selected, account = selectedAccount(platform)) {
return cashOnlyExecutionText(currentCashOnlyExecutionForAccount(platform, account));
if (!platformSupportsMarginPolicy(platform)) return t("notRead");
const entry = currentEntryForAccount(platform, account);
if (!entry) return t("notRead");
const configured = cleanOptionalBoolean(entry.cash_only_execution);
if (configured === null) return t("cashOnlyExecutionDefault");
return cashOnlyExecutionText(configured);
}

function currentOptionOverlayForAccount(platform, account) {
return cleanOptionalBoolean(currentEntryForAccount(platform, account)?.option_overlay_enabled);
}

function effectiveOptionOverlayForAccount(platform, account, profile = state.forms[platform]?.strategy) {
const configured = currentOptionOverlayForAccount(platform, account);
if (configured !== null) return configured;
if (!optionOverlaySupported(profile)) return null;
return true;
}

function optionOverlayDefaultSummaryDetail(defaults) {
if (!defaults?.families?.length) return "";
return defaults.families.map((item) => {
const family = item.family === "income" ? t("optionOverlayFamilyIncome") : t("optionOverlayFamilyGrowth");
const ratioText = item.ratioKind === "risk"
? t("optionOverlayRiskRatio").replace("{ratio}", formatRatioPercent(item.ratio))
: t("optionOverlayBudgetRatio").replace("{ratio}", formatRatioPercent(item.ratio));
return `${family} ${ratioText}`;
}).join(" / ");
}

function optionOverlayDefaultText(profile) {
const defaults = optionOverlayDefaultForStrategy(profile);
if (!defaults) return t("optionOverlayNotSupported");
const detail = optionOverlayDefaultSummaryDetail(defaults);
return detail ? t("optionOverlayDefault").replace("{detail}", detail) : t("optionOverlayDefaultSimple");
}

function currentOptionOverlayText(platform = state.selected, account = selectedAccount(platform), profile = state.forms[platform]?.strategy) {
const enabled = currentOptionOverlayForAccount(platform, account);
if (!optionOverlaySupported(profile) && enabled === null) return t("optionOverlayNotSupported");
return enabled === null ? t("notRead") : optionOverlayText(enabled);
const entry = currentEntryForAccount(platform, account);
if (!entry) return t("notRead");
const configured = cleanOptionalBoolean(entry.option_overlay_enabled);
if (!optionOverlaySupported(profile)) {
return configured === null ? t("optionOverlayNotSupported") : optionOverlayText(configured);
}
if (configured === null) return optionOverlayDefaultText(profile);
return optionOverlayText(configured);
}

function currentIncomeLayerForAccount(platform, account) {
Expand Down Expand Up @@ -3234,12 +3286,12 @@ <h2 data-i18n="summary">切换摘要</h2>
const profile = cleanStrategyProfile(inputs.strategy_profile || state.forms[platform]?.strategy);
const supported = optionOverlaySupported(profile);
const mode = normalizeOptionOverlayMode(inputs.option_overlay_mode);
const current = currentOptionOverlayForAccount(platform, account);
const current = effectiveOptionOverlayForAccount(platform, account, profile);
if (mode === "current") {
return {
supported,
changed: false,
inputs: { option_overlay_enabled: current },
inputs: { option_overlay_enabled: currentOptionOverlayForAccount(platform, account) },
};
}
if (mode === "enabled") {
Expand All @@ -3258,11 +3310,11 @@ <h2 data-i18n="summary">切换摘要</h2>

function pendingCashOnlyExecution(inputs, platform = state.selected, account = selectedAccount(platform)) {
const mode = normalizeCashOnlyExecutionMode(inputs.cash_only_execution_mode);
const current = currentCashOnlyExecutionForAccount(platform, account);
const current = effectiveCashOnlyExecutionForAccount(platform, account);
if (mode === "current") {
return {
changed: false,
inputs: { cash_only_execution: current },
inputs: { cash_only_execution: currentCashOnlyExecutionForAccount(platform, account) },
};
}
const nextEnabled = mode === "enabled";
Expand Down Expand Up @@ -3413,8 +3465,10 @@ <h2 data-i18n="summary">切换摘要</h2>
],
[t("currentPluginMode"), pluginModeLabel(changes.currentPluginMode)],
[t("reservedCashPolicy"), currentReservedCashPolicyText(state.selected, account)],
[t("currentCashOnlyExecution"), currentCashOnlyExecutionText(state.selected, account)],
];
if (platformSupportsMarginPolicy(state.selected)) {
rows.push([t("currentCashOnlyExecution"), currentCashOnlyExecutionText(state.selected, account)]);
}
if (incomeLayerSupported(inputs.strategy_profile)) {
rows.push([t("currentIncomeLayer"), currentIncomeLayerText(state.selected, account, inputs.strategy_profile)]);
}
Expand Down
2 changes: 1 addition & 1 deletion web/strategy-switch-console/page_asset.js

Large diffs are not rendered by default.

Loading