Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/chakuuu_okx-ai-trader.json
T

1 line
4.3 KiB
JSON

{"repo": "chakuuu/okx-ai-trader", "files": {"ai-guard.js": {"0970d4fb2c6d0911e3a4cd2e042e1e4322b48590": {"t": 1785745550.4043171, "n": 3501, "h": "43de467f2ec79e59", "c": "import { DEEPSEEK_API_KEY, AI_MODEL, AI_TEMP } from \"./config.js\"\nimport { getCandles } from \"./okx-client.js\"\nimport { calcEMA, calcRSI, calcATR, trendStrength } from \"./indicators.js\"\n\nconst DS_BASE = \"https://api.deepseek.com\"\n\nasync function callDeepSeek(messages) {\n const res = await fetch(`${DS_BASE}/v1/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${DEEPSEEK_API_KEY}`,\n },\n body: JSON.stringify({\n model: AI_MODEL,\n messages,\n temperature: AI_TEMP,\n max_tokens: 300,\n response_format: { type: \"json_object\" },\n }),\n })\n if (!res.ok) throw new Error(`DeepSeek ${res.status}`)\n const data = await res.json()\n return data.choices[0].message.content\n}\n\nconst SYSTEM_PROMPT = `你是一个网格交易风控AI。你的唯一职责:判断当前市场对网格交易是否安全。\n\n## 网格交易原理\n在区间内挂限价单低买高卖。危险情况:\n1. 价格突破网格下限并继续下跌 → 越跌越买,亏损扩大\n2. 价格突破网格上限并继续上涨 → 卖飞了\n3. 波动率突然放大 → 价格可能穿透网格\n\n## 判断标准\n- 15m EMA趋势明确 + 价格接近网格边缘 → 危险\n- 15m 横盘 + 价格在网格中间 → 安全\n- 波动率(ATR)扩大 → 建议加宽网格\n- 波动率(ATR)收缩 → 可以缩窄网格\n\n## 输出 JSON\n{\"safe\": true/false, \"risk\": \"low|medium|high\", \"action\": \"keep|pause|widen|narrow\", \"new_range_pct\": 数字或null, \"reason\": \"简短分析\"}`\n\nfunction buildData(m1, m5, m15, gridLow, gridHigh, currentPrice) {\n const tfInfo = (data, label) => {\n if (!data || data.length < 14) return `## ${label}\\n数据不足`\n const closes = data.map(c => c.close)\n const emaF = calcEMA(closes, 5)\n const emaS = calcEMA(closes, 13)\n const rsiArr = calcRSI(closes, 14)\n const atrArr = calcATR(data, 10)\n const last = arr => arr[arr.length - 1]\n const s = trendStrength(emaF, emaS)\n return `## ${label}\n价格: ${closes[closes.length-1]?.toFixed(4)} | EMA5: ${last(emaF)?.toFixed(4)} EMA13: ${last(emaS)?.toFixed(4)}\n趋势: ${s > 0.003 ? \"强上升\" : s > 0.001 ? \"弱上升\" : s < -0.003 ? \"强下降\" : s < -0.001 ? \"弱下降\" : \"横盘\"}\nRSI: ${last(rsiArr)?.toFixed(1)} | ATR: ${last(atrArr)?.toFixed(6)}`\n }\n\n const posInGrid = ((currentPrice - gridLow) / (gridHigh - gridLow) * 100).toFixed(0)\n\n return `${tfInfo(m1, \"1mK线\")}\n${tfInfo(m5, \"5mK线\")}\n${tfInfo(m15, \"15mK线\")}\n\n## 网格状态\n网格区间: ${gridLow.toFixed(4)} ~ ${gridHigh.toFixed(4)}\n当前价格: ${currentPrice.toFixed(4)} (区间${posInGrid}%位置)\n区间宽度: ${((gridHigh/gridLow - 1)*100).toFixed(1)}%\n\n请给出风控判断(JSON)。`\n}\n\nexport async function aiGuardCheck(symbol, gridLow, gridHigh) {\n if (!DEEPSEEK_API_KEY) return { safe: true, risk: \"low\", action: \"keep\", reason: \"AI未配置\" }\n\n try {\n const [m1, m5, m15] = await Promise.all([\n getCandles(symbol, \"1m\", 30),\n getCandles(symbol, \"5m\", 48),\n getCandles(symbol, \"15m\", 64),\n ])\n const currentPrice = m1[m1.length - 1]?.close || gridHigh\n\n const dataPrompt = buildData(m1, m5, m15, gridLow, gridHigh, currentPrice)\n const messages = [\n { role: \"system\", content: SYSTEM_PROMPT },\n { role: \"user\", content: dataPrompt },\n ]\n const responseText = await callDeepSeek(messages)\n\n const jsonMatch = responseText.match(/\\{[\\s\\S]*\\}/)\n if (!jsonMatch) throw new Error(\"无JSON\")\n const result = JSON.parse(jsonMatch[0])\n\n return {\n safe: result.safe !== false,\n risk: result.risk || \"medium\",\n action: result.action || \"keep\",\n newRangePct: typeof result.new_range_pct === \"number\" ? result.new_range_pct : null,\n reason: result.reason || \"无分析\",\n }\n } catch (e) {\n console.error(` [AI守门] 错误: ${e.message}`)\n return { safe: true, risk: \"low\", action: \"keep\", reason: `AI异常,默认放行: ${e.message}` }\n }\n}\n"}}}}