Add amplitude filter as first open gate for 永期 hedge.
Reuse OO amplitude settings (default off); Plan shows index/HL when filtering. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -214,6 +214,7 @@ export type MarketSnapshot = {
|
||||
max_pct?: number;
|
||||
/** @deprecated 兼容旧字段,等同 max_pct */
|
||||
min_pct?: number;
|
||||
filter_enabled?: boolean;
|
||||
ok?: boolean;
|
||||
} | null;
|
||||
pair: {
|
||||
|
||||
+51
-49
@@ -288,6 +288,9 @@ export default function PlanPage() {
|
||||
]
|
||||
.filter(Boolean)
|
||||
.join(" · ");
|
||||
const poAmpLabel = plan?.oo_amplitude_filter_enabled
|
||||
? `振幅≤${fmt(plan?.oo_amplitude_pct ?? 1.5, 1)}%/${fmt(plan?.oo_amplitude_hours ?? 12, 0)}h(第一关)`
|
||||
: null;
|
||||
const exitDetail = isOo
|
||||
? `净盈利≥预算×${fmt(ooRatio, 1)} → 只平盈利腿,亏损腿残留`
|
||||
: exitMode === "premium_multiple"
|
||||
@@ -380,6 +383,7 @@ export default function PlanPage() {
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
{poAmpLabel ? `${poAmpLabel} · ` : ""}
|
||||
永续{" "}
|
||||
{displayPerpQty != null
|
||||
? `${fmt(displayPerpQty, 2)} ETH`
|
||||
@@ -520,6 +524,7 @@ export default function PlanPage() {
|
||||
ooSelectLabel
|
||||
) : (
|
||||
<>
|
||||
{poAmpLabel ? `${poAmpLabel} · ` : ""}
|
||||
永续
|
||||
{displayPerpQty != null
|
||||
? `${fmt(displayPerpQty, 2)}ETH`
|
||||
@@ -1033,55 +1038,56 @@ export default function PlanPage() {
|
||||
</div>
|
||||
|
||||
<div className="plan-market">
|
||||
{isOo ? (
|
||||
<div className="card">
|
||||
<h3 className="plan-panel-title">指数 / 振幅</h3>
|
||||
<div className="kv">
|
||||
<span>指数</span>
|
||||
<span className="mono">{fmtExPx("index", snap?.index_px)}</span>
|
||||
</div>
|
||||
<div className="kv">
|
||||
<span>
|
||||
高点
|
||||
{snap?.oo_amplitude?.hours != null
|
||||
? `(${fmt(snap.oo_amplitude.hours, 0)}h)`
|
||||
: ""}
|
||||
</span>
|
||||
<span className="mono">
|
||||
{fmtExPx("index", snap?.oo_amplitude?.high)}
|
||||
</span>
|
||||
</div>
|
||||
<div className="kv">
|
||||
<span>低点</span>
|
||||
<span className="mono">
|
||||
{fmtExPx("index", snap?.oo_amplitude?.low)}
|
||||
</span>
|
||||
</div>
|
||||
<div className="kv">
|
||||
<span>振幅</span>
|
||||
<span className="mono">
|
||||
{snap?.oo_amplitude?.range_pct != null
|
||||
? `${fmt(snap.oo_amplitude.range_pct, 2)}%`
|
||||
: "—"}
|
||||
{(snap?.oo_amplitude?.max_pct ?? snap?.oo_amplitude?.min_pct) !=
|
||||
null
|
||||
? ` · 上限≤${fmt(
|
||||
Number(
|
||||
snap.oo_amplitude?.max_pct ??
|
||||
snap.oo_amplitude?.min_pct,
|
||||
),
|
||||
1,
|
||||
)}%`
|
||||
: ""}
|
||||
{snap?.oo_amplitude?.ok === false
|
||||
<div className="card">
|
||||
<h3 className="plan-panel-title">指数 / 振幅</h3>
|
||||
<div className="kv">
|
||||
<span>指数</span>
|
||||
<span className="mono">{fmtExPx("index", snap?.index_px)}</span>
|
||||
</div>
|
||||
<div className="kv">
|
||||
<span>
|
||||
高点
|
||||
{snap?.oo_amplitude?.hours != null
|
||||
? `(${fmt(snap.oo_amplitude.hours, 0)}h)`
|
||||
: ""}
|
||||
</span>
|
||||
<span className="mono">
|
||||
{fmtExPx("index", snap?.oo_amplitude?.high)}
|
||||
</span>
|
||||
</div>
|
||||
<div className="kv">
|
||||
<span>低点</span>
|
||||
<span className="mono">
|
||||
{fmtExPx("index", snap?.oo_amplitude?.low)}
|
||||
</span>
|
||||
</div>
|
||||
<div className="kv">
|
||||
<span>振幅</span>
|
||||
<span className="mono">
|
||||
{snap?.oo_amplitude?.range_pct != null
|
||||
? `${fmt(snap.oo_amplitude.range_pct, 2)}%`
|
||||
: "—"}
|
||||
{(snap?.oo_amplitude?.max_pct ?? snap?.oo_amplitude?.min_pct) !=
|
||||
null
|
||||
? ` · 上限≤${fmt(
|
||||
Number(
|
||||
snap.oo_amplitude?.max_pct ??
|
||||
snap.oo_amplitude?.min_pct,
|
||||
),
|
||||
1,
|
||||
)}%`
|
||||
: ""}
|
||||
{snap?.oo_amplitude?.filter_enabled === false
|
||||
? " · 过滤关"
|
||||
: snap?.oo_amplitude?.ok === false
|
||||
? " · 超限"
|
||||
: snap?.oo_amplitude?.ok === true
|
||||
? " · 可开"
|
||||
: ""}
|
||||
</span>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
) : (
|
||||
</div>
|
||||
{!isOo ? (
|
||||
<div className="card">
|
||||
<h3 className="plan-panel-title">永续行情</h3>
|
||||
<div className="kv">
|
||||
@@ -1104,12 +1110,8 @@ export default function PlanPage() {
|
||||
)}
|
||||
</span>
|
||||
</div>
|
||||
<div className="kv">
|
||||
<span>指数</span>
|
||||
<span className="mono">{fmtExPx("index", snap?.index_px)}</span>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
) : null}
|
||||
<div className="card">
|
||||
<h3 className="plan-panel-title">
|
||||
{isOo
|
||||
|
||||
@@ -742,67 +742,65 @@ export default function SettingsPage() {
|
||||
<option value="option_option">期期对冲(双期权)</option>
|
||||
</select>
|
||||
</div>
|
||||
<div className="field">
|
||||
<label htmlFor="ooAmpFilt">振幅过滤</label>
|
||||
<select
|
||||
id="ooAmpFilt"
|
||||
className="mono"
|
||||
value={ooAmpFilterOn ? "on" : "off"}
|
||||
onChange={(e) =>
|
||||
setOoAmpFilterOn(e.target.value === "on")
|
||||
}
|
||||
>
|
||||
<option value="off">关闭(默认)</option>
|
||||
<option value="on">开启</option>
|
||||
</select>
|
||||
</div>
|
||||
<div className="field">
|
||||
<label htmlFor="ooAmpH">振幅回看(小时)</label>
|
||||
<input
|
||||
id="ooAmpH"
|
||||
className="mono"
|
||||
type="number"
|
||||
step="1"
|
||||
min="1"
|
||||
value={ooAmpHours}
|
||||
onChange={(e) =>
|
||||
setOoAmpHours(Number(e.target.value))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
{ooAmpFilterOn ? (
|
||||
<div className="field">
|
||||
<label htmlFor="ooAmp">振幅最大(%)</label>
|
||||
<input
|
||||
id="ooAmp"
|
||||
className="mono"
|
||||
type="number"
|
||||
step="0.1"
|
||||
min="0.1"
|
||||
value={ooAmpPct}
|
||||
onChange={(e) =>
|
||||
setOoAmpPct(Number(e.target.value))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
) : null}
|
||||
{isOo ? (
|
||||
<>
|
||||
<div className="field">
|
||||
<label htmlFor="ooAmpFilt">振幅过滤</label>
|
||||
<select
|
||||
id="ooAmpFilt"
|
||||
className="mono"
|
||||
value={ooAmpFilterOn ? "on" : "off"}
|
||||
onChange={(e) =>
|
||||
setOoAmpFilterOn(e.target.value === "on")
|
||||
}
|
||||
>
|
||||
<option value="off">关闭(默认)</option>
|
||||
<option value="on">开启</option>
|
||||
</select>
|
||||
</div>
|
||||
<div className="field">
|
||||
<label htmlFor="ooAmpH">振幅回看(小时)</label>
|
||||
<input
|
||||
id="ooAmpH"
|
||||
className="mono"
|
||||
type="number"
|
||||
step="1"
|
||||
min="1"
|
||||
value={ooAmpHours}
|
||||
onChange={(e) =>
|
||||
setOoAmpHours(Number(e.target.value))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
{ooAmpFilterOn ? (
|
||||
<div className="field">
|
||||
<label htmlFor="ooAmp">振幅最大(%)</label>
|
||||
<input
|
||||
id="ooAmp"
|
||||
className="mono"
|
||||
type="number"
|
||||
step="0.1"
|
||||
min="0.1"
|
||||
value={ooAmpPct}
|
||||
onChange={(e) =>
|
||||
setOoAmpPct(Number(e.target.value))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
) : null}
|
||||
<div className="field">
|
||||
<label htmlFor="ooRR">盈亏比</label>
|
||||
<input
|
||||
id="ooRR"
|
||||
className="mono"
|
||||
type="number"
|
||||
step="0.1"
|
||||
min="0.5"
|
||||
value={ooRewardRatio}
|
||||
onChange={(e) =>
|
||||
setOoRewardRatio(Number(e.target.value))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
<div className="field">
|
||||
<label htmlFor="ooRR">盈亏比</label>
|
||||
<input
|
||||
id="ooRR"
|
||||
className="mono"
|
||||
type="number"
|
||||
step="0.1"
|
||||
min="0.5"
|
||||
value={ooRewardRatio}
|
||||
onChange={(e) =>
|
||||
setOoRewardRatio(Number(e.target.value))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
) : null}
|
||||
{!isOo ? (
|
||||
<div className="field">
|
||||
@@ -1692,16 +1690,17 @@ export default function SettingsPage() {
|
||||
对冲模式二选一:永期=永续+期权;期期=近 N
|
||||
小时振幅高低匹配虚值 Call/Put,达标只平盈利腿。
|
||||
</li>
|
||||
<li>
|
||||
振幅过滤:默认关闭。开启后回看窗内振幅超过「振幅最大%」则不开仓
|
||||
{isOo
|
||||
? ";关闭时仍用回看高低点选约,但不因振幅超限拒开。"
|
||||
: "(永期开仓第一关,不过关不再看 ATM/杠杆等)。"}
|
||||
</li>
|
||||
{isOo ? (
|
||||
<>
|
||||
<li>
|
||||
期期定仓:强制以损定仓 + 亏损幅度%;预算平分
|
||||
Call/Put,各按卖一独立定仓;出场目标 = 预算 × 盈亏比。
|
||||
</li>
|
||||
<li>
|
||||
振幅过滤:默认关闭。关闭时仍用「振幅回看」取高低点选约,但不因振幅超限拒开;开启后回看窗内振幅超过「振幅最大%」则不开仓。
|
||||
</li>
|
||||
</>
|
||||
<li>
|
||||
期期定仓:强制以损定仓 + 亏损幅度%;预算平分
|
||||
Call/Put,各按卖一独立定仓;出场目标 = 预算 × 盈亏比。
|
||||
</li>
|
||||
) : (
|
||||
<>
|
||||
<li>
|
||||
@@ -1738,6 +1737,10 @@ export default function SettingsPage() {
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<li>
|
||||
振幅过滤(仓位页):开启时为开仓第一关——回看窗内振幅须 ≤
|
||||
最大%,不过关则不开仓。
|
||||
</li>
|
||||
<li>
|
||||
固定方向:默认关。开启后固定永续多→买 Put,或永续空→买
|
||||
Call;期权只选实值或平值,不买虚值。关闭时仍按 ATM/卖一比价规则。
|
||||
|
||||
Reference in New Issue
Block a user