From 1642f07dfc2164720278a116ff27cc4a83e7ec12 Mon Sep 17 00:00:00 2001 From: dekun Date: Sun, 17 May 2026 13:26:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=89=8D=E7=AB=AF=E7=9B=88?= =?UTF-8?q?=E4=BA=8F=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crypto_monitor_binance/templates/index.html | 45 +++++++++++++++------ crypto_monitor_gate/templates/index.html | 45 +++++++++++++++------ 2 files changed, 64 insertions(+), 26 deletions(-) diff --git a/crypto_monitor_binance/templates/index.html b/crypto_monitor_binance/templates/index.html index 0398408..891ba65 100644 --- a/crypto_monitor_binance/templates/index.html +++ b/crypto_monitor_binance/templates/index.html @@ -1208,6 +1208,20 @@ function calcClientRr(direction, entry, sl, tp){ if(s >= e || t <= e) return null; return (t - e) / (e - s); } +function calcClientRrFromPct(slPct, tpPct){ + const sl = Number(slPct), tp = Number(tpPct); + if(!Number.isFinite(sl) || !Number.isFinite(tp) || sl <= 0 || tp <= 0) return null; + return tp / sl; +} +function rejectManualOrderRr(rr){ + if(rr !== null && rr >= MANUAL_MIN_PLANNED_RR) return false; + alert(`计划盈亏比 ${rr === null ? '无效' : rr.toFixed(2)}:1 低于最低要求 ${MANUAL_MIN_PLANNED_RR}:1,已阻止人工下单。`); + return true; +} +function allowManualOrderSubmit(form){ + form.dataset.rrOk = "1"; + form.submit(); +} let latestAvailableUsdt = null; const lastPriceMap = {}; @@ -1422,26 +1436,31 @@ if(addOrderForm){ ev.preventDefault(); const direction = (document.getElementById("order-direction")||{}).value || "long"; const mode = (document.getElementById("sltp-mode")||{}).value || "price"; - let sl, tp, entry; + const symbol = ((document.getElementById("order-symbol")||{}).value || "").trim(); if(mode === "pct"){ - alert("百分比模式请确认盈亏比后再提交;建议使用价格模式以便校验。"); + const rr = calcClientRrFromPct( + (document.getElementById("order-sl-pct")||{}).value, + (document.getElementById("order-tp-pct")||{}).value + ); + if(rejectManualOrderRr(rr)) return; + allowManualOrderSubmit(addOrderForm); return; } - sl = Number((document.getElementById("order-sl")||{}).value); - tp = Number((document.getElementById("order-tp")||{}).value); - entry = sl; - fetch(`/api/order_defaults?symbol=${encodeURIComponent((document.getElementById("order-symbol")||{}).value||"")}&direction=${encodeURIComponent(direction)}`) + const sl = Number((document.getElementById("order-sl")||{}).value); + const tp = Number((document.getElementById("order-tp")||{}).value); + let entry = sl; + if(!symbol){ + if(rejectManualOrderRr(calcClientRr(direction, entry, sl, tp))) return; + allowManualOrderSubmit(addOrderForm); + return; + } + fetch(`/api/order_defaults?symbol=${encodeURIComponent(symbol)}&direction=${encodeURIComponent(direction)}`) .then(r=>r.json()) .then(data=>{ const px = data.last_price || data.price; if(px) entry = Number(px); - const rr = calcClientRr(direction, entry, sl, tp); - if(rr === null || rr < MANUAL_MIN_PLANNED_RR){ - alert(`计划盈亏比 ${rr === null ? '无效' : rr.toFixed(2)}:1 低于最低要求 ${MANUAL_MIN_PLANNED_RR}:1,已阻止人工下单。`); - return; - } - addOrderForm.dataset.rrOk = "1"; - addOrderForm.submit(); + if(rejectManualOrderRr(calcClientRr(direction, entry, sl, tp))) return; + allowManualOrderSubmit(addOrderForm); }) .catch(()=>{ alert("无法校验盈亏比,请稍后重试"); }); }); diff --git a/crypto_monitor_gate/templates/index.html b/crypto_monitor_gate/templates/index.html index e901d25..9efccbd 100644 --- a/crypto_monitor_gate/templates/index.html +++ b/crypto_monitor_gate/templates/index.html @@ -1208,6 +1208,20 @@ function calcClientRr(direction, entry, sl, tp){ if(s >= e || t <= e) return null; return (t - e) / (e - s); } +function calcClientRrFromPct(slPct, tpPct){ + const sl = Number(slPct), tp = Number(tpPct); + if(!Number.isFinite(sl) || !Number.isFinite(tp) || sl <= 0 || tp <= 0) return null; + return tp / sl; +} +function rejectManualOrderRr(rr){ + if(rr !== null && rr >= MANUAL_MIN_PLANNED_RR) return false; + alert(`计划盈亏比 ${rr === null ? '无效' : rr.toFixed(2)}:1 低于最低要求 ${MANUAL_MIN_PLANNED_RR}:1,已阻止人工下单。`); + return true; +} +function allowManualOrderSubmit(form){ + form.dataset.rrOk = "1"; + form.submit(); +} let latestAvailableUsdt = null; const lastPriceMap = {}; @@ -1439,26 +1453,31 @@ if(addOrderForm){ ev.preventDefault(); const direction = (document.getElementById("order-direction")||{}).value || "long"; const mode = (document.getElementById("sltp-mode")||{}).value || "price"; - let sl, tp, entry; + const symbol = ((document.getElementById("order-symbol")||{}).value || "").trim(); if(mode === "pct"){ - alert("百分比模式请确认盈亏比后再提交;建议使用价格模式以便校验。"); + const rr = calcClientRrFromPct( + (document.getElementById("order-sl-pct")||{}).value, + (document.getElementById("order-tp-pct")||{}).value + ); + if(rejectManualOrderRr(rr)) return; + allowManualOrderSubmit(addOrderForm); return; } - sl = Number((document.getElementById("order-sl")||{}).value); - tp = Number((document.getElementById("order-tp")||{}).value); - entry = sl; - fetch(`/api/order_defaults?symbol=${encodeURIComponent((document.getElementById("order-symbol")||{}).value||"")}&direction=${encodeURIComponent(direction)}`) + const sl = Number((document.getElementById("order-sl")||{}).value); + const tp = Number((document.getElementById("order-tp")||{}).value); + let entry = sl; + if(!symbol){ + if(rejectManualOrderRr(calcClientRr(direction, entry, sl, tp))) return; + allowManualOrderSubmit(addOrderForm); + return; + } + fetch(`/api/order_defaults?symbol=${encodeURIComponent(symbol)}&direction=${encodeURIComponent(direction)}`) .then(r=>r.json()) .then(data=>{ const px = data.last_price || data.price; if(px) entry = Number(px); - const rr = calcClientRr(direction, entry, sl, tp); - if(rr === null || rr < MANUAL_MIN_PLANNED_RR){ - alert(`计划盈亏比 ${rr === null ? '无效' : rr.toFixed(2)}:1 低于最低要求 ${MANUAL_MIN_PLANNED_RR}:1,已阻止人工下单。`); - return; - } - addOrderForm.dataset.rrOk = "1"; - addOrderForm.submit(); + if(rejectManualOrderRr(calcClientRr(direction, entry, sl, tp))) return; + allowManualOrderSubmit(addOrderForm); }) .catch(()=>{ alert("无法校验盈亏比,请稍后重试"); }); });