Show options budget buffer ratio in open-order rule tip.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -6793,6 +6793,7 @@ def render_main_page(page="trade", embed_mode=None):
|
|||||||
in ("1", "true", "yes", "on"),
|
in ("1", "true", "yes", "on"),
|
||||||
hedge_plan_budget_buffer=float(os.getenv("HEDGE_PLAN_BUDGET_BUFFER") or "0.95"),
|
hedge_plan_budget_buffer=float(os.getenv("HEDGE_PLAN_BUDGET_BUFFER") or "0.95"),
|
||||||
options_trade_budget=OKX_OPTIONS_TRADE_BUDGET_USDC,
|
options_trade_budget=OKX_OPTIONS_TRADE_BUDGET_USDC,
|
||||||
|
options_budget_buffer=float(os.getenv("OKX_OPTIONS_BUDGET_BUFFER") or "0.95"),
|
||||||
options_default_underly=OKX_OPTIONS_DEFAULT_UNDERLY,
|
options_default_underly=OKX_OPTIONS_DEFAULT_UNDERLY,
|
||||||
options_chain_ask_liq_filter=os.getenv(
|
options_chain_ask_liq_filter=os.getenv(
|
||||||
"OKX_OPTIONS_CHAIN_ASK_LIQ_FILTER_ENABLED", "true"
|
"OKX_OPTIONS_CHAIN_ASK_LIQ_FILTER_ENABLED", "true"
|
||||||
|
|||||||
@@ -16,6 +16,11 @@
|
|||||||
strikeExpandAll: false,
|
strikeExpandAll: false,
|
||||||
/** 环境 OKX_OPTIONS_CHAIN_ASK_LIQ_FILTER_ENABLED;链接口可热更新 */
|
/** 环境 OKX_OPTIONS_CHAIN_ASK_LIQ_FILTER_ENABLED;链接口可热更新 */
|
||||||
askLiqFilter: root.dataset.askLiqFilter !== "0",
|
askLiqFilter: root.dataset.askLiqFilter !== "0",
|
||||||
|
budgetBuffer: (function () {
|
||||||
|
const raw = root.dataset.budgetBuffer;
|
||||||
|
const n = raw != null && raw !== "" ? Number(raw) : NaN;
|
||||||
|
return !Number.isNaN(n) && n > 0 ? n : 0.95;
|
||||||
|
})(),
|
||||||
chain: panelCache.chain || null,
|
chain: panelCache.chain || null,
|
||||||
selectedInst: null,
|
selectedInst: null,
|
||||||
orderQuote: null,
|
orderQuote: null,
|
||||||
@@ -568,6 +573,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function applyBudgetBuffer(raw) {
|
||||||
|
if (raw == null || raw === "") return;
|
||||||
|
const buf = Number(raw);
|
||||||
|
if (Number.isNaN(buf) || buf <= 0) return;
|
||||||
|
state.budgetBuffer = buf;
|
||||||
|
const el = document.getElementById("opt-budget-buf");
|
||||||
|
if (el) el.textContent = fmt(buf, 2);
|
||||||
|
}
|
||||||
|
|
||||||
function renderIndexLine() {
|
function renderIndexLine() {
|
||||||
const idx = state.chain && state.chain.index_px;
|
const idx = state.chain && state.chain.index_px;
|
||||||
const dte = state.chain && state.chain.chain_max_dte_days;
|
const dte = state.chain && state.chain.chain_max_dte_days;
|
||||||
@@ -575,6 +589,9 @@
|
|||||||
const el = document.getElementById("opt-chain-dte");
|
const el = document.getElementById("opt-chain-dte");
|
||||||
if (el) el.textContent = String(Math.round(dte));
|
if (el) el.textContent = String(Math.round(dte));
|
||||||
}
|
}
|
||||||
|
if (state.chain && state.chain.budget_buffer != null) {
|
||||||
|
applyBudgetBuffer(state.chain.budget_buffer);
|
||||||
|
}
|
||||||
const line = document.getElementById("opt-index-line");
|
const line = document.getElementById("opt-index-line");
|
||||||
if (line) {
|
if (line) {
|
||||||
const liqHint = askLiqFilterOn() ? "仅显示卖一深度≥1张" : "显示全部卖一(含估算~)";
|
const liqHint = askLiqFilterOn() ? "仅显示卖一深度≥1张" : "显示全部卖一(含估算~)";
|
||||||
@@ -2055,6 +2072,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function bootOptionsPanel() {
|
function bootOptionsPanel() {
|
||||||
|
applyBudgetBuffer(state.budgetBuffer);
|
||||||
updateSizeInputs();
|
updateSizeInputs();
|
||||||
syncMoneyFilterButtons();
|
syncMoneyFilterButtons();
|
||||||
syncChainViewUI();
|
syncChainViewUI();
|
||||||
|
|||||||
@@ -373,6 +373,7 @@ def register_options_routes(app: Flask, cfg: dict[str, Any]) -> None:
|
|||||||
chain_err = chain.get("chain_error")
|
chain_err = chain.get("chain_error")
|
||||||
# 热更新:每次读 env,保存配置后刷新链即可生效
|
# 热更新:每次读 env,保存配置后刷新链即可生效
|
||||||
ask_liq_filter = _env_bool("OKX_OPTIONS_CHAIN_ASK_LIQ_FILTER_ENABLED", True)
|
ask_liq_filter = _env_bool("OKX_OPTIONS_CHAIN_ASK_LIQ_FILTER_ENABLED", True)
|
||||||
|
budget_buffer = _env_float("OKX_OPTIONS_BUDGET_BUFFER", 0.95)
|
||||||
if not expiries:
|
if not expiries:
|
||||||
return jsonify(
|
return jsonify(
|
||||||
{
|
{
|
||||||
@@ -381,6 +382,8 @@ def register_options_routes(app: Flask, cfg: dict[str, Any]) -> None:
|
|||||||
**chain,
|
**chain,
|
||||||
"chain_max_dte_days": cfg["chain_max_dte_days"],
|
"chain_max_dte_days": cfg["chain_max_dte_days"],
|
||||||
"ask_liq_filter_enabled": ask_liq_filter,
|
"ask_liq_filter_enabled": ask_liq_filter,
|
||||||
|
"budget_buffer": budget_buffer,
|
||||||
|
"trade_budget": cfg["trade_budget"],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
return jsonify(
|
return jsonify(
|
||||||
@@ -389,6 +392,8 @@ def register_options_routes(app: Flask, cfg: dict[str, Any]) -> None:
|
|||||||
**chain,
|
**chain,
|
||||||
"chain_max_dte_days": cfg["chain_max_dte_days"],
|
"chain_max_dte_days": cfg["chain_max_dte_days"],
|
||||||
"ask_liq_filter_enabled": ask_liq_filter,
|
"ask_liq_filter_enabled": ask_liq_filter,
|
||||||
|
"budget_buffer": budget_buffer,
|
||||||
|
"trade_budget": cfg["trade_budget"],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<div class="options-page-wrap" style="grid-column:1/-1" id="options-root"
|
<div class="options-page-wrap" style="grid-column:1/-1" id="options-root"
|
||||||
data-default-underly="{{ options_default_underly | default('ETH') }}"
|
data-default-underly="{{ options_default_underly | default('ETH') }}"
|
||||||
|
data-budget-buffer="{{ options_budget_buffer | default(0.95) }}"
|
||||||
data-ask-liq-filter="{% if options_chain_ask_liq_filter is defined %}{{ '1' if options_chain_ask_liq_filter else '0' }}{% else %}1{% endif %}">
|
data-ask-liq-filter="{% if options_chain_ask_liq_filter is defined %}{{ '1' if options_chain_ask_liq_filter else '0' }}{% else %}1{% endif %}">
|
||||||
{% if not options_enabled %}
|
{% if not options_enabled %}
|
||||||
<div class="flash" style="margin-bottom:12px">期权 API 未启用:请在 <code>crypto_monitor_okx/.env</code> 设置 <code>OKX_OPTIONS_ENABLED=true</code> 及主账户 <code>OKX_OPTIONS_API_*</code>,然后 <code>pm2 restart crypto_okx --update-env</code>.</div>
|
<div class="flash" style="margin-bottom:12px">期权 API 未启用:请在 <code>crypto_monitor_okx/.env</code> 设置 <code>OKX_OPTIONS_ENABLED=true</code> 及主账户 <code>OKX_OPTIONS_API_*</code>,然后 <code>pm2 restart crypto_okx --update-env</code>.</div>
|
||||||
@@ -17,6 +18,7 @@
|
|||||||
<li>环境配置「链上仅显示有卖一」开启时,隐藏无真实卖一或深度不足 1 张的合约(估算价 <strong>~</strong> 亦不显示)。</li>
|
<li>环境配置「链上仅显示有卖一」开启时,隐藏无真实卖一或深度不足 1 张的合约(估算价 <strong>~</strong> 亦不显示)。</li>
|
||||||
<li><strong>开仓只认真实卖一价且卖一深度≥1</strong>;无深度时面板显示参考标记价并禁用买入。</li>
|
<li><strong>开仓只认真实卖一价且卖一深度≥1</strong>;无深度时面板显示参考标记价并禁用买入。</li>
|
||||||
<li>链展示近 <span id="opt-chain-dte">14</span> 日到期;<strong>T 型</strong>默认 ATM ±5 档,可展开全部。</li>
|
<li>链展示近 <span id="opt-chain-dte">14</span> 日到期;<strong>T 型</strong>默认 ATM ±5 档,可展开全部。</li>
|
||||||
|
<li>「按可用余额打满」可用额度 = min(交易 USDC × 预算缓冲 <strong id="opt-budget-buf">{{ '%.2f'|format(options_budget_buffer|default(0.95)|float) }}</strong>, 单笔预算);可在 env「预算缓冲比例」改。</li>
|
||||||
<li>平仓仅买一限价,详见说明文档。</li>
|
<li>平仓仅买一限价,详见说明文档。</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p><a href="/options/guide" target="_blank" rel="noopener">打开《期权开平仓与监控说明》</a></p>
|
<p><a href="/options/guide" target="_blank" rel="noopener">打开《期权开平仓与监控说明》</a></p>
|
||||||
@@ -314,4 +316,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script src="/static/options_expiry_countdown.js?v=1"></script>
|
<script src="/static/options_expiry_countdown.js?v=1"></script>
|
||||||
<script src="/static/options_panel.js?v=48"></script>
|
<script src="/static/options_panel.js?v=49"></script>
|
||||||
|
|||||||
Reference in New Issue
Block a user