Initial standalone crypto_okx with one-click deploy.

Add deploy/manage.sh bootstrap for git.bz121.com/dekun/crypto_okx and point docs at this repo.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-08-13 20:00:59 +08:00
commit a1abe159fa
238 changed files with 69214 additions and 0 deletions
+214
View File
@@ -0,0 +1,214 @@
(function (global) {
var delegated = false;
function queryInScope(scope, id) {
if (scope && scope.querySelector) return scope.querySelector("#" + id);
return document.getElementById(id);
}
function categoriesData() {
return global.ORDER_ENTRY_MODEL_CATEGORIES || [];
}
function codeToCategoryMap() {
return global.ORDER_ENTRY_MODEL_CODE_TO_CATEGORY || {};
}
function tradeStyleForCode(code, modelSel) {
if (modelSel && code) {
var opt = modelSel.querySelector('option[value="' + code.replace(/"/g, '\\"') + '"]');
if (opt) {
var ds = opt.getAttribute("data-trade-style");
if (ds === "swing" || ds === "trend") return ds;
}
}
var map = global.ORDER_ENTRY_MODEL_TRADE_STYLE || {};
return map[code] || "trend";
}
function findOption(catKey, code) {
var cats = categoriesData();
for (var i = 0; i < cats.length; i++) {
if (cats[i].key !== catKey) continue;
var opts = cats[i].options || [];
for (var j = 0; j < opts.length; j++) {
if (opts[j].code === code) return opts[j];
}
}
return null;
}
function filterDomSubOptions(modelSel, catKey, preserveCode) {
var tagged = modelSel.querySelectorAll("option[data-entry-category]");
if (!tagged.length) return false;
var any = false;
for (var i = 0; i < tagged.length; i++) {
var opt = tagged[i];
var show = !!catKey && opt.getAttribute("data-entry-category") === catKey;
opt.hidden = !show;
opt.disabled = !show;
if (show) any = true;
}
modelSel.disabled = !any;
if (!any) {
modelSel.value = "";
return true;
}
var pick = preserveCode || "";
if (pick) {
var picked = modelSel.querySelector('option[value="' + pick.replace(/"/g, '\\"') + '"]:not([disabled])');
if (picked) {
modelSel.value = pick;
return true;
}
}
var visible = [];
for (var k = 0; k < tagged.length; k++) {
if (!tagged[k].disabled) visible.push(tagged[k]);
}
if (visible.length === 1) modelSel.value = visible[0].value;
else modelSel.value = "";
return true;
}
function rebuildFromCategories(modelSel, catKey, preserveCode) {
var cats = categoriesData();
var cat = null;
for (var i = 0; i < cats.length; i++) {
if (cats[i].key === catKey) {
cat = cats[i];
break;
}
}
modelSel.innerHTML = "";
var placeholder = document.createElement("option");
placeholder.value = "";
placeholder.textContent = "类型";
modelSel.appendChild(placeholder);
if (!cat || !cat.options || !cat.options.length) {
modelSel.disabled = true;
modelSel.value = "";
return;
}
modelSel.disabled = false;
var pick = preserveCode || "";
for (var k = 0; k < cat.options.length; k++) {
var o = cat.options[k];
var opt = document.createElement("option");
opt.value = o.code;
opt.textContent = o.label;
if (o.trade_style) opt.setAttribute("data-trade-style", o.trade_style);