+54
-12
@@ -7,6 +7,28 @@
|
||||
.replace(/"/g, """);
|
||||
}
|
||||
|
||||
function leftTriggerSide(optType) {
|
||||
return String(optType || "P").toUpperCase() === "C" ? "lte" : "gte";
|
||||
}
|
||||
|
||||
function triggerHintText(optType, px) {
|
||||
const put = String(optType || "P").toUpperCase() !== "C";
|
||||
const price = px && String(px).trim() !== "" ? String(px) : "触发价";
|
||||
if (put) {
|
||||
return "看跌左侧单:指数上穿 " + price + " 后,在偏离区内开最近实值 Put。";
|
||||
}
|
||||
return "看涨左侧单:指数下穿 " + price + " 后,在偏离区内开最近实值 Call。";
|
||||
}
|
||||
|
||||
function syncTriggerHint() {
|
||||
const hint = document.getElementById("cf-trigger-hint");
|
||||
const typeEl = document.getElementById("cf-opt-type");
|
||||
const pxEl = document.getElementById("cf-trigger-px");
|
||||
if (!hint || !typeEl) return;
|
||||
hint.textContent = triggerHintText(typeEl.value, pxEl && pxEl.value);
|
||||
hint.className = "cond-trigger-hint " + (typeEl.value === "C" ? "is-call" : "is-put");
|
||||
}
|
||||
|
||||
function statusLabel(o) {
|
||||
const st = o.status || "";
|
||||
const reason = o.end_reason || "";
|
||||
@@ -23,6 +45,14 @@
|
||||
return map2[st] || st || "—";
|
||||
}
|
||||
|
||||
function statusClass(o) {
|
||||
const st = o.status || "";
|
||||
if (st === "open") return "st-open";
|
||||
if (st === "triggering") return "st-trig";
|
||||
if (st === "armed") return "st-armed";
|
||||
return "st-done";
|
||||
}
|
||||
|
||||
async function loadCandidates() {
|
||||
const box = document.getElementById("cf-instances");
|
||||
if (!box) return;
|
||||
@@ -46,18 +76,22 @@
|
||||
: "离线"
|
||||
: "可选";
|
||||
return (
|
||||
'<label class="check" title="' +
|
||||
'<label class="cond-inst' +
|
||||
(disabled ? " is-off" : "") +
|
||||
'" title="' +
|
||||
escapeHtml(tip) +
|
||||
'">' +
|
||||
'<input type="checkbox" name="cf-inst" value="' +
|
||||
encodeURIComponent(String(it.id)) +
|
||||
'"' +
|
||||
(disabled ? " disabled" : "") +
|
||||
"> " +
|
||||
">" +
|
||||
'<span class="cond-inst-name">' +
|
||||
escapeHtml(it.name || "") +
|
||||
' <span class="muted">(' +
|
||||
"</span>" +
|
||||
'<span class="cond-inst-tag">' +
|
||||
escapeHtml(tip) +
|
||||
")</span></label>"
|
||||
"</span></label>"
|
||||
);
|
||||
})
|
||||
.join("");
|
||||
@@ -70,16 +104,16 @@
|
||||
const d = await r.json();
|
||||
const list = d.orders || [];
|
||||
if (!list.length) {
|
||||
box.innerHTML = '<span class="muted">暂无条件单</span>';
|
||||
box.innerHTML = '<div class="cond-empty">暂无条件单</div>';
|
||||
return;
|
||||
}
|
||||
box.innerHTML =
|
||||
'<div class="overview-table-wrap"><table class="overview-table"><thead><tr>' +
|
||||
'<div class="overview-table-wrap cond-table-wrap"><table class="overview-table"><thead><tr>' +
|
||||
"<th>客户端</th><th>状态</th><th>标的</th><th>触发</th><th>偏离</th><th>到期h</th><th>出场</th><th>说明</th><th>操作</th>" +
|
||||
"</tr></thead><tbody>" +
|
||||
list
|
||||
.map(function (o) {
|
||||
const side = o.trigger_side === "lte" ? "≤" : "≥";
|
||||
const side = o.trigger_side === "lte" ? "下穿 ≤" : "上穿 ≥";
|
||||
const exit =
|
||||
(o.profit_exit_enabled ? "翻倍×" + (o.profit_exit_mult || "") : "") +
|
||||
(o.target_index != null ? " 目标" + o.target_index : "");
|
||||
@@ -113,9 +147,11 @@
|
||||
"<td>" +
|
||||
escapeHtml(o.instance_name || "") +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
'<td><span class="cond-st ' +
|
||||
statusClass(o) +
|
||||
'">' +
|
||||
escapeHtml(statusLabel(o)) +
|
||||
"</td>" +
|
||||
"</span></td>" +
|
||||
"<td>" +
|
||||
escapeHtml((o.underlying || "") + " " + (o.opt_type || "")) +
|
||||
"</td>" +
|
||||
@@ -131,7 +167,7 @@
|
||||
"<td>" +
|
||||
escapeHtml(exit || "—") +
|
||||
"</td>" +
|
||||
"<td class=\"muted\">" +
|
||||
'<td class="muted">' +
|
||||
escapeHtml(o.message || "") +
|
||||
"</td>" +
|
||||
'<td><div class="overview-actions">' +
|
||||
@@ -202,11 +238,12 @@
|
||||
alert("请选择至少一台可选客户端");
|
||||
return;
|
||||
}
|
||||
const optType = document.getElementById("cf-opt-type").value;
|
||||
const body = {
|
||||
instance_ids: ids,
|
||||
underlying: document.getElementById("cf-underlying").value,
|
||||
opt_type: document.getElementById("cf-opt-type").value,
|
||||
trigger_side: document.getElementById("cf-trigger-side").value,
|
||||
opt_type: optType,
|
||||
trigger_side: leftTriggerSide(optType),
|
||||
trigger_px: document.getElementById("cf-trigger-px").value,
|
||||
deviation_pct: document.getElementById("cf-deviation").value,
|
||||
min_expiry_hours: document.getElementById("cf-expiry-h").value,
|
||||
@@ -235,6 +272,11 @@
|
||||
if (btn) btn.addEventListener("click", refresh);
|
||||
const create = document.getElementById("btn-cond-create");
|
||||
if (create) create.addEventListener("click", createOrder);
|
||||
const typeEl = document.getElementById("cf-opt-type");
|
||||
const pxEl = document.getElementById("cf-trigger-px");
|
||||
if (typeEl) typeEl.addEventListener("change", syncTriggerHint);
|
||||
if (pxEl) pxEl.addEventListener("input", syncTriggerHint);
|
||||
syncTriggerHint();
|
||||
refresh();
|
||||
setInterval(refresh, 10000);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user